当前位置: 代码迷 >> 汇编语言 >> 8086CPU的汇编有关问题
  详细解决方案

8086CPU的汇编有关问题

热度:193   发布时间:2016-05-02 04:45:38.0
8086CPU的汇编问题。
题目为:
编写完整程序:从键盘输入一系列字符,以字符‘$’为结束符,然后对其中的非数字字符计数(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
这个显示指令不能被执行。。。

如果是这个原因的话,应该如何使数据段中存的内容以十进制或是十六进制显示出来呢。。
刚开始学汇编,指令学的还不多,差不多学到的都用在这个程序上了,希望能给出尽量易懂的代码(代码可以很多,易理解就行),谢谢了~~!

------解决方案--------------------
LEA BX, INPUT 应该放在 C_INPUT: 之前吧,不然后面过来循环,每次都重置 BX 使得 BX 一直指向第一个字符,故而就死循环了。
COUNT 定义后面应该加个 '$' 字符成 COUNT DB 0, '$',否则就应用字符显示的功能调用而非 ah=9 的字符串显示功能。
接下来的 int 21 漏了十六进制后缀的 h 会变成调用 int 15h 了。
这个显示方法只适合个数不超过 9 的个位形式情况吧。