微机原理课程上机实验之一
题目:
试编写一程序,要求从键盘接收一个无符号数 N,然后响铃 N 次(响铃的 ASCII 码为 07H):
1)N 为一位数;
2)N 为两位数。
已经在DOSBOX/Emu8086 下正确运行过了
详见注释
CODES SEGMENT
;ASSUME CS:CODES,DS:DATA
ASSUME CS:CODES
START:
call getInt
mov cl,al
lp:
;mov DL,'7' ;准备响铃
mov DL,07H ;准备响铃
mov AH,02H ;显示一个字符的DOS调用,实际为响铃
INT 21H
LOOP lp
mov ah,4CH
int 21H
;没有退出,应用程序就退不到操作系统
getInt:
push BX ;保护现场
push DX
push CX
;此处不能pushf,因为flags是返回值
mov AX,0 ;初始化
mov BX,0
mov CX,0
mov DX,0
getInt_XUNHUAN:
mov AH ,01H
int 21H ; 输入一个字符,一定存储在 AL 中
cmp AL,0DH ; 判断回车符
jz getInt_RESULT ; zf=0 判断是回车
cmp AL,30H
jb getInt_XUNHUAN ; < 0
cmp AL,39H ;<= 9 && > 0
jbe getInt_SUM_TO_AX
jmp getInt_XUNHUAN ;继续循环
getInt_SUM_TO_AX:
mov AH,0 ;清除 AX 高位
push AX ;保存 AX
mov AX,CX ;将原先的值乘以 10 ,实质上乘起来的值放在了 CX 中
mov BX,10
;如果参数是字节,将把 AL 做乘数, 结果放在 AX
;如果参数是字 , 将把 AX 做乘数, 结果放在 DX:AX
mul BX
mov DX,0
mov CX,AX
pop AX
sub AL,30H
add CX,AX
jmp getInt_XUNHUAN
getInt_RESULT:
mov AX,CX
pop BX ;恢复现场
pop DX
pop CX
ret
CODES ENDS
END START