簡體   English   中英

英飛凌TriCore TC1797組裝說明JGE

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM