我正在尝试理解汇编,以便能够解决难题。然而,我遇到了以下说明:
0x0000000000401136 <+44>: cmpl $0x7,0x14(%rsp)
0x000000000040113b <+49>: ja 0x401230 <phase_3+294>
我认为它的作用是:0x14(%rsp)
的值是-7380。根据我的理解,cmpl
比较无符号。还执行了跳转。
那么它可能是(unsigned)-7380 > 7
-->跳转吗
实际上我不想让它跳起来。但这是不是正确的解释呢?我是在反驳吗?
另外,如果你有任何关于如何操作这个跳跃的建议!
发布于 2014-06-09 19:00:10
根据我的理解,
与
cmpl
比较无符号。
在某种程度上,它同时做到了这两点。
有符号和无符号的区别在于跳转指令的使用。
对于>
,无符号为ja
,有符号为jg
(如果高于则跳转,如果大于则跳转)。
对于<
,jb
表示未签名,jl
表示已签名(如果在下面,则跳转;如果小于,则跳转)。
准确地说,以下是几个跳转命令的含义:
用于无符号比较的
:
JB/JNAE (CF = 1):低于/不高于或等于JAE/JNB (CF = 0)时跳转:高于或等于/不低于JBE/JNA (CF =1或ZF = 1)时跳转:低于或等于/不高于JA/JNBE (CF =0和ZF =0)时跳转:高于/不低于或等于时跳转
对于带符号的比较:
JL/JNG (SF <> OF):小于/不大于或等于JGE时跳转/JNL (SF = OF):大于或等于/不小于JLE/JNG (ZF =1或SF <> OF)时跳转:小于或等于/不大于JG/JNLE (ZF =0和SF = OF)时跳转:大于/不小于或等于时跳转
发布于 2021-01-21 17:32:14
为了说明这一点,@glglgl给出了一个很好的答案:"cmpl“中的"l”是一个operation suffix,表示正在对一个长数(32位整数或64位浮点数)进行操作。
发布于 2014-06-09 19:13:27
我不认为x86实际上有一个叫做CMPL
的指令。这可能是你的汇编器语法的一部分,给出关于操作数的提示或其他东西(比如JZ
和JE
是一样的)。
从英特尔手册中了解到它正在做什么:
比较第一个源操作数和第二个源操作数,并根据结果设置EFLAGS寄存器中的状态标志。通过从第一操作数中减去第二操作数,然后以与SUB指令相同的方式设置状态标志来执行比较。当立即值用作操作数时,它被符号扩展到第一个操作数的长度。
符号是隐式给出的,因为两个数字的补码表示法。
如何操作跳跃?如果您确定跳转应该做与它正在做的事情完全相反的事情,那么您只需将JA
更改为JBE
。
https://stackoverflow.com/questions/24118562
复制相似问题