【发布时间】:2020-07-18 01:31:16
【问题描述】:
我已经将下面的 c 程序编译到 asm 中,看看它使用了哪些指令。我在 C 中拥有的是:
int add(int num1, int num2) {
int num3 = num1 + num2;
return num3;
}
我对指令“应该是”的想法(根据我对 asm 的非常有限的了解)是:
- 加载(两个 4 字节 int 变量到内存中)。
- 添加(两个内存位置),然后 -
- 将总和存储在第三个内存位置。
- 返回值并停止执行。
编译时,我对它所做的所有mov 操作感到惊讶:
add:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-20], edi
mov DWORD PTR [rbp-24], esi
mov edx, DWORD PTR [rbp-20]
mov eax, DWORD PTR [rbp-24]
add eax, edx
mov DWORD PTR [rbp-4], eax
mov eax, DWORD PTR [rbp-4]
pop rbp
ret
有人可以带我浏览一下这里的 asm 代码并指出为什么它如此频繁地使用 mov 代码吗?这是一个例子:here。
【问题讨论】:
-
你是否使用了任何编译器标志,例如
-O3 -
@Ackdari 不据我所知,但我使用 Godbolt 编译它,所以它可能会在其中抛出一些标志(您可以查看上面的链接)。
-
如果您转到标有“编译器选项”的框并输入
-O3,您会看到生成的代码更改为lea eax, [rdi+rsi]。 -
asm 视图上方是编译器标志的文本字段,如果您在其中输入
-O3(即所有优化),asm 代码变得更加简约。