我正在研究TriCore TC1797代码,以及匹配指令集手册TriCore V1.3.1指令集。
我的问题很简单,但是任务编译器生成的程序集代码令我费解。这段代码看起来将永远循环,但它没有,代码工作。这怎么可能呢?
让我们使用这些指令行(这些评论是我对操作的理解):
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总是一个正数(对吗?),它永远不会是零,怎么可能循环退出呢?
谢谢您的澄清,我在手册中重读了这篇文章,但找不到解释。
发布于 2017-02-03 23:21:23
ADD d15, d15, #-0x10 ; d15 = 4 - 0x10 = 0xFFFFFFF4
EXTR d9, d15, #0, #16 ; d9 = 0x0000FFF4这是个错误。EXTR符号扩展了提取的位字段。引用手册
EXTR指令通过符号扩展提取的位字段(复制位字段中最重要的位)来填充结果中最重要的位。
因此,d9实际上是0xFFFFFFF4。JGE使用有符号比较,因此正确地将其视为-12并终止循环。
https://stackoverflow.com/questions/42030503
复制相似问题