首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >英飞凌TriCore TC1797组装指令

英飞凌TriCore TC1797组装指令
EN

Stack Overflow用户
提问于 2017-02-03 18:12:46
回答 1查看 1.3K关注 0票数 2

我正在研究TriCore TC1797代码,以及匹配指令集手册TriCore V1.3.1指令集。

我的问题很简单,但是任务编译器生成的程序集代码令我费解。这段代码看起来将永远循环,但它没有,代码工作。这怎么可能呢?

让我们使用这些指令行(这些评论是我对操作的理解):

代码语言:javascript
复制
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总是一个正数(对吗?),它永远不会是零,怎么可能循环退出呢?

谢谢您的澄清,我在手册中重读了这篇文章,但找不到解释。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-02-03 23:21:23

代码语言:javascript
复制
ADD    d15, d15, #-0x10     ; d15 = 4 - 0x10 = 0xFFFFFFF4
EXTR   d9, d15, #0, #16     ; d9 = 0x0000FFF4

这是个错误。EXTR符号扩展了提取的位字段。引用手册

EXTR指令通过符号扩展提取的位字段(复制位字段中最重要的位)来填充结果中最重要的位。

因此,d9实际上是0xFFFFFFF4JGE使用有符号比较,因此正确地将其视为-12并终止循环。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42030503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档