《ubuntu下x86汇编》AT&T格式—as命令与s后缀文件

时间:2021-12-22 13:19:53

程序转载: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