我试着去理解汇编是为了能够解决一个难题。但我遇到了以下指示:

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

07-24 09:22