基本汇编指令详解
常见寄存器
寄存器 | 16位 | 32位 | 64位 |
---|---|---|---|
累加寄存器 | AX | EAX | RAX |
基址寄存器 | BX | EBX | RBX |
计数寄存器 | CX | ECX | RCX |
数据寄存器 | DX | EDX | RDX |
堆栈基指针 | BP | EBP | RBP |
变址寄存器 | SI | ESI | RSI |
堆栈顶指针 | SP | ESP | RSP |
指令寄存器 | IP | EIP | RIP |
汇编指令mov
movb(8位),movw(16位),movl(32位),movq(64位)
寄存器寻址:movl %eax,%edx eax->edx
立即数寻址 movl $0x123,%edx 数字到寄存器
直接寻址 movl 0x123,%edx 直接访问内存地址数据,edx=*(int32_t*)0x123;
间接寻址 movl(%ebx),%edx %ebx是个内存地址,(%ebx)指的是该地址中的数据,edx=*(int32_t*)ebx;
变地址寻址 movl 4(%ebx),%edx edx=*(int32_t*)(ebx+4);
push pop
函数调用
//建立被调用者函数的堆栈框架
pushl %ebp
movl %esp, %ebp
//拆除框架
movl %ebp, %esp
popl %ebp
ret
push %eax 相当于
subl $4, %esp
//栈顶指针减4
movl %eax, (%esp)
//%eax -> esp 地址
pop %eax相当于
movl (%esp), %eax
addl %4, %esp
//栈顶指针加4
call ret
call 0x12345 相当于
pushl %eip
movl $0x12345, %eip
//当前地址压栈,存入新地址
ret相当于
popl %eip
//栈 -> eip
enter leave
enter相当于
push %ebp
movl %esp, %ebp
leave相当于
movl %ebp, %esp
popl %ebp