程序转载:http://blog.csdn.net/high_high/article/details/7184668
gdb调试以及应用分析原创,注意在ubuntu11.10、64位机;验证通过。
一、c调用汇编
vi addone.asm
global addone ;
addone: MOV RAX, [RSP + 20] ; stack top + 20 bytes
ADD RAX, 1
RET
vi calladdone.c
#include <stdio.h>
int main(){
int a = 3;
printf("before call, a is %d.\n", a);
a = addone(a);
printf("after call, a is %d.\n", a);
return 0;
}
二、编译
nasm -gstabs -felf64 addone.asmgcc -g -c calladdone.c
gcc -g -o call calladdone.o addone.o
三、运行
gdb call
list
b 4
r
s
i r //显示所有寄存器的值,info register
bt //查看堆栈信息,backtrace
x 0x[ip寄存器存储了执行接口的地址] //查看程序寄存器指向内存地址的内容
f //frame,栈中内容
info f //显示栈内详细内容
disassemble main //显示main函数的汇编代码