![]() | 第3章 中断调用与子程序 | -37- | |||||||||||||||||||
图3-1反映了SHR指令执行的情况。从图中可以看出,假如利用SHR指令将8位二进制数10110110右移2位,应该得到00101101,同时标志寄存器中CF位会被置成1。 | |||||||||||||||||||||
![]() 图3-1 SHR指令执行的情况示意图 |
|||||||||||||||||||||
![]() |
助记符:AND 用 途:将两个数据作"与"逻辑操作 格 式:AND 寄存器,立即数 AND 寄存器,寄存器 AND 寄存器,存储单元 AND 存储单元,寄存器 AND 存储单元,立即数 |
||||||||||||||||||||
程序采用的算法并不难理解,为了测试AL中各个位的0、1状态,我们先在BH中放入二进制数10000000,这个数称为"掩模(MASK)",然后用BH与AL作AND操作。很明显AL中的数据将有7位被"屏敝",只有和BH中为1的位相对应的数位被保留。若这一位恰好为0,则AND操作的结果就是0,此时ZF标志置位;反之若这一位为1,那么ZF就会复位。用JZ指令依据ZF状态进行转移,分别输出0和1,然后将"掩模"中的"1"向右移动一位,再循环执行前面的测试部分,八次循环后在屏幕上将显示出AL中数据的二进制形式。 现在我们把程序中输出数据部分改写成子程序,如PROG4-A所示: |
|||||||||||||||||||||
PROG4-A | |||||||||||||||||||||
-a100[Enter] | |||||||||||||||||||||
0A3E:0100 MOV AH,01 0A3E:0102 INT 21 0A3E:0104 CALL 010D 0A3E:0107 CMP AL,1B 0A3E:0109 JNZ 0100 0A3E:010B INT 20 0A3E:010D PUSH AX 0A3E:010E MOV DH,AL 0A3E:0110 MOV BH,80 0A3E:0112 MOV CX,0008 0A3E:0115 MOV DL,30 0A3E:0117 MOV BL,DH 0A3E:0119 AND BL,BH 0A3E:011B JZ 011F 0A3E:011D MOV DL,31 0A3E:011F MOV AH,02 0A3E:0121 INT 21 |
;选择DOS API的01H功能 ;调用21H中断等待键盘输入 ;调用位于010DH处的子程序 ;判断输入的字符是否为"ESC" ;若输入字符不是"ESC",则转至0100H处继续接收字符 ;若输入字符是"ESC"则结束程序 ;子程序开始,保存AX寄存器 ;输入字符的ASCII码置入DH寄存器 ;BH寄存器置入"掩膜"10000000B ;处理8个数位 ;DL寄存器置入字符0的ASCII码30H ;BL寄存器置入输入字符的ASCII码 ;将ASCII码与"掩膜"相与 ;若结果为0,则转至011F显示字符0 ;若结果不为0,则将字符1的ASCII码置入DL寄存器 ;选择DOS API的02H功能 ;调用21H中断显示DL寄存器中的字符 |
||||||||||||||||||||
Copyright © 2004-2015 Reanimator | www.cookmoon.org |