以下小型C代码包含swap
调用的main
函数。
令人惊讶的是,当我检查编译器生成的汇编代码时,我意识到,不知何故,编译器理解我的意图(实现代码的结果),然后尝试实现正确的结果没有进入swap
功能(可能的原因是'在优化名称中#39;)。汇编代码甚至不使用变量;它只打印3和5;然后是5和3。
然而,我的真正目的是检查程序集并理解参数如何从一个函数传递到另一个函数(我试图学习汇编)。我试图在没有优化的情况下进行编译(删除-O3
指令)并且它工作正常,但这次汇编代码从28行爆炸到54行。
我的问题:是否有一个gcc编译器指令强制编译器以我想要检查的方式创建汇编代码(即。参数被推入堆栈并以这种方式传递给函数)?
这是代码的compiler explorer link。
这是main.c
#include <stdio.h>
#include <stdlib.h>
void swap(int *a, int *b) {
int t = *a;
*a = *b;
*b = t;
}
int main(int argc, char **argv) {
int x = 3, y = 5;
printf("(1) => x = %d y = %d\n\n", x, y);
swap(&x, &y);
printf("(2) => x = %d y = %d\n\n", x, y);
return (0);
}
这是编译器创建的程序集:
swap(int*, int*):
movl (%rdi), %eax # *a_2(D), t
movl (%rsi), %edx # *b_4(D), D.3500
movl %edx, (%rdi) # D.3500, *a_2(D)
movl %eax, (%rsi) # t, *b_4(D)
ret
.LC0:
.string "(1) => x = %d y = %d\n\n"
.LC1:
.string "(2) => x = %d y = %d\n\n"
main:
subq $8, %rsp #,
movl $5, %ecx #,
movl $3, %edx #,
movl $.LC0, %esi #,
movl $1, %edi #,
xorl %eax, %eax #
call __printf_chk #
movl $3, %ecx #,
movl $5, %edx #,
movl $.LC1, %esi #,
movl $1, %edi #,
xorl %eax, %eax #
call __printf_chk #
xorl %eax, %eax #
addq $8, %rsp #,
ret