几种基本汇编指令详解
常见寄存器
寄存器 | 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 & pull
堆栈数据结构简介
作用:
- 程序调用框架
- 传递参数
- 保存返回地址
- 提供局部变量
- ……
结构:
相关寄存器: esp, ebp
相关操作: pop, push
//建立被调用者函数的堆栈框架 pushl %ebp movl %esp, %ebp //拆除框架 movl %ebp, %esp popl %ebp ret
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
push:压栈
push %eax
相当于:subl $4, %esp //栈顶指针减4 movl %eax, (%esp) //%eax -> esp 地址
- 1
- 2
- 3
- 4
pop:出栈
pop %eax
相当于:movl (%esp), %eax addl %4, %esp //栈顶指针加4
- 1
- 2
- 3
call&ret
call
call 0x12345
相当于:pushl %eip movl $0x12345, %eip //当前地址压栈,存入新地址
- 1
- 2
- 3
ret
相当于:
popl %eip //栈 -> eip
- 1
- 2
enter&leave
enter
push %ebp movl %esp, %ebp //将堆栈置空(栈上重堆)
- 1
- 2
- 3
leave
movl %ebp, %esp popl %ebp //将堆栈置空(撤销堆栈)
- 1
- 2
- 3
例子:分析一段汇编代码
pushl $8 ① movl %esp, %ebp ② subl $4, %esp ③ movl $8, (%esp) ④
- 1
- 2
- 3
- 4
文章来源: blog.csdn.net,作者:冰水比水冰,版权归原作者所有,如需转载,请联系作者。
原文链接:blog.csdn.net/luoyhang003/article/details/46786591