DDD
8088 汇编跳转 |
日期:2003年6月12日 出处:嬴政天下整理收藏 作者:看雪 人气: 8735
|
8088 汇编跳转
一、状态寄存器
PSW(Program Flag)程序状态字寄存器,是一个16位寄存器,由条件码标志(flag)和控制标志构成,如下所示:
15
|
14
|
13
|
12
|
11
|
10
|
9
|
8
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
|
|
|
|
|
OF
|
DF
|
IF
|
TF
|
SF
|
ZF
|
|
AF
|
|
PF
|
|
CF
|
条件码: ①OF(Overflow
Flag)溢出标志。溢出时为1,否则置0。 ②SF(Sign Flag)符号标志。结果为负时置1,否则置0. ③ZF(Zero
Flag)零标志,运算结果为0时ZF位置1,否则置0. ④CF(Carry Flag)进位标志,进位时置1,否则置0. ⑤AF(Auxiliary
carry Flag)辅助进位标志,记录运算时第3位(半个字节)产生的进位置。有进位时1,否则置0. ⑥PF(Parity
Flag)奇偶标志。结果操作数中1的个数为偶数时置1,否则置0.
控制标志位: ⑦DF(Direction
Flag)方向标志,在串处理指令中控制信息的方向。 ⑧IF(Interrupt Flag)中断标志。 ⑨TF(Trap
Flag)陷井标志。
二、 直接标志转移(8位寻址)
指令格式
|
机器码
|
测试条件
|
如...则转移
|
|
指令格式
|
机器码
|
测试条件
|
如...则转移
|
JC
|
72
|
C=1
|
有进位
|
JNS
|
79
|
S=0
|
正号
|
JNC
|
73
|
C=0
|
无进位
|
JO
|
70
|
O=1
|
有溢出
|
JZ/JE
|
74
|
Z=1
|
零/等于
|
JNO
|
71
|
O=0
|
无溢出
|
JNZ/JNE
|
75
|
Z=0
|
不为零/不等于
|
JP/JPE
|
7A
|
P=1
|
奇偶位为偶
|
JS
|
78
|
S=1
|
负号
|
JNP/IPO
|
7B
|
P=0
|
奇偶位为奇
|
三、间接标志转移(8位寻址)
指令格式
|
机器码
|
测试格式
|
如...则转移
|
JA/JNBE(比较无符号数)
|
77
|
C或Z=0
|
> 高于/不低于或等于
|
JAE/JNB(比较无符号数)
|
73
|
C=0
|
>= 高于或等于/不低于
|
JB/JNAE(比较无符号数)
|
72
|
C=1
|
< 低于/不高于或等于
|
JBE/JNA(比较无符号数)
|
76
|
C或Z=1
|
<= 低于或等于/不高于
|
JG/JNLE(比较带符号数)
|
7F
|
(S异或O)或Z=0
|
> 大于/不小于或等于
|
JGE/JNL(比较带符号数)
|
7D
|
S异或O=0
|
>= 大于或等于/不小于
|
JL/JNGE(比较带符号数)
|
7C
|
S异或O=1
|
< 小于/不大于或等于
|
JLE/JNG(比较带符号数)
|
7E
|
(S异或O)或Z=1
|
<= 小于或等于/不大于
|
四、无条件转移指令(fisheep译 fisheep@sohu.com)
操作码 |
伪码指令 |
含义 |
EB cb
|
JMP rel8 |
相对短跳转(8位),使rel8处的代码位下一条指令 |
E9 cw
|
JMP rel16 |
相对跳转(16位),使rel16处的代码位下一条指令 |
FF /4
|
JMP r/m16 |
绝对跳转(16位),下一指令地址在r/m16中给出 |
FF /4
|
JMP r/m32 |
绝对跳转(32位),下一指令地址在r/m32中给出 |
EA cb
|
JMP ptr16:16 |
远距离绝对跳转,
下一指令地址在操作数中 |
EA cb
|
JMP ptr16:32 |
远距离绝对跳转,
下一指令地址在操作数中 |
FF /5
|
JMP m16:16 |
远距离绝对跳转,
下一指令地址在内存m16:16中 |
FF /5
|
JMP m16:32 |
远距离绝对跳转,
下一指令地址在内存m16:32中 |
五、16位/32位寻址方式(fisheep译
fisheep@sohu.com)
操作码
|
伪码指令
|
跳转含义
|
跳转类型
|
跳转的条件(标志位)
|
0F 87 cw/cd
|
JA rel16/32
|
大于
|
near
|
(CF=0 and ZF=0)
|
0F 83 cw/cd
|
JAE rel16/32
|
大于等于
|
near
|
(CF=0)
|
0F 82 cw/cd
|
JB rel16/32
|
小于
|
near
|
(CF=1)
|
0F 86 cw/cd
|
JBE rel16/32
|
小于等于
|
near
|
(CF=1 or ZF=1)
|
0F 82 cw/cd
|
JC rel16/32
|
进位
|
near
|
(CF=1)
|
0F 84 cw/cd
|
JE rel16/32
|
等于
|
near
|
(ZF=1)
|
0F 84 cw/cd
|
JZ rel16/32
|
为0
|
near
|
(ZF=1)
|
0F 8F cw/cd
|
JG rel16/32
|
大于
|
near
|
(ZF=0 and SF=OF)
|
0F 8D cw/cd
|
JGE rel16/32
|
大于等于
|
near
|
(SF=OF)
|
0F 8C cw/cd
|
JL rel16/32
|
小于
|
near
|
(SF<>OF)
|
0F 8E cw/cd
|
JLE rel16/32
|
小于等于
|
near
|
(ZF=1 or SF<>OF)
|
0F 86 cw/cd
|
JNA rel16/32
|
不大于
|
near
|
(CF=1 or ZF=1)
|
0F 82 cw/cd
|
JNAE rel16/32
|
不大于等于
|
near
|
(CF=1)
|
0F 83 cw/cd
|
JNB rel16/32
|
不小于
|
near
|
(CF=0)
|
0F 87 cw/cd
|
JNBE rel16/32
|
不小于等于
|
near
|
(CF=0 and ZF=0)
|
0F 83 cw/cd
|
JNC rel16/32
|
不进位
|
near
|
(CF=0)
|
0F 85 cw/cd
|
JNE rel16/32
|
不等于
|
near
|
(ZF=0)
|
0F 8E cw/cd
|
JNG rel16/32
|
不大于
|
near
|
(ZF=1 or SF<>OF)
|
0F 8C cw/cd
|
JNGE rel16/32
|
不大于等于
|
near
|
(SF<>OF)
|
0F 8D cw/cd
|
JNL rel16/32
|
不小于
|
near
|
(SF=OF)
|
0F 8F cw/cd
|
JNLE rel16/32
|
不小于等于
|
near
|
(ZF=0 and SF=OF)
|
0F 81 cw/cd
|
JNO rel16/32
|
未溢出
|
near
|
(OF=0)
|
0F 8B cw/cd
|
JNP rel16/32
|
不是偶数
|
near
|
(PF=0)
|
0F 89 cw/cd
|
JNS rel16/32
|
非负数
|
near
|
(SF=0)
|
0F 85 cw/cd
|
JNZ rel16/32
|
非零(不等于)
|
near
|
(ZF=0)
|
0F 80 cw/cd
|
JO rel16/32
|
溢出
|
near
|
(OF=1)
|
0F 8A cw/cd
|
JP rel16/32
|
偶数
|
near
|
(PF=1)
|
0F 8A cw/cd
|
JPE rel16/32
|
偶数
|
near
|
(PF=1)
|
0F 8B cw/cd
|
JPO rel16/32
|
奇数
|
near
|
(PF=0)
|
0F 88 cw/cd
|
JS rel16/32
|
负数
|
near
|
(SF=1)
|
0F 84 cw/cd
|
JZ rel16/32
|
为零(等于)
|
near
|
(ZF=1)
|
注:一些指令操作数的含义说明: rel8 表示 8 位相对地址
rel16 表示 16 位相对地址 rel16/32 表示 16或32 位相对地址 r/m16 表示16位寄存器
r/m32 表示32位寄存器 |
无条件转移指令
指令格式 |
JMP 地址表达式 |
指令功能 |
无条件地转移到由地址表达式所确定的目标单元。本指令对标志位无影响。 |
无条件转移指令根据其转移范围的大小可以分为以下四种方式: |
四种方式 |
1.段内直接转移 |
2.段内间接转移 |
3.段间直接转移 |
4.段间间接转移 |
说 明 |
这是一种相对寻址方式。它转移的目标地址是当前IP内容加上一个八位相对位移量(DISP), DISP是汇编程序在汇编源程序时,根据目标地址和当前IP之间的距离自动生成的。 |
它转移的目标地址是可通过寄存器或存贮单元来寻址。 |
在一条无条件转移指令中的地址表达式是一个段间(FAR)标号或段间标号加减一常量(必须在该标号所在段内)时,则该指令被汇编成一个段间直接转移指令代码。 |
此指令的目标地址由存贮器寻址方式指定的内存中的连续两个字来决定,低地址的字取代IP,高地址的字取代CS。 |
指令功能 |
IP=IP+Disp |
IP=Reg16 或 IP=Mem16 |
|
|
条件转移指令
指令格式 |
<指令助记符> <短标号> |
指令说明 |
当满足条件而发生转移的指令,称之为条件转移指令。它们以某些标志位或这些标志位的逻辑运算作为依据,若满足指令所规定条件,则程序转移,否则顺序执行。 |
1.根据单个标志位的条件转移指令: |
2.用于无符号数的条件转移指令: |
3.用于带符号数的条件转移指令: |
(1)有进位转移(JC)或无进位转移(JNC) (2)等于/为零转移(JE/JZ)或不等于/非零转移(JNZ) (3)负数转移(JS)或正数转移(JNS) (4)溢出转移(JO)或不溢出转移(JNO) (5)偶校验转移(JP/JPE)或奇校验转移(JNP/JPO) (6)寄存器CX为零转移(JCXZ)
|
(1)高于转移(JA)/不低于且不等于转移(JNBE) (2)高于或等于转移(JAE)/不低于转移(JNB) (3)低于转移(JB)/不高于且不等于转移(JNAE) (4)低于或等于转移(JBE)/不高于转移(JNA)
|
(1)大于转移(JG)/不小于且不等于转移(JNLE) (2)大于或等于转移(JGE)/不小于转移(JNL) (3)小于转移(JL)/不大于且不等于转移(JNGE) (4)低于或等于转移(JLE)/不高于转移(JNG)
|
注意:这类指令的转移范围只能在离当前IP的-128-+127个字节之内。它们对标志位均无影响。
重复控制指令
这类指令主要用来控制软件循环的重复过程,故又称作循环控制指令。
指令名称 |
指令功能 |
(1)LOOP指令 |
将CX内容减一,若CX不等于0,则循环至目标地址处(即IP+DISP);否则顺序执行后续指令。 |
(2)LOOPZ/LOOPE指令 |
将CX内容减一,若CX不等于0,且标志位ZF=1时,才循环至目标地址处;否则顺序执行后续指令。 |
(3)LOOPNZ/LOOPNE指令 |
将CX内容减一,若CX不等于0,且标志位ZF=0时,才循环至目标地址处;否则顺序执行后续指令。 |
(4)JCXZ指令 |
寄存器CX为零转移(JCXZ),这条指令前面已经介绍过。 |
注意:在执行此类重复控制指令前必须把重复次数送入寄存器CX中。
标志操作指令
清进位指令CLC
|
清除进位标志 CF←0 |
置进位指令STC
|
置进位标志 CF←1 |
清除方向位指令CLD
|
清除方向标志 DF←0
|
置方向位指令STD
|
置方向标志 DF←1
|
清中断允许指令CLI
|
清除中断标志 IF←0
|
置中断允许位指令STI
|
置中断标志 IF←1
|
处理器控制指令
|
|
|
处理器暂停指令 |
HLT |
使CPU进入暂停状态,不进行任何操作,它可被"外部中断"和复位信号来清除。该指令不影响任何标志,常在程序中为了等待中断而使用。 |
空操作指令 |
NOP |
该指令不进行任何操作,它仅充当一种为不做任何操作的“转向”点提供标号的手段。 |
处理器等待指令 |
WAIT |
在处理器的引脚TEST=1时,使处理器进入等待状态;直到TEST=0,等待状态被清除,并恢复执行原停止的指令。 |
处理器交权指令 |
ESC |
指出使用的协处理器编号及执行的操作,并为协处理器写指定一个操作数。 |
总线封锁指令 |
LOCK |
使CPU的LOCK信号线上产生一个有效电位,以禁止总线上的其他主设备进行总线访问。 |