【问题标题】:Infineon TriCore TC1797 assembly instruction JGE英飞凌 TriCore TC1797 汇编指令 JGE
【发布时间】: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


【解决方案1】:
ADD    d15, d15, #-0x10     ; d15 = 4 - 0x10 = 0xFFFFFFF4
EXTR   d9, d15, #0, #16     ; d9 = 0x0000FFF4

这是错误的。 EXTR 符号扩展提取的位域。引用manual

EXTR 指令将结果的最高有效位填充为 符号扩展提取的位字段(复制 位域的最高有效位)。

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

【讨论】:

  • 谢谢!!!我赞成这个正确答案,但只有在我的声誉超过 15 分后才会显示。
猜你喜欢
  • 1970-01-01
  • 2021-12-15
  • 2018-12-31
  • 2022-09-26
  • 1970-01-01
  • 2012-02-27
  • 2011-11-22
  • 2016-04-21
  • 1970-01-01
相关资源
最近更新 更多