📄 一个简单汇编题目的调试排错过程).txt
字号:
从键盘输入一系列字符,以回车键结束,编程统计其中非数字字符的个数
.model small
.stack
.data
cnt db ?
buf db 20h dup(?)
.code
start: mov ax,@data
mov ds,ax
lea si,buf
mov dl,0
next1: mov ah,01h
int 21h
mov [si],al
inc si
cmp al,0dh
jz done
cmp al,30h
jge next
inc dl
jmp next1
next: cmp al,39h
jbe next1
inc dl
jmp next1
done: mov bl,dl;首先把DL里保存的计数放在BL
mov dl,0dh;0dh(回车)和下面的0ah(换行)是为了下面的输出换行
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
mov dl,bl;再把BL的数字还原到DL中
;add dl,30h;当非数字个数等于或者大于10时,无效
;;;;;;;;;;;;;;;;;;;;;;实现十进制输出
mov ah,00h
mov dh,00h
mov ax,dx
mov cl,0ah
div cl
mov cl,ah;由于除法指令把余数和商分别放在AL,AH,由于AH被mov ah,2占用,所以转移到CL
mov dl,al
cmp al,01h;实现当字母个数小于10时,不输出0,如个数为5时,输出05,我实现输出5,首先和01H比较,小于就说明是0,跳转
jb ss1
add dl,30h
mov ah,2
int 21h
ss1: mov dl,cl
add dl,30h
;;;;;;;;;;;;;;;;;;;;;;
mov ah,2
int 21h
mov cnt,dl
mov ax,4c00h
int 21h
end start
上面是正确的代码,MASM5.0格式
开始没考虑ah被mov ah,2
int 21h占用,个位数的数字总是显示2,后经反复观察,发现除法指令把商和余数保存在了AH,AL,中,但是21号中断的2号子中断占用了AH,恍然,高兴,,,,,,,,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -