Assembly 英飞凌TriCore TC1797组装说明JGE
我正在查看TriCore TC1797代码,以及与之匹配的指令集manual TriCore V1.3.1指令集 我的问题很简单,但编译器生成的汇编代码却让我感到困惑。代码看起来会永远循环,但事实并非如此,代码可以正常工作。怎么可能呢 让我们看一下这些指令行(注释是我对操作的理解): 我不明白的是,既然d9总是一个正数(对吗?),它永远不会是零,那么循环怎么可能存在呢 感谢您的澄清,我在手册中重新阅读了这一点,但无法找到这种情况的解释Assembly 英飞凌TriCore TC1797组装说明JGE,assembly,Assembly,我正在查看TriCore TC1797代码,以及与之匹配的指令集manual TriCore V1.3.1指令集 我的问题很简单,但编译器生成的汇编代码却让我感到困惑。代码看起来会永远循环,但事实并非如此,代码可以正常工作。怎么可能呢 让我们看一下这些指令行(注释是我对操作的理解): 我不明白的是,既然d9总是一个正数(对吗?),它永远不会是零,那么循环怎么可能存在呢 感谢您的澄清,我在手册中重新阅读了这一点,但无法找到这种情况的解释 ADD d15, d15, #-0x10 ;
ADD d15, d15, #-0x10 ; d15 = 4 - 0x10 = 0xFFFFFFF4
EXTR d9, d15, #0, #16 ; d9 = 0x0000FFF4
这是个错误EXTR
sign扩展提取的位字段。引述:
EXTR指令通过以下方式填充结果的最高有效位:
扩展提取的位字段的符号(复制
位字段的最高有效位)
因此,
d9
实际上是0xfffff4
JGE
使用有符号比较,因此它被正确地视为-12
,并终止循环。通常,有符号和无符号比较都有条件跳转。是否有类似于ja
指令的内容?因为对于未签名的文件有JGE.U
,显然JGE
是有签名的。因此,它将被视为有符号的,但为正值,因为您的d9
已被屏蔽为0x0000FFF4
。因此,使用有符号或无符号比较并不重要。fuz:这肯定是JGE(而不是JGE.U)指令,所以它是有符号比较Jester:我理解正确吗:它将跳转到jumping\U addr?(你在说明后批准了我的评论吗?)事实上,问题是当你说d9=0x0000FFF4
时,我们信任你。那是错误的EXTR
符号扩展了提取的位字段,因此d9
实际上是0xFFFFFFF4
,这是负数,由JGE
处理。谢谢!!!我对这个正确答案投了更高的票,但只有在我的声誉超过15后,它才会显示出来。
ADD d15, d15, #-0x10 ; d15 = 4 - 0x10 = 0xFFFFFFF4
EXTR d9, d15, #0, #16 ; d9 = 0x0000FFF4