程序轉載: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 //顯示所有寄存器的值
四、內聯彙編1.源碼
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