注册 登录
编程论坛 汇编论坛

小白,请教汇编,从键盘输入一系列以$为结束符的字符串,然后对其中的非数字字符计数,并显示出计数结果。

阿凡的夏天 发布于 2020-05-04 22:11, 3879 次点击
程序段如下:
DSEG SEGMENT
   BUFF DB 50 DUP('')
   COUNT DW  0
DSEG ENDS

     BEGIN: LEA BX, BUFF
     MOV COUNT, 0
    INPUT: MOV AH, 01        ;从键盘输入一个字符的功能调用
    INT 21H
    MOV [BX], AL
    INC BX
    CMP AL, ‘$’     ;是$结束符吗?
    JNZ INPUT           ;不是,继续输入
    LEA BX, BUFF       ;对非数字字符进行计数
     NEXT: MOV CL, [BX]
    INC BX
    CMP CL, ‘$’     ;是$结束符,则转去显示
    JZ DISP
    CMP CL, 30H       ;小于0是非数字字符
    JB NEXT
    CMP CL, 39H       ;大于9是非数字字符
    JA NEXT
    INC COUNT         ;个数+1
    JMP NEXT
       DISP: ┇ ;16进制数显示程序段(省略)

此题省略了16进制数显示程序段,此段代码,不懂怎么编写
1 回复
#2
Valenciax2020-05-05 06:28
简单题目简单的写,输出方式可以参考Output_ax子程序
程序代码:

DATA SEGMENT
        OutStr db 0dh,0ah            ;回车
        Output db '0',4 dup (20h),0dh,0ah,'$'    ;输出字串含回车
DATA ENDS

CODES SEGMENT
         ASSUME CS:CODES,DS:DATA
START:        MOV     AX,DATA
        MOV     DS,AX
        MOV     ES,AX
        mov     bx,0        ;初始化计数
next:        mov    ah,1        ;输入,显示字符
        int    21h
        cmp     al,'$'        ;比较结束符
        jz    Count        ;输入$跳
        cmp     al,0dh        ;是否enter,也视作结束输入
        jz     Count
        cmp     al,'0'        ;比较'0'
        jb    @f        ;不是数字符跳
        cmp     al,'9'        ;比较'9'
        jbe    next        ;输入数字符,不计,重新输入
@@:        inc     bx        ;累加计数
        jmp     short next    ;重新输入
Count:        mov    ax,bx        ;取值
        lea     di,OutPut    ;指向结果字串   
        call    Output_AX    ;调用程序将ax转为ASCII字串
        lea    dx,OutStr    ;指向输出字串
        mov     ah,9        ;输出
        int    21h

        MOV     AH,4CH
        INT     21H
;----------------------------------------------------------------------------
;
将ax值转为ascii数字,存入es:di
Output_AX:    mov     cx,0         ;清0
                mov     bx,10         ;除法准备
@@:        mov     dx,0         ;清0
                div     bx         ;ds:ax /10 ,若1234 ,除10后,dl得余数4,
                push    dx         ;保存, ax=1234,依次保存4,3,2,1
                inc     cx         ;累加个数
                or      ax,ax         ;是否已除尽
                jnz     @b         ;不是,再除
                mov     bl,cl         ;存个数
@@:        pop     ax          ;后入先出,先印出第一数,然后第二....
                or      al,30h         ;转ascii
                stosb               ;存入字串缓冲
                loop     @b         ;回圈,下一个
                ret
;----------------------------------------------------------------------------
CODES ENDS
END START






1