通用寄存器
EAX累加(函数默认使用这个寄存器作为返回值)
EBX基地址
ECX计数
EDX数据
EBP堆栈
ESI变址
EDI
ESP堆栈顶指针
段寄存器
CS代码段
DS数据段
ED附加段
SS堆栈段
FS附加段
GS附加段
常见的汇编指令
Memory instruction: MOV\PUSH\POP\ETC
sub(减) add(加)
其中后面添加b8位\w16位\l32位\q64位
举例
movl %eax ,%edx将eax的内容放到edx中,相当于edx=eax;
movl
0x653,
立即寻址
movl 0x352 ,%edx edx=(int32_t)0x123;直接寻址
movl (%ebx) ,%edx edx=(int32_t)ebx;间接寻址
movl 4(%ebx),%edx edx=(int32_t)(ebx+4);变址寻址
pushl %eax将eax压到栈顶(栈实际上是倒着的,所以压入一个值,地址减小一个单位)
popl %eax取栈顶
call 0x12565比较特别,相当于pushl
eip(∗)movl
0x12565,%eip(*),eip是cpu指令指针,相当于在当前指令前插入一个指令0x12565
ret popl %eip(*)
以上两个函数相当于一次函数调用,中间跳转执行另一个函数,然后返回回来
一段代码汇编对比
int g(int x)
{
return x*2+3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8)+1;
}
@ args = 0, pretend= 0, frame = 8
@ frame_needed = 1, uses_anonymous_args= 0
stmfd sp!, {fp, lr}
add fp, sp, #4
sub sp, sp, #8
str r0, [fp, #-8]
ldr r0, [fp, #-8]
bl g
mov r3, r0
mov r0, r3
sub sp, fp, #4
ldmfd sp!, {fp, pc}
.size f, .-f
.align 2
.global main
.type main, %function
main:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 1, uses_anonymous_args= 0
stmfd sp!, {fp, lr}
add fp, sp, #4
mov r0, #8
bl f
mov r3, r0
add r3, r3, #1
mov r0, r3
ldmfd sp!, {fp, pc}
.size main, .-main
.ident “GCC: (Debian 4.6.3-14+rpi1) 4.6.3”
.section .note.GNU-stack,”“,%progbits