【发布时间】:2017-02-03 18:12:46
【问题描述】:
我正在查看 TriCore TC1797 代码,以及匹配指令集手册 TriCore V1.3.1 指令集。
我的问题是微不足道的,但任务编译器生成的汇编代码让我感到困惑。代码看起来会永远循环,但事实并非如此,代码有效。怎么可能?
让我们来看看这些指令(cmets是我对操作的理解):
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的指令吗? -
由于有一个
JGE.U表示未签名,显然JGE已签名。因此,它将被视为已签名,但由于您的d9已被屏蔽为0x0000FFF4,因此它是肯定的。因此,使用有符号或无符号比较并不重要。 -
fuz:这绝对是JGE(而不是JGE.U)指令,所以是有符号比较
-
Jester:我理解正确吗:它会跳转到 jumping_addr 吗? (并且您在指示后批准了我的 cmets?)
-
实际上问题是当你说
d9 = 0x0000FFF4时我们信任你。那是错误的。EXTR符号扩展了提取的位域,所以d9实际上是0xFFFFFFF4,这是负数,由JGE处理。
标签: assembly