我正在读一本书,作者说这if( a < 901 )比书更快if( a <= 900 ).
与此简单示例不完全相同,但循环复杂代码略有性能变化.我想这必须对生成的机器代码做一些事情,以防它甚至是真的.
你能否告诉我JUMP如果上面和JUMP如果大会用汇编语言?我什么时候使用它们?他们给我不同的结果吗?
使用AT&T汇编语法,我试图了解如何testl在汇编代码中使用.特别:
testl %edx, %edx
jle .L3
Run Code Online (Sandbox Code Playgroud)
我知道设置条件标志testl的位数and是否相同,但如果不比较两个值,我怎么能解释'如果小于或等于'则跳转?
C语言有签名和无符号类型,如char和int.我不确定,它是如何在汇编级别实现的,例如在我看来,有符号和无符号的乘法会带来不同的结果,因此汇编执行无符号和有符号算术或仅执行一次,这在某种程度上是模拟的不同的情况?
所以每个在线资源都告诉我这样的事情:
cmp %eax, %ebx
jg < something >
Run Code Online (Sandbox Code Playgroud)
如果 eax 大于 ebx,将跳转到 < something >。但我有另一段似乎与此矛盾的代码:
cmp $0x2, %eax
jg < something>
Run Code Online (Sandbox Code Playgroud)
当 eax 的值为 3 时,它会跳转到 < something >。
我是否遗漏了什么,或者如果 b > a 而不是 a>b,cmp a, b - jg 是否执行?这是否也适用于其他跳转语句?
我正在为一个学校项目工作,我JL在at&t语法中找不到任何含义。供参考,问题是找到运行%eax时的值NOP。这是它使用的代码:
MOV $492,%ebx
MOV $2494,%eax
MOV $28063,%ecx
CMP %eax,%ebx
JL L1
JMP L2
L1:
IMUL %eax,%ebx
ADD %eax,%ebx
MOV %ebx,%eax
SUB %ecx,%eax
JMP L3
L2:
IMUL %eax,%ebx
SUB %eax,%ebx
MOV %ebx,%eax
ADD %ecx,%eax
L3:
NOP
Run Code Online (Sandbox Code Playgroud)
另外,我还要感谢JMP加法/减法/乘法的工作方式(ADD/ SUB/ IMUL)。我不想作弊,我只是想了解发生了什么。例如,您在使用数学时会更改第一个数字还是第二个数字?非常感谢大家的帮助。
这个问题是关于奇偶校验标志的。我无法弄清楚 JP 和 JPE 或 JNP 和 JPO 之间的区别。它只是每个名称的另一个名称还是确实有一些区别?
你能告诉我x86汇编中ja(如果高于则跳转)和jnbe(如果不低于或等于则跳转)指令之间的区别吗?我什么时候使用它们?他们给我不同的结果吗?