1、1,汇编语言程序设计,条件转移指令,指定的条件cc如果成立,程序转移到由标号label指定的目标地址去执行指令;条件不成立,则程序将顺序执行下一条指令 操作数label是采用短转移,称为相对寻址方式,Jcc,Jcc label;条件满足,发生转移:IPIP8位位移量;条件不满足,顺序执行,相对寻址方式,Jcc指令的操作数label是一个标号 一个8位位移量 Jcc指令后的那条指令的偏移地址,到目标指令的偏移地址的地址位移,且距当前IP地址128127个单元的范围之内,属于段内短距离转移 相对寻址方式 Jcc指令为2个字节,条件不满足时的顺序执行就是当前指令偏移指针IP加2,Jcc,Jcc指令的
2、分类,不影响标志,但要利用标志。 根据利用的标志位不同,16条指令分成3种情况: 1. 判断单个标志位状态 2. 比较无符号数高低 3. 比较有符号数大小,Jcc,条件转移指令中的条件cc,Jcc,1. 判断单个标志位状态,这组指令单独判断5个状态标志之一 JZ/JE和JNZ/JNE:利用零标志ZF,判断结果是否为零(或相等) JS和JNS:利用符号标志SF,判断结果是正是负 JO和JNO:利用溢出标志OF,判断结果是否产生溢出 JP/JPE和JNP/JPO:利用奇偶标志PF,判断结果中“1”的个数是偶是奇 JC/JB/JNAE和JNC/JNB/JAE:利用进位标志CF,判断结果是否进位或借位
3、,Jcc,例:JZ/JNZ指令,test al,80h ;测试最高位jz next0 ;D70(ZF1),转移mov ah,0ffh ;D71,顺序执行jmp done ;无条件转向 next0: mov ah,0 done: .test al,80h ;测试最高位jnz next1 ;D71(ZF0),转移mov ah,0 ;D70,顺序执行jmp done ;无条件转向 next1: mov ah,0ffh done: .,例:JS/JNS指令,;计算|XY|(绝对值) ;X和Y为存放于X单元和Y单元的16位操作数 ;结果存入result,mov ax,Xsub ax,Yjns nonne
4、gneg ax ;neg是求补指令 nonneg: mov result,ax,例:JO/JNO指令,;计算XY; ;X和Y为存放于X单元和Y单元的16位操作数 ;若溢出,则转移到overflow处理,mov ax,Xsub ax,Yjo overflow. ;无溢出,结果正确 overflow: . ;有溢出处理,例:JP/JNP指令,and al,7fh;最高位置“0”,同时判断“1”的个数jnp next;个数已为奇数,则转向nextor al,80h ;否则,最高位置“1” next: .,;设字符的ASCII码在AL寄存器中 ;将字符加上奇校验位 ;在字符ASCII码中为“1”的个数
5、已为奇数时 ;则令其最高位为“0”;否则令最高位为“1”,例:JC/JNC指令,xor al,al ;AL0,CF0 again: test bx,0ffffh ;等价于 cmp bx,0je nextshl bx,1jnc againinc aljmp again next: . ;AL保存1的个数,;记录BX中1的个数,记录BX中“1”的个数,xor al,al ;AL0,CF0 again: cmp bx,0jz nextshl bx,1 ;也可使用 shr bx,1adc al,0jmp again next: . ;AL保存1的个数,另一种做法,比较无符号数高低,无符号数的大小用高(
6、Above)低(Below)表示 利用CF确定高低、利用ZF标志确定相等(Equal) 两数的高低分成4种关系: 低于(不高于等于):JB(JNAE) 不低于(高于等于):JNB(JAE) 低于等于(不高于):JBE(JNA) 不低于等于(高于):JNBE(JA ),Jcc,例:比较无符号数,cmp ax,bx ;比较ax和bxjnb next ;若axbx,转移xchg ax,bx ;若axbx,交换 next: .,比较有符号数大小,有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal) 两数的大小分成4种关系: 小于(不大于等于):JL(
7、JNGE) 不小于(大于等于):JNL(JGE) 小于等于(不大于):JLE(JNG) 不小于等于(大于):JNLE(JG ),Jcc,例:比较有符号数,cmp ax,bx ;比较ax和bxjnl next ;若axbx,转移xchg ax,bx ;若axbx,交换 next: .,16位数转换为ASCII码,实验内容,1、设X,Y为存放在X,Y单元中的16位操作数,判断XY,若成立执行X-Y, 否则计算|X-Y|,并把结果存入RESULT中 2、假设有100个16位无符号数存放在数据段,把它们的和求出来,作为32位数存在DX和AX中 3、数据段有一个首地址为ARRAY的N字数组,要求测试其中正数、0、负数的个数,正数个数放在DI中,0的个数放在SI中,并根据N-(DI)-(SI)求得负数的个数放在AX中。,