Я смотрю код TriCore TC1797 и руководство по набору инструкций TriCore V1.3.1. Набор инструкций.Инструкция по сборке Infineon TriCore TC1797 JGE
Мой вопрос тривиален, но скомпилированный код сборки, созданный Tasking, меня озадачивает. Код выглядит так, будто он будет работать навсегда, но это не так, код работает. Как это возможно?
Давайте эти строки команд (комментарии моего понимание работы):
MOVH.A a12, #@HIS(VAR_ADDRESS)
LEA a12, [a12]@LOS(VAR_ADDRESS)
LD.H d15, [a12]0 ; d15 = 4 (half-word) passed to this function
; values passed are either 0x04 or 0x10 or 0xA8
loop_addr:
ADD d15, d15, #-0x10 ; d15 = 4 - 0x10 = 0xFFFFFFF4
EXTR d9, d15, #0, #16 ; d9 = 0x0000FFF4
; edit: THIS IS MY MISTAKE
; correct is d9 = 0xFFFFFFF4
...
other code here, never touching d9
...
ST.H [a12], d9 ; store decremented value back
JGE d9, #1, loop_addr ; ???? comparing 0x0000FFF4 to 1
; will it loop forever?
То, что я не понимаю, так как d9 всегда положительное число (правильно?), Который никогда не будет быть нулевым, как это возможно, что цикл выходит?
Благодарим вас за разъяснение, я перечитаю это в руководстве, но не могу найти объяснения этой ситуации.
Обычно у вас есть условные переходы для как подписанных, так и неподписанных сравнений. Есть что-то вроде инструкций 'ja'? – fuz
Так как существует 'JGE.U' для неподписанных, явно' JGE' подписан. Следовательно, он будет рассматриваться как подписанный, но положительный, так как ваш 'd9' был замаскирован до' 0x0000FFF4'. Таким образом, не имеет значения, используете ли вы сравнение со знаком или без знака. – Jester
fuz: это определенно инструкция JGE (и не JGE.U), поэтому она сопоставлена с сопоставлением – EmbeddedGuy