2017-02-03 2 views
1

Я смотрю код 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 всегда положительное число (правильно?), Который никогда не будет быть нулевым, как это возможно, что цикл выходит?

Благодарим вас за разъяснение, я перечитаю это в руководстве, но не могу найти объяснения этой ситуации.

+0

Обычно у вас есть условные переходы для как подписанных, так и неподписанных сравнений. Есть что-то вроде инструкций 'ja'? – fuz

+0

Так как существует 'JGE.U' для неподписанных, явно' JGE' подписан. Следовательно, он будет рассматриваться как подписанный, но положительный, так как ваш 'd9' был замаскирован до' 0x0000FFF4'. Таким образом, не имеет значения, используете ли вы сравнение со знаком или без знака. – Jester

+0

fuz: это определенно инструкция JGE (и не JGE.U), поэтому она сопоставлена ​​с сопоставлением – EmbeddedGuy

ответ

2
ADD d15, d15, #-0x10  ; d15 = 4 - 0x10 = 0xFFFFFFF4 
EXTR d9, d15, #0, #16  ; d9 = 0x0000FFF4 

Это ошибка. Знак EXTR расширяет извлеченное битовое поле. Чтобы процитировать manual:

Инструкция EXTR заполняет наиболее значимые биты результата от входа расширения битового поля (извлеченное дублируя наиболее значимый бит битового поля).

Таким образом, d9 на самом деле 0xFFFFFFF4. JGE использует подписанное сравнение, поэтому его правильно обрабатывают как -12 и завершают цикл.

+0

Спасибо !!! Я поддержал этот правильный ответ, но он будет показан только после того, как моя репутация будет выше 15. – EmbeddedGuy

 Смежные вопросы

  • Нет связанных вопросов^_^