1.JMP(unconditional jump)无条件转移
程序转移到目的操作数指定的地址执行,不需要满足任何条件.
操作数可以是标号、立即数,也可以是寄存器操作数或存储器操作数
Short jump 段内直接短转移
Near jump 段内直接近转移
Far jump 段间转移
Indirect jump 间接转移(段内、段间)
1)Short Jump 段内直接短转移
相对转移
指令给出一个语句标号label
但机器指令操作数不是地址,而是此标号相对于当前IP的偏移量,用8位补码表示。
∴ 转移范围 相对于当前IP -128 ~ +127
2)Near Jump 段内直接近转移
相对转移, 同short jump
3字节指令
1个字节操作码,两个字节的操作数(偏移量disp).
类似于Short jump,指令给出一个语句标号,此标号地址相对于当前IP的偏移量为16位补码
∴ 转移范围 同一代码段中
相对于当前IP -32768 ~ +32767
3)Far Jump 段间直接转移
指令给出的标号地址在另一代码段中
5字节指令
第一字节:操作码
2,3字节:偏移地址 → IP
4,5字节:段地址 → CS
4)Indirect Jump 间接转移指令
4.1)段内直接转移,操作数为16位寄存器
寄存器内容为转移目标地址的偏移地址
指令将16位寄存器的内容作为偏移地址取代原来IP的内容,实现段内转移。
Example:JMP AX
4.2)段内间接转移,操作数为16位存储器操作数
操作数为16位存储器操作数
存储单元的内容是转移目标地址的偏移地址.
指令将存储器中的字数据作为偏移地址取代原来IP的内容,实现段内转移。
操作数可采用寻址存储器操作数的所有寻址方式
Example:
JMP TABEL [BX]
JMP ALPHA_WORD
JMP WORD PTR [BP][SI]
常用于多分支转移。
4.3)段间间接转移
指令的操作数是一个32位(double word)的存储器操作数
低字为偏移地址取代原来IP的内容,高字为段地址给CS,实现段间转移。
操作数可采用寻址存储器操作数的所有寻址方式
2.条件转移指令 Conditional Jump
全部为short jump.
转移范围:当前IP -128 ~ +127
条件转移指令测试标志位: SF, ZF, CF, PF and OF.
如果条件满足,转移到目标地址;
条件不满足,顺序执行下一条指令。
两个无符号数比较后根据其比较结果形成的4条条件转移指令
此类指令一般跟在比较或减法指令后面
两个带符号数比较后根据其比较结果形成的4条条件转移指令
一般跟在比较或者减法指令后面
助记符
测试条件
转移条件
JG/JNLE
SF=OF and
ZF=0
目标操作数 > 源操作数则转移
Jump if greater than
JGE/JNL
SF=OF
目标操作数 ≥ 源操作数则转移
Jump if greater than or equal
JL/JGE
SF≠OF and
ZF=0
目标操作数<源操作数则转移
Jump if less than
JLE/JNG
SF≠OF or
ZF=1
目标操作数 ≤ 源操作数则转移
Jump if less than or equal
根据CF、ZF、SF、OF、PF的状态形成的10条条件转移指令
1.LOOP 无条件循环
以CX作为计数器,相当于DEC CX与JNZ指令的结合.
转移范围同条件转移指令,Short Jump
指令的执行过程:
CX-1
如 CX ≠ 0, 转移到语句标号处执行(循环)
如 CX = 0, 顺序执行下一条指令
2.LOOPE/LOOPZ (相等/为0时循环)
转移条件:
CX ≠ 0,且比较结果相等或减法运算结果为0。 当CX=0,或结果不等/不为0时,退出循环.
执行时,先CX-1,然后判断。
如CX ≠ 0,且ZF=1,转移
如任一条件不满足,则顺序执行下一条指令。
3.LOOPNE/LOOPNZ(不等/不为0时循环)
执行时,先CX-1,然后判断。
如CX ≠ 0,且ZF=0,转移。
如任一条件不满足,则顺序执行下一条指令。
过程—具有特定功能,且在程序中反复使用的程序段.
过程设计完成后,保存在存储器中某个固定的区域,由其他程序或过程多次调用执行。节省存储空间,简化程序设计。
用 CALL 指令调用过程
RET 指令从过程返回.
调用过程时,需要将断点地址保存到堆栈中
CALL指令的执行把下一条指令的地址(断点)压入堆栈(PUSH).
RET 将堆栈中保存的地址弹出到CS:IP中,程序返回,继续执行CALL指令的下一条指令
1.CALL(call a procedure)子程序调用指令
CALL指令在程序转移上类似于无条件转移指令
区别在于CALL指令将断点地址(返回地址)保存入堆栈。
1)Near CALL 段内直接调用
指令长度为3个字节;
第1字节: 操作码
2, 3字节: 16位的偏移量
形式上类似于段内直接近转移指令,指令给出转移地址(子程序入口地址)与本指令下一条指令地址(断点地址)之间的16位相对偏移量。
将断点的偏移地址保护入堆栈。
2)Far CALL 段间直接调用
类似于段间直接转移,调用的过程与本指令不在同一个逻辑段内,可实现整个存储器范围内的程序转移.
指令长度为5个字节
First: 操作码
2, 3 bytes: 调用过程的偏移地址
4, 5 bytes: 调用过程的段基址
需保护CS和IP
3)Near Indirect CALL 段内间接调用
类似于段内间接转移,需保护IP
4)Far Indirect CALL 段间间接调用
类似于段间间接转移,需保护CS和IP
2.RET( Return from procedure)子程序返回指令
段内返回,将堆栈指针寻址的16位数恢复到IP中;
段间返回,将堆栈指针寻址的32位数恢复到IP和CS中;
与子程序调用指令成对使用,在过程中由PROC定义。
1)Return from Near Procedure
从近过程返回
将堆栈指针寻址的16位数据(偏移地址)恢复到IP中
带立即数返回,是RET指令的另一种形式
首先将偏移地址恢复到IP寄存器中,并将堆栈指针SP的内容加上指令给出的立即数pop_value。
pop_value的值: 0~64KB
从远过程返回
Removes a 32-bits number (far return) from the stack and place it into CS and IP
近过程与远过程返回指令格式相同
区别在于近RET在近过程体内,而远RET在远过程体内
中断指令
硬件中断: 由外部信号引起
软件中断:由指令或内部事件引起
1.矢量中断INT
N: 中断类型号
0~255
共有256个
2.溢出中断INTO
INTO检测溢出标志OF,属于条件中断
如 OF=0,不执行任何操作;
如OF=1,启动类似于中断类型号为4 的 INT n 的中断过程。
3.中断返回IRET
1.标志位控制指令
1)CLC ;CF ← 0
将进位标志CF清0
2)STC ; CF ← 1
将进位标志CF置1
3)CMC
将进位标志CF取反
4)CLD ; DF ← 0
将进位标志DF清0
5)STD ; DF ← 1
将进位标志DF置1
6)CLI ; IF ← 0
将中断标志IF清0
7)STI ; IF ← 1
将中断标志IF置1
2.外部同步指令
用来使CPU与外部事件同步
1)暂停指令WAIT
2)交权指令ESC
3)封锁指令LOCK
4)暂停指令HLT
3.空操作指令NOP (no operation)