🌴 2022.5.12 早八 实验二

实验二 输入输出实验

1.1 实验要求

熟悉emu8086仿真系统,实现控制台输入输出,实现两位十进制数猜数字游戏(基本要求:输入两位数和预设值比较,对于输出>小于输出<对于输出=并退出)

1.2 理论分析

输入的两位数分别利用DOS 1号输入功能,高位(第一次输入)暂存到DH,低位(第二次输入)放到AL,利用AAD指令,将AX寄存器中非压缩型BCD码转换成为真正的二进制数,并存放在AL,之后用CMP指令与设定的数值比较,之后利用JE、JA判断大小并跳转。

扩展:如果大于或小于,利用DOS 2号功能输出0A(换行)、0D(回车),实现每次输出都换行。

1.3 汇编语言

💻提示:所有实验源码已在Github 整理

BGN:
MOV AH,1
INT 21H ;调用DOS 1号输入功能
AND AL,15 ;与运算,将高位清零,假设输入3D=33H,将高位清零
MOV DH,AL ;第一个数暂存到DH
MOV AH,1
INT 21H ;调用DOS 1号输入第二个数
AND AL,15 ;高位清零
MOV AH,DH ;第一个数做为高位给AH,第二个数在AL不变
AAD ;AAD指令 AL=AH*0AH+AL AH=0.实质上是将AX寄存器中非压缩型BCD码转换成为真正的二进制数,并存放在AL寄存器中
CMP AL,N ;若大于CF=0,小于CF=1,等于CF=1.ZF=1
JE JEND ;零标志位ZF=1转移
MOV DL,'>'
JA J1 ;高于或者不低于转移,CF=0
MOV DL,'<'

J1:
MOV AH,2
INT 21H ;调用2号输出>
JMP BGN ;猜的结果大/小,继续返回BGN

JEND:
MOV DL,'='
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H ;调用DOC 4CH中断程序

N DB 35 ;赋初值,猜的数为十进制35

扩展,每次输出都换行

BGN:
MOV AH,1
INT 21H ;调用DOS 1号输入功能
AND AL,15 ;与运算,将高位清零,假设输入3D=33H,将高位清零
MOV DH,AL ;第一个数暂存到DH
MOV AH,1
INT 21H ;调用DOS 1号输入第二个数
AND AL,15 ;高位清零
MOV AH,DH ;第一个数做为高位给AH,第二个数在AL不变
AAD ;AAD指令 AL=AH*0AH+AL AH=0.实质上是将AX寄存器中非压缩型BCD码转换成为真正的二进制数,并存放在AL寄存器中
CMP AL,N ;若大于CF=0,小于CF=1,等于CF=1.ZF=1
JE JEND ;零标志位ZF=1转移
MOV DL,'>'
JA J1 ;高于或者不低于转移,CF=0
MOV DL,'<'

J1:
MOV AH,2
INT 21H ;调用2号输出>
MOV DL,0AH
INT 21H ;调用2号换行
MOV DL,0DH
INT 21H ;调用2号回车
JMP BGN ;猜的结果大/小,继续返回BGN

JEND:
MOV DL,'='
MOV AH,2
INT 21H
MOV AH,4CH
INT 21H ;调用DOC 4CH中断程序

N DB 35 ;赋初值,猜的数为十进制35

1.4 实验结果

微机原理与接口技术04

不换行单步运行

微机原理与接口技术02

换行单步运行

微机原理与接口技术03

思考内容

  1. 控制符的显示输出
    控制字符可以使用DOS 2号功能,如本实验的扩展要求,通过查ASCII表,得到换行和回车的十六进制数,保存到DL中,调用DOS INT 21后输出
  2. 类似分支功能有哪些不同指令的实现方法
    无条件转移JMP,条件转移JC/JNC,条件转移指令JZ/JNZ(判断CF位),JZ/JNZ(判断ZF位),JO/JNO(判断OF位),JP/JPE、JNP/JPO(判断PF位),JS/JNS(判断SF位),JA/JAE/JB/JBE(判断CF或CF+ZF位),JG/JGE/JL/JLE(判断SF+OF或SF+OF+ZF)