8086CPU的汇编问题。

damimi111 2013-12-25 11:09:55
题目为:
编写完整程序:从键盘输入一系列字符,以字符‘$’为结束符,然后对其中的非数字字符计数(10个以内),并显示出计数结果。

我的代码如下:

DATA SEGMENT
INPUT DB 50H DUP(0) ;将输入内容存入这个
COUNT DB 0
DATA ENDS

STACK SEGMENT STACK
BUFFER DB 20H DUP(0)
STACK ENDS

CODE SEGMENT
ASSUME DS: DATA, SS: STACK, CS: CODE
START:
MOV AX, DATA
MOV DS, AX
MOV AX, STACK
MOV SS, AX
MOV SP, 32
MOV COUNT, 0 ;计数器清零
LEA BX, INPUT

L_INPUT:
MOV AH, 01H
INT 21H

MOV [BX], AL
INC BX

CMP AL, '$'
JNZ L_INPUT ;对每次输入都进行判断,不是'$'则继续输入。

C_INPUT:
INC COUNT ;每扫描一个字符,计数器便加1,之后若扫描到数字则减1,最后剩下的数就是非数字的字符数
LEA BX, INPUT
MOV AL, [BX]
INC BX

CMP AL, '$'
JZ FINAL

CMP AL, 30H
JB C_INPUT

CMP AL, 39H
JA C_INPUT

SUB COUNT, 1 ;如果到这一步则说明扫描的这个是数字,将计数器减1
JMP C_INPUT

FINAL:
SUB COUNT, 1 ;去掉对'$'多算的一次
ADD COUNT, 30H ;根据ASCII码,要显示的是数字0-9
LEA DX, COUNT
MOV AH, 09H
INT 21

MOV AX, 4C00H
INT 21H
CODE ENDS
END START


问题出在,执行程序时,我输入完'$'后,程序就卡死在那里了,非常郁闷。
我不知道是不是因为
LEA DX, COUNT
MOV AH, 09H
INT 21
这个显示指令不能被执行。。。

如果是这个原因的话,应该如何使数据段中存的内容以十进制或是十六进制显示出来呢。。
刚开始学汇编,指令学的还不多,差不多学到的都用在这个程序上了,希望能给出尽量易懂的代码(代码可以很多,易理解就行),谢谢了~~!
...全文
175 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2013-12-25
  • 打赏
  • 举报
回复
LEA BX, INPUT 应该放在 C_INPUT: 之前吧,不然后面过来循环,每次都重置 BX 使得 BX 一直指向第一个字符,故而就死循环了。
COUNT 定义后面应该加个 '$' 字符成 COUNT DB 0, '$',否则就应用字符显示的功能调用而非 ah=9 的字符串显示功能。
接下来的 int 21 漏了十六进制后缀的 h 会变成调用 int 15h 了。
这个显示方法只适合个数不超过 9 的个位形式情况吧。
damimi111 2013-12-25
  • 打赏
  • 举报
回复
自己发现问题也解决了,问题也差不多确实如你所说的那样。谢谢了。

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧