汇编 0x01
寻址模式
立即数寻址 eg.: mov eax,1000h 操作数在指令中
寄存器寻址 eg. :mov ebp,esp 操作数在指定寄存器中
直接内存寻址 eg.: mov ax,[2000h] 操作数在内存中
寄存器间接寻址 eg.: mov eax,[ebx] 操作数在内存中,操作数的地址在寄存器中
索引寻址 eg.: mov ax,[di+100h] 通过基址寄存器内容加上一个索引值来寻址内存中的数据
相对基址索引寻址eg.: mov dh,[bx+si+10h] 基址寄存器+变址寄存器内容+偏移量
比例寻址变址 eg.: mov eax,[ebx+4*ecx]
CPU寄存器的种类
1.一般寄存器:AX、BX、CX、DX
AX:累加寄存器,BX:基址寄存器,CX:計數寄存器,DX:数据寄存器
2.索引寄存器:SI、DI
SI:來源索引寄存器,DI:目的索引寄存器
3.堆栈、基址寄存器:SP、BP
SP:堆栈指標寄存器,BP:基底指標寄存器
4.指位/指標寄存器(指位器):IP
5.段寄存器:CS、DS、ES、SS
代码段 CS:如 IP 所執行地址都是CS代码段的內容
数据段 DS:如 mov ax,[bx] 間接寻址法所指都是数据段的数据
附加段 ES:如 mov ax,es:[di] 利用間接寻址法取其他區段存储器数据時
堆栈段 SS:如 SP 堆栈数据,都是指在堆栈段的
6.标志寄存器:FLAG
7.386以上電腦新增擴充之寄存器
EAX、ECX、EDX、EBX:為ax,bx,cx,dx的扩展,各為32位
ESI、EDI、ESP、EBP:為si,di,sp,bp的扩展,32位
EFLAG、EIP:為FLAG與IP之扩展,32位
FS、GS:新增的段寄存器
当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9
16位下:
BYTE PTR 一个字节,8位
WORF PTR 两个字节,16位
call ret retf leave指令
ret指令
CPU执行ret指令时,进行下面两步操作:
(1)(IP)=((ss)*16 + (sp))
(2)(sp)= (sp) + 2
相当于 pop IP
retf指令
CPU执行ret指令时,进行下面两步操作:
(1)(IP)=((ss)*16 + (sp))
(2)(sp)= (sp) + 2
(3)(CS)=((ss)*16 + (sp))
(4)(sp)= (sp) + 2
相当于pop IP
pop CS
call指令
当执行call指令时,进行两步操作:
1)将当前的IP或CS和IP压入栈中
2)转移
call指令不能实现短转移,它的书写格式同jmp指令
依据标号进行转移的call指令
语法格式:call 标号
汇编解释:(1) push IP (2) jmp near ptr 标号
依据目的地址在指令中的call指令
语法格式:call far ptr 标号
汇编解释:(1) push CS (2) push IP (3) jmp far ptr 标号
转移地址在寄存器中的call指令
语法格式:call 16位reg
汇编解释:(1) push IP (2) jmp 16位reg
转移地址在内存中的call指令
语法格式一:call word ptr 内存单元地址
汇编解释一:(1) push IP (2) jmp word ptr 内存单元地址
语法格式二:call dword ptr 内存单元地址
汇编解释二:(1) push CS (2) push IP (3) jmp dword ptr 内存单元地址
leave指令
在16位汇编下相当于:
mov sp,bp
pop bp
在32位汇编下相当于:
mov esp,ebp; //将ebp指向(ebp内部应当保存一个地址,所谓指向即这个地址对应的空间)的值赋给esp
pop ebp
JMP指令
1 | jmp short 标号 |
jmp short 标号
- 段内短转移
- 对IP的修改范围是-128~127
- 向前 移动时可以最多越过128个字节,向后 移动可以最多越过127个字节
- 依据位移进行转移,转移指令结束后,CS:IP指向标号处的指令
- (IP)=(IP)+8位位移
8位位移 = 要跳转去的标号地址 - 减去jmp指令后第一条指令的起始地址
8位位移的范围是:-128~127
8位位移使用 补码 形式表示
jmp near ptr 标号
- 段内近转移
- (IP)=(IP)+16位位移
16位位移 = 要跳转去的标号地址 - 减去jmp指令后第一条指令的起始地址
16位位移的范围是:-32768~32767
16位位移使用 补码 形式表示
jmp far ptr 标号
- 段间转移,远转移
- 用标号所在段地址和偏移地址修改CS和IP
jmp 16位reg
jmp 某一合法寄存器
: 用寄存器中的值修改IP寄存器中的值
1 | jmp ax |
jmp word ptr 内存单元地址
- 段内转移,只修改偏移地址
1 | mov ax,0123H |
jmp dword ptr 内存单元地址
- 段间转移
- 高地址放目的段地址,低地址放目的偏移地址
1 | mov ax,0123H |