小编Sam*_*Sam的帖子

当我在禁用优化的情况下进行编译时,为什么clang不使用内存目标x86指令?它们有效吗?

我编写了这个简单的汇编代码,运行它并使用GDB查看内存位置:

    .text

.global _main

_main:
    pushq   %rbp
    movl    $5, -4(%rbp)
    addl    $6, -4(%rbp)
    popq    %rbp
    ret
Run Code Online (Sandbox Code Playgroud)

它直接在内存中添加5到6个,根据GDB它可以工作.所以这是直接在内存中执行数学运算而不是CPU寄存器.

现在在C中编写相同的东西并将其编译为汇编,结果如下:

...  # clang output
    xorl    %eax, %eax
    movl    $0, -4(%rbp)
    movl    $5, -8(%rbp)
    movl    -8(%rbp), %ecx   # load a
    addl    $6, %ecx         # a += 6
    movl    %ecx, -8(%rbp)   # store a
....
Run Code Online (Sandbox Code Playgroud)

在将它们添加到一起之前,它会将它们移动到寄存器中.

那么为什么我们不直接在内存中添加?

它慢了吗?如果是这样,为什么直接在内存中添加甚至允许,为什么汇编程序在开始时没有抱怨我的汇编代码?

编辑:这是第二个程序集块的C代码,我在编译时禁用了优化.

#include <iostream>

int main(){
 int a = 5;
 a+=6; 
 return 0;
}
Run Code Online (Sandbox Code Playgroud)

c assembly gcc clang compiler-optimization

19
推荐指数
1
解决办法
1214
查看次数

标签 统计

assembly ×1

c ×1

clang ×1

compiler-optimization ×1

gcc ×1