我想了解一些装配.
汇编如下,我对该testl行感兴趣:
000319df 8b4508 movl 0x08(%ebp), %eax
000319e2 8b4004 movl 0x04(%eax), %eax
000319e5 85c0 testl %eax, %eax
000319e7 7407 je 0x000319f0
Run Code Online (Sandbox Code Playgroud)
我想了解的那点testl之间的%eax和%eax?我认为这段代码的具体内容并不重要,我只是试图用自己来理解测试 - 这种价值总是不正确吗?
使用以下代码是否存在任何执行速度差异:
cmp al, 0
je done
Run Code Online (Sandbox Code Playgroud)
以下内容:
or al, al
jz done
Run Code Online (Sandbox Code Playgroud)
我知道JE和JZ指令是相同的,并且使用OR可以提供一个字节的大小改进.但是,我也关心代码速度.逻辑运算符似乎比SUB或CMP更快,但我只是想确定.这可能是规模和速度之间的权衡,或双赢(当然代码将更加不透明).
逻辑 NOT 运算符!在 c 中实际上是如何工作的?它如何将所有非零int变为 0,反之亦然?
例如:
#include <stdio.h>
void main() {
if(!(-76))
printf("I won't print anything");
if(!(2))
printf("I will also not print anything");
}
Run Code Online (Sandbox Code Playgroud)
不打印任何内容,这可能意味着-76并被2变成零......
所以,我尝试了这个:
#include <stdio.h>
void main() {
int x = !4;
printf("%d", x);
}
Run Code Online (Sandbox Code Playgroud)
确实打印了0
现在我不明白怎么回事,是将所有位翻转为 0 还是什么?