![]() | 第4章 奇妙的声音 | -71- | |||||||||||||||||||
CLOSE_T CLOSE_T DELAY DELAY1: DELAY CODE |
PROC IN AND OUT RET ENDP PROC PUSH MOV LOOP POP RET ENDP ENDS END |
NEAR AL,61H AL,11111100B 61H,AL NEAR CX CX,500H DELAY1 CX MAIN |
;恢复61H端口的原值 ;子程序返回 ;将CX寄存器保存至堆栈 ;CX寄存器置入500H ;循环等待 ;恢复CX寄存器 ;返回主程序 |
||||||||||||||||||
程序中多了两条新的条件跳转指令--JA和JB: | |||||||||||||||||||||
![]() |
助记符:JA(Jump if above) 用 途:判断比较(减法运算)的结果是不是"前高于后"(为正) 格 式:JA 目的地址 执 行:若两个数比较(相减),前一个数比后一个数大(相减结果为正)则执行转移 助记符:JB(Jump if below) 用 途:判断比较(减法运算)的结果是不是"低于"(为负) 格 式:JB 目的地址 执 行:若两个数比较(相减),前一个数比后一个数小(相减结果为负)则执行转移 |
||||||||||||||||||||
这两条指令是功能相对的,它常用于"CMP"指令或"SUB"等算术运算指令后面。应用这两个指令时要注意这样一点那就是只有在两个"符号相同"的数相比较后才可用此指令根据结果转移,它不适用于判断"异符号数"运算结果。 我们知道条件转移指令一般都是根据标志寄存器中某些位的状态来决定转移与否的,例如指令"JZ/JNZ"就是根据"ZF"标志判断条件的。JB指令也是符合这个规律的,它的转移条件是"借位/进位"标志CF=1。CMP指令实际是将相比较的两个数进行一次减法,很明显如果前一个数小于后一个数,相减时必然有一次"借位",所以指令JB实际应写成"JC(Jump if Carry)"指令JA的转移条件就有些特殊了,它要根据标志寄存器中两个位的状态判断条件,这两个位是"借位/进位"标志CF和"零"标志ZF,具体的条件是CF AND ZF=0,也就是CF和ZF这两位都是0的情况下指令JA才会执行转移。这相当于排除了两个数相等的情况。下面我们就来看看两个符号相同的数做减法运算后标志寄存器的变化: C:\ASM\>DEBUG[Enter] |
|||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |