[英]Infineon TriCore TC1797 assembly instruction JGE
我正在查看TriCore TC1797代碼,並與指令集手冊TriCore V1.3.1指令集匹配。
我的問題很瑣碎,但是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始終是一個正數(對嗎?),它永遠不會是零,因此循環退出的可能性如何?
感謝您的澄清,我在手冊中重新閱讀了此內容,但找不到這種情況的解釋。
ADD d15, d15, #-0x10 ; d15 = 4 - 0x10 = 0xFFFFFFF4
EXTR d9, d15, #0, #16 ; d9 = 0x0000FFF4
這是錯誤。 EXTR
符號擴展提取的位域。 引用手冊 :
EXTR指令通過對所提取的位字段進行符號擴展來填充結果的最高有效位(復制該位字段的最高有效位)。
因此d9
實際上是0xFFFFFFF4
。 JGE
使用帶符號的比較,因此可以正確地視為-12
並終止循環。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.