目录 上一页 下一页 下一章

第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

目录 上一页 下一页 下一章