数据传输指令
数据传输指令是指将一段数据从一个地方传递到另一个地方
指令 | 操作数 1 | 操作数 2 | 执行操作 |
---|---|---|---|
mov | reg | reg/mem/imm | 将操作数 2 的值传送到操作数 1 中 |
mem | reg/imm | ||
seg | reg16/mem16 | ||
xchg | reg | reg/mem | 将操作数 1 与操作数 2 的内容相交换 |
mem | reg | ||
lea | reg | mem | 将源操作数的地址传送到目标操作数的寄存器中 |
push | reg/mem/seg/imm | 将操作数 1 中内存存放在堆栈中,esp 自减4 | |
pop | reg/mem/seg | 将栈顶数据存放到操作数 1 中,esp 自增4 | |
pushfd | 将 eflag 存放到堆栈中,esp 自减4 | ||
popfd | 将栈顶数据存放到 eflag 中,esp 自增4 | ||
pushad | 将所有寄存器状态压入堆栈 | ||
popad | 从栈顶开始,将数据存入各个寄存器,esp |
算数运算指令
加减
乘除
注意:乘法,除法的结果,大多数时候,都是保存在edx:eax中
逻辑运算指令
逻辑指令
cmp:做减法,但是不保存减法的结果,只会设置标志寄存器,比如,溢出了,借位了,减完结果是0.
cmp指令运算完之后,就能够通过标志寄存器判断出两个数的大小关系。
test:做的按位与运算,也不保存按位与的结果,只会设置标志位。
作用1:判断某一个数的第n位是不是被置位了
test eax,0x4(100)
作用2:检测某一个寄存器是不是0
test eax,eax
串操作指令与控制转移
串操作指令被用于操作某一内存区域中由相同类型数据构成的一个整体(相当于一个数组),这种结构一般被用于保存字符串或其他连续存放的单一类型数据
指令 | 操作数 1 | 操作数 2 | 执行操作 | 类比 |
---|---|---|---|---|
movsb/w/d | ES : [EDI] | DS : [ESI] | 将操作数 2 的值传送到操作数 1 中,同时 EDI 与 ESI 自增 1 | memcpy |
stosb/w/d | ES : [EDI] | 将 AL、AX 或 EAX 寄存器中的字节、字或双字存储到目标操作数。 | memset | |
lodsb/w/d | DS : [ESI] | 将源操作数中的字节、字或双字分别加载到 AL、AX 或 EAX 寄存器。 | ||
cmpsb/w/d | ES : [EDI] | DS : [ESI] | 比较第一个源操作数指定的字节、字或双字与第二个源操作数指定的字节、字或双字,并根据结果设置 EFLAGS 寄存器中的状态标志。 | memcmp |
scasb/w/d | ES : [EDI] | 将 AL、AX 或 EAX 寄存器中的内容,在目标地址中的值依次比较 | srelen | |
rep/repe |
与串操作指令连用,重复执行串指令 ecx 次。 | |||
每执行一次 ecx 自减 1 | ||||
当 ecx 为 0 或者 ZF 为 0 的时候,结束重复。 | ||||
repne |
与串操作指令连用,重复执行串指令 ecx 次。 | |||
每执行一次 ecx 自减 1。 | ||||
当 ecx 为 0 或者 ZF 为 1 的时候,结束重复。 |
控制转移指令
占用 4 个字节,有效位数 6~7 位,双精度浮点类型,有效位数可以达到 16~17位
控制转移指令负责控制程序执行流程,它们一般会导致当前指令的执行轨迹发生改变,或执行调用子程序的功能
指令 | 操作数 1 | 执行操作 | 类比 |
---|---|---|---|
JMP | reg/mem/imm | ||
LOOP | imm | ||
CALL | reg/mem/imm | ||
RET | imm | ||
RETF | imm | ||
RETN | imm | ||
JCC |
JMP 无条件转移指令
- 指令原型
JMP reg/mem/imm - 操作数个数:1
- 指令结构:JMP 源操作数
- 执行操作:只要执行无条件转移指令 JMP,就使程序转到指定的目标地址处,从目标地址处开始执行那里的指令。
- 例子:
jmp eax ;从寄存器 eax 取出 4 字节的地址然后跳转
jmp 401000 ;直接跳转到地址 0x401000
jmp dword ptr [0x40300] ;从内存中取出 4 字节的地址然后跳转
寻址方式
- 直接寻址方式
- 转移地址像立即数一样,直接在指令的机器代码中,是直接寻址方式
- 间接寻址方式
- 转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式
- 段内转移——近转移(near)
- 在当前代码段 64KB 范围内转移(+-32KB 范围)
- 不需要更改 CS 段地址,只要改变 IP 偏移地址
- 段内转移——短转移(short)
- 转移范围可以用一个字节表达,在段内 -128~+127 范围的转移
- 段间转移——远转移(far)
- 从当前代码段跳转到另一个代码段,可以在 1MB 范围
- 需要更改 CS 段地址和 IP 偏移地址
- 目标地址必须用一个 32 位数表达,叫做 32 位远指针,它是逻辑地址
- 实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移
程序员可用操作符short、near ptr 或 far ptr 强制
Jxx 条件转移指令
CALL 子程序指令
指令原型:
CALL reg/mem/imm
- 操作数个数:1
- 指令结构:CALL 源操作数
- 执行操作:当主程序(调用程序)需要执行这个功能时,采用 CALL 调用指令转移到该子程序的起始处执行,当运行完子程序功能后,采用 RET 返回指令回到主程序继续执行。
例子:
call eax
call 401000
call dword ptr [403000]RET 子程序返回指令
指令原型:
RET imm
RETF imm
RETN imm
- 操作数个数:1
- 指令结构:RET 源操作数
- 执行操作:RET 指令可以带有一个立即数 i16,则堆栈指针 SP 将增加,这个特点使得程序可以方便地废除若干执行 CALL 指令以前入栈的参数。
寄存器作用(32位)
EAX:扩展累加寄存器(在乘/除法中被主动调用)可作其他用途
ECX:循环计数器,多数情况下可以作为其他用途
EDX:数据寄存器,常用来存放八字长数据的高 32 位,可作其他用途
EBX:基址寄存器,常用作存放存储器地址,可作其他用途
ESP:指向堆栈(最上面栈帧的栈顶),绝大多数情况下不可作为他用
EBP:指向最上面一个栈帧的栈顶的底部,一般情况下不可以作他用
ESI:扩展源指针(由高速内存数据传送指令使用),可以作他用
EDI:扩展目的指针(由高速内存数据传送指令使用),可以作他用
EIP:指令指针(下一条要执行的指令地址),几乎不可以挪作他用