我试着去理解汇编是为了能够解决一个难题。但我遇到了以下指示:
0x0000000000401136 <+44>: cmpl $0x7,0x14(%rsp)
0x000000000040113b <+49>: ja 0x401230 <phase_3+294>
我认为它所做的是:
0x14的值(rsp)为-7380。根据我的理解,cmpl比较unsigned。同时执行跳跃。
那么(无符号)-7380>7
(无符号)7380>7-->跳转
我真的不想它跳起来。但这是不是正确的解释?我是不是在反驳?
如果你对如何操纵这个跳跃有什么建议的话!
最佳答案
根据我的理解cmpl
比较无符号。
在某种程度上,两者都有。
有符号和无符号的区别在于这里跳转指令的用法。
对于>
,有ja
表示无符号,有jg
表示有符号(如果高于则跳转,如果大于则跳转)。
对于<
,有jb
表示无符号,有jl
表示有符号(如果低于则跳转,如果低于则跳转)。
准确地说,下面是几个跳转命令的含义:
对于无符号比较:
JB/JNAE (CF = 1) : Jump if below/not above or equal
JAE/JNB (CF = 0) : Jump if above or equal/not below
JBE/JNA (CF = 1 or ZF = 1) : Jump if below or equal/not above
JA/JNBE (CF = 0 and ZF = 0): Jump if above/not below or equal
对于签名比较:
JL/JNGE (SF <> OF) : Jump if less/not greater or equal
JGE/JNL (SF = OF) : Jump if greater or equal/not less
JLE/JNG (ZF = 1 or SF <> OF): Jump if less or equal/not greater
JG/JNLE (ZF = 0 and SF = OF): Jump if greater/not less or equal