相关疑难解决方法(0)

`testl` eax对抗eax?

我想了解一些装配.

汇编如下,我对该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?我认为这段代码的具体内容并不重要,我只是试图用自己来理解测试 - 这种价值总是不正确吗?

x86 assembly instructions

114
推荐指数
5
解决办法
8万
查看次数

使用CMP reg测试寄存器是否为零,0与OR reg,reg?

使用以下代码是否存在任何执行速度差异:

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更快,但我只是想确定.这可能是规模和速度之间的权衡,或双赢(当然代码将更加不透明).

optimization x86 assembly micro-optimization

13
推荐指数
2
解决办法
3755
查看次数

逻辑非运算符在c中如何工作?

逻辑 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 还是什么?

c logical-operators

0
推荐指数
1
解决办法
504
查看次数