0%

汇编课程记录 6

(没有遵循标题格式…因为显示的差别太小了…

控制转移指令

无条件转移指令

段内直接转移

1
2
3
4
5
6
JMP SHORT 目标标号
;(IP) ← (IP)+8位位移量、、
;8 位短转移
JMP NEAR PTR 目标标号
;(IP) ← (IP)+16位位移量
;16 位近转移

段内间接转移
用寄存器或存储单元的内容

1
2
JMP 字地址指针
;(IP) ← (EA)

段间直接转移

1
2
3
JMP FAR PTR 目标标号
;(IP) ← 目标标号的段内偏移地址
;(CS) ← 目标标号所在段的段基址

段间间接转移
32 位双字,前两个字节送 IP,后;两个字节送 CS

1
2
3
JMP DWORD PTR 目标标号
;(IP) ← (EA)
;(CS) ← (EA+2)

条件转移指令

条件转移指令只能使用段内直接寻址的 8 位位移量

根据单个标志位设置情况

格式 标志设置 测试条件
JC/JNC 地址标号 CF=1/CF=0 有/无进位则转移
JE/JNE 地址标号 ZF=1/ZF=0 结果相等/不相等则转移
JZ/JNZ 地址标号 ZF=1/ZF=0 结果为零/不为零则转移
JS/JNS 地址标号 SF=1/SF=0 结果为负/正则转移
JO/JNO 地址标号 OF=1/OF=0 结果溢出/不溢出则转移
JP/JNP 地址标号 PF=1/PF=0 奇偶位为 1/0 则转移

比较两个无符号数

格式 测试条件
JA/JNBE 地址标号 高于/不低于等于时转移
JAE/JNB 地址标号 高于等于/不低于时转移
JB/JNAE 地址标号 低于/不高于等于时转移
JBE/JNA 地址标号 低于等于/不高于转移

比较两个带符号数

格式 测试条件
JG/JNLE OPR 大于/不小于等于时转移
JGE/JNL OPR 大于等于/不小于时转移
JL/JNGE OPR 小于/不大于等于时转移
JLE/JNG OPR 小于等于/不大于时转移

测试 CX 的值为 0 则转移

1
2
JCXZ 地址标号
;若 CX 寄存器的内容为零,则转移到指定地址标号

循环控制指令

用 CX 寄存器作为计数器控制程序的循环,目地址只能用段内直接寻址的 8 位位移量

1
2
3
4
LOOP 标号
;循环指令
;(CX) ⬅ (CX)-1
;(CX) ≠ 0,则转移至标号处循环直至 (CX)=0
1
2
3
4
LOOPZ(LOOPE) 标号
;为零/相等循环指令
;(CX) ⬅ (CX)-1
;(CX) ≠ 0,且 ZF=1 则循环直至 (CX)=0
1
2
3
4
LOOPNZ(LOOPNE) 标号
;不为零/不相等循环指令
;(CX) ⬅ (CX)-1
;(CX) ≠ 0,且 ZF=0 则循环直至 (CX)=0

过程调用和返回指令

CALL 子进程调用指令
段内直接近调用

1
2
3
4
5
6
7
CALL DST
CALL NEAR PTR DST (DST一般为子程序名)
;PUSH (IP)
;(IP) ⬅ (IP)+D16
;将子程序的返回地址存入堆栈以便子程序返回时使用
;DST 给出转向地址即子程序入口
;D16 为机器指令中的位移量,是转向地址和返回地址之间的差值

段内间接近调用

1
2
3
4
5
CALL DST
CALL WORD PTR DST (DST 为通用寄存器或字存储器)
;PUSH (IP)
;(IP) ⬅ (EA)
;DST 可用寄存器寻址和存储器寻址

段间直接远调用

1
2
3
4
5
CALL FAR PTR DST (DST 一般为子程序名)
;PUSH (CS)
;PUSH (IP)
;(IP) ⬅ DST 指定的偏移地址
;(CS) ⬅ DST 指定的段地址

段间间接远调用

1
2
3
4
5
6
7
CALL DWORD PTR DST (DST 为双字存储器)
;PUSH (CS)
;PUSH (IP)
;(IP) ⬅ (EA)
;(CS) ⬅ (EA)+2
;EA 是由 DST 的寻址方式确定的有效地址
;可使用任一的存储器寻址方式取得 EA

RET 子程序返回指令
在子程序的末尾,使完成后返回调用处,返回地址是调用子程序时放在堆栈中的,RET 操作时返回地址出栈送 IP 寄存器 和 CS 寄存器(仅段间)

段内近返回

1
2
RET
;(IP) ⬅ POP()

段内带立即数近返回
允许返回地址出栈后修改的指针,便于调用程序再用 CALL 指令调用子程序前把子程序所需要的参数入栈,当子程序返回后修改指针使其指向参数入栈以前的值

1
2
3
RET EXP
;(IP) ⬅ POP()
;(SP) ⬅ (SP)+D16

段间远返回

1
2
3
RET
;(IP) ⬅ POP()
;(CS) ⬅ POP()

段间带立即数远返回

1
2
3
4
RET EXP
;(IP) ⬅ POP()
;(CS) ⬅ POP()
;(SP) ⬅ (SP)+D16

中断指令

CPU 暂时中止现行程序转向另一处处理程序称为中断

int 软中断
将控制转向一个型号为 n 的软中断,该中断处理程序入口地址在中断向量表的 n*4 地址处的两个存储字中,n 为类型号,可以是 0-255 的常数或常数表达式,影响 IF TF 标志位

1
2
3
4
5
6
7
8
9
INT n
;PUSH (FLAGES)
;IF ⬅️ 0
;TF ⬅️ 0
;AC ⬅️ 0
;PUSH (CS)
;PUSH (IP)
;(IP) ⬅️ (n*4)
;(CS) ⬅️ (n*4+2)

IRET 中断返回指令
从中断程序处理程序返回主程序,恢复中断前的 CS 和 IP 的内容,软中断硬中断皆可,影响所有标志位

1
2
3
4
IRET
;(IP) ⬅️ POP()
;(CS) ⬅️ POP()
;(FLAGES) ⬅️ POP()

INTO 溢出中断指令
立即产生一个中断类型为 4 的中断,OF=0 时不起作用

1
2
3
4
5
6
7
8
9
10
INTO
;若 OF=1 则
;PUSH (FLAGES)
;IF ⬅️ 0
;TF ⬅️ 0
;AC ⬅️ 0
;PUSH (CS)
;PUSH (IP)
;(IP) ⬅️ (10H)
;(CS) ⬅️ (12H)

处理器控制指令

标志位操作指令

对 CF DF IF 进行设置
进位位标志操作指令

1
2
3
4
5
6
CLC
;进位位清 0 指令
STC
;进位位置 1 指令
CMC
;进位位求反指令

方向标志操作指令

1
2
3
4
CLD
;方向标志清 0 指令
STD
;方向标志置 1 指令

其他处理器控制指令

都不影响标志位
NOP 空操作指令
不执行任何操作,其机器码占用一个字节单元,通常用于调试程序时替代被删除指令的机器码而无须重新汇编链接;或在延时程序中作为延时时间的调节

1
NOP

HLT 停机指令
使处理器暂停不进行任何操作,当 CPU 发生复位或来自外部的中断时,脱离暂停状态。用于程序中断等待,在 PC 机中会引发死机,一般的应用程序不要使用

1
HLT

WAIT 等待指令
使处理器处于空转等待状态,不做任何操作,也可以用来等待外部中断的发生,但中断结束后仍然返回 WAIT 继续等待;可用于与 ESC 指令配合等待协处理器的执行结果

1
WAIT

ESC 换码指令
指定协处理器接受指令和数据,CPU 将控制权交给协处理器,第一个数据 OP 操作码,第二个数据为操作数(寄存器 REG 或存储器 MEM 中的内容)

1
ESC OP,	REG/MEM

LOCK 封锁指令
是指令前缀,与其他指令配合维持总栈的控制权不被其他处理器占有,直到与其配合的指令执行完毕

1
LOCK 指令