《ubuntu下x86彙編》AT&T格式—as命令與s後綴文件

程序轉載: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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章