🌴 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 实验结果

不换行单步运行

换行单步运行

思考内容
- 控制符的显示输出
控制字符可以使用DOS 2号功能,如本实验的扩展要求,通过查ASCII表,得到换行和回车的十六进制数,保存到DL中,调用DOS INT 21后输出 - 类似分支功能有哪些不同指令的实现方法
无条件转移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)