首页 > 解决方案 > 汇编 x86 程序。计算输入中的数字

问题描述

你好我只是学习组装,所以我还不太了解很多东西。

我必须编写一个程序,其中用户输入某种行的各种字母数字等。程序应该计算输入中有多少数字并打印出计数器。

这是我的代码:

    .model small
.stack 100h

.data

    buffer      db 100, ?, 100 dup (0)
    count       db 0

.code

start:

    mov ax, @data
    mov ds, ax

    mov dx, offset buffer
    mov ah, 0Ah
    int 21h

    mov ah, buffer
    xor si, si
    xor cx, cx
  .loop:

  .notdigit:

    mov dl, buffer[si]
    inc Si
    cmp dl, 0
    jz .end

    cmp dl, '0'
    jb .notdigit
    cmp dl, '9'
    ja .notdigit
    inc count
    jmp .loop

  .end:

; count contains the digit count


    mov dl, count
    mov ah, 2h
    int 21h

我没有收到任何错误,但是当我运行它时程序并没有真正工作。

这里有什么问题?我应该如何改变它?

标签: assemblyx86countermasmx86-16

解决方案


输入

buffer      db 100, ?, 100 dup (0)

这是 DOS 函数 0Ah 使用的输入缓冲区的正确定义,但是稍后当您想要遍历实际输入字符串时,您需要跳过前 2 个字节,因为它们不是实际输入文本的一部分!
你可以xor si, si换成mov si, 2.

cmp dl, 0
jz .end

DOS 提供给您的输入以回车符(ASCII 13)终止,因此测试零是没有用的。


下面的代码使用AL代替,DL因为生成的汇编代码会更短一些。
存在替代解决方案,但这个最接近你得到的:

    mov     si, 2
.loop:
    mov     al, buffer[si]
    inc     si
    cmp     al, 13
    je      .end
    cmp     al, '0'
    jb      .loop      ;notdigit
    cmp     al, '9'
    ja      .loop      ;notdigit
    inc     count
    jmp     .loop
.end:

输出

mov dl, count
mov ah, 2h
int 21h

DOS函数需要. DL您的计数变量只是一个数字,很可能是一个非常小的数字!
您可以通过添加 48 轻松地将 0 到 9 的小数字转换为各自的字符。

    mov     dl, count
    add     dl, '0'    ;ASCII code for '0' is 48
    mov     ah, 02h
    int     21h

推荐阅读