ASM16-16~18 --BCD码调整指令和控制类转移指令
ASM16
BCD码加、减调整指令
BCD调整指令主要有四种(乘法和除法的不做要求):
DAA压缩型BCD数加法调整指令
AAA非圧缩型BCD数加法调整指令
DAS压缩型BCD数减法调整指令
AAS非圧缩型BCD数减法调整指令
1 | (ADD AL,i8/r8/m8) |
使用AAA或AAS指令前,应先执行以AL为目的操作数的加法或减法指令
AAA和AAS指令在调整中产生了进位或错位,则AH要加上进位或减去借位,同时CF=AF=1,否则CF=AF=0;它们对其他标志无定义
使用DAA或DAS指令前,应先执行以AL为目的操作数的加法或减法指令
AAA:
控制转移类指令
- 控制转移类指令用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令
1 | Jump 跳转/转移 |
JMP:
JMP(jump)指令可以实现短、近、远转移,使用方便,包括段内直接转移、段内间接转移、段间直接转移、段间间接转移。
短是指要跳至的目标地址与当前地址前后相差不超过128字节。
近是指跳转的目标地址与当前地址在用一个段内,即CS的值不变,只改变EIP的值。
远指跳到另一个代码段去执行,CS/EIP都要改变。
1、段内直接转移
指令格式:JMP label ;label为转移目标
执行操作:
短转移,(IP)<——(IP)+8位相对位移量
近程转移,(IP)<——(IP)+16位相对位移量
若label在JMP指令的(-128~127)字节之内,则会自动产生一个短转移(SHORT);否则便会产生一个在(-32768~32767)之间的近程转移(NEAR)。
1 | 短转移 |
跳转7个字节 本身为0007 加上本身3个字节 于是跳转到0011
判断单个标志位状态
这组指令单独判断五个状态标志之一
(1)JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等)
(2)JS和JNS: 利用符号标志SF,判断结果是正是负
(3)JO和JNO: 利用溢出标志OF,判断结果是否产生溢出
(4)JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇
(5)JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位
比较无符号数高低
无符号数的大小用高(ABove)低(Below)表示
利用CF确定高低、利用ZF标志确定相等
两数的高低分成四种关系:
(1)低于(不高于等于):JB(JNAE)(2)不低于(高于等于):JNB(JAE)
(3)低于等于(不高于):JBE(JNA)
(4)不低于等于(高于):JNBE(JA)
1 | ;switch 1 2 3 |