程序转载:http://hi.baidu.com/guzhou_diaoke/item/3955734c29ea93e4a5c066cf
gdb调试以及应用分析原创,注意在ubuntu11.10、64位机;验证通过。
nasm编译asm后缀汇编:《ubuntu下x86汇编》之nasm命令与asm后缀文件
一、纯汇编
1.源文件
vi hello.s
# # 汇编语言写的 hello word # .code32 .data msg: .ascii"Hello word!\n" len=.-msg .text #.global_start _start: movl $len, %edx # 显示字符数 movl $msg, %ecx # 缓冲区指针 movl $1, %ebx # 文件描述符 movl $4, %eax # 系统调用号 int $0x80 # 系统调用 movl $0, %ebx movl $1, %eax # 系统调用号,_exit 系统调用号是1,ebx 是传给_exit 的参数 int $0x80 # 系统调用
2.编译链接
as -gstabs -o hello.o hello.s
ld -g -o hello hello.o
3.执行
gdb hello
list
b 1
r
s
i r //显示所有寄存器的值,info register
bt //查看堆栈信息,backtrace
x 0x[ip寄存器存储了执行接口的地址] //查看程序寄存器指向内存地址的内容
f //frame,栈中内容
info f //显示栈内详细内容
disassemble main //显示main函数的汇编代码
二、汇编调用c
1.源文件
vi foo.s
.code32 num1 = 0x1 num2 = 0x4 .text .global _start _start: pushl $num1 pushl $num2 call addition add $0x08, %esp movl $0x0, %ebx movl $0x1, %eax #sys_exit int $0x80
vi add.c
#include <string.h> int addition( int a, int b ) { int c = a + b; c = c + 48; char x[10]; x[0] = c; x[1] = '\n'; //mywrite(1, x, 2); return 0; }2、编译链接
as -gstabs -o foo.o foo.s
gcc -g -c -fno-stack-protector add.c //禁用堆栈保护
ld -g -o add add.o foo.o
//gcc -g -o add add.o foo.o
3、执行
gdb add
list
b 1
r
s
i r //显示所有寄存器的值
三、c调用汇编
1.源码
vi caller.c
#include <string.h> int main() { char* mystr = "Welcome to baby OS!\n"; // 崇拜于渊,发宏愿将来也写个小小的OS玩,先占个名就叫Baby OS了,呵呵。 mywrite(1, mystr, strlen(mystr)); return 0; }
vi callee.s
.code32 SYSWRITE = 4 # sys_write()系统调用号 .global mywrite .text mywrite: pushl %ebp movl %esp, %ebp pushl %ebx movl 8(%ebp),%ebx # ebx :文件描述符 movl 12(%ebp),%ecx # ecx :缓冲区指针 movl 16(%ebp),%edx # edx :显示字符数 movl $SYSWRITE,%eax # eax :系统调用号 int $0x80 popl %ebx mov %ebp, %esp popl %ebp ret
2.编译链接
as -gstabs -o callee.o callee.s
gcc -g -c -fno-stack-protector caller.c //禁用堆栈保护
gcc -g -o caller caller.o callee.o
//ld -g -o caller caller.o callee.o
3、执行
gdb add
list
b 1
r
s
i r //显示所有寄存器的值
四、内联汇编int main() { int a = 10, b = 0; __asm__ __volatile__("movl %1, %%eax;//n//r" "movl %%eax, %0;" :"=r"(b) /* 输出 */ :"r"(a) /* 输入 */ :"%eax"); /* 不受影响的寄存器 */ printf("Result: %d, %d//n", a, b); }2.编译
gcc -g -o inline inline.c
五、反汇编
objdump -d call