1/5/2020 C与汇编语言_菜鸟进阶之路-CSDN博客
https://blog.csdn.net/qq_31865983/article/details/91453963#2、 调用栈 3/15
参考:__asm__ volatile 之 C语言嵌入式汇编
《汇编语言程序设计》
五、GDB反汇编
可通过 gcc -S test.c -o test.s 或者objdump -S test.o > test.s查看生成的汇编代码,但是同源代码的对应关系不够直观而且有很多无关的
汇编代码,最理想的是通过gdb反汇编命令disassemble查看每行源代码对应的汇编代码,也可通过ni/si命令单步调试汇编指令,查看执行汇编
时寄存器和堆栈的状态。
1、x86_64通用寄存器
X86-64中,所有寄存器都是64位,相对32位的x86来说,标识符变了,比如从原来的ebp变成了rbp,eax变成了rax。为了向后兼容性,
ebp依然可以使用,不过指向了rbp的低32位,即汇编代码中保存到ebp实际是保存到rbp的低32位中。除此之外,新增加寄存器r8到r15,加
上x86的原有8个,一共16个通用寄存器,具体用途如下:
%rax 通常用于存储函数调用的返回结果,同时也用于乘法和除法指令中。
%rsp 是堆栈指针寄存器,通常会指向栈顶位置
%rbp 是栈帧指针寄存器,用于标识当前栈帧的起始位置
%rdi,%rsi,%rdx,%rcx,%r8,%r9 用来传递函数参数,依次对应第1参数,第2参数至第6参数
%rbx,%r12,%r13,%14,%15 ,%r10,%r11 用作数据存储,属于通用性更为广泛的寄存器,编译器或汇编程序可以根据需要存储
任何数据。
2、 调用栈
#include <stdio.h>
int main()
{
int result = 0;
int input = 1;
int a = 1;
int b = 2;
asm volatile (
"movl %1, %0\n"
: "=r"(result)
: "r"(input)
);
printf("result = %d\n", result);
printf("input = %d\n", input);
asm volatile (
"movl %%eax, %%ecx;"
"movl %%ebx, %%eax\n"
"movl %%ecx, %%ebx;"
: "=a"(a), "=b"(b)
: "a"(4), "b"(5)
);
printf("a = %d\n", a);
printf("b = %d\n", b);
return 0;
}