【问题标题】:Reading a two digit number in assembly and storing it in a variable在汇编中读取两位数并将其存储在变量中
【发布时间】:2013-06-07 15:28:34
【问题描述】:

我需要一个汇编程序从用户那里读取一个两位数,将它存储在一个变量中,然后打印它。 我已经尝试了很多,但无法通过。 这是我的编码。

  .model small
.stack 100h
.data
    msg db "Enter a number: $"
    msg2 db "You have entered: $"
    num1 db 0
    num2 db 0
    temp db 0
    ten db 10
    readNum db 0
    t2 db 0
    t1 db 0
.code
    mov ax,@data
    mov ds,ax

    call read
    call endL
    call write


    proc endL
        mov dl,0ah
        mov ah,02h
        int 21h
        ret
    endp

    proc read
        mov dx,offset msg
        mov ah,09h
        int 21h

        mov ah,01h
        int 21h
        mov num1,al

        mul ten
        mov temp,al

        mov dl,temp
        add dl,48
        mov ah,02h
        int 21h

        mov ah,01h
        int 21h
        mov num2,al
        mov dl,num2
        add dl,temp     
        mov readNum,dl
        ret
    endp

    proc write
        mov dx,offset msg2
        mov ah,09h
        int 21h

        mov al,readNum
        mov ah,00
        div ten

        mov t1,ah
        mov t2,al

        mov dl,t1
        add dl,48
        mov ah,02h
        int 21h

        mov dl,t2
        add dl,48
        mov ah,02h
        int 21h
    endp

mov ax,4c00h
int 21h

end 

根据上面的程序,如果我输入 42,它会给我输入的数字为 85。 我在我的程序中找不到错误。谁能帮帮我。

【问题讨论】:

  • 你在正确的轨道上,但需要“早点开始”。当您从键盘获得输入时,它是一个字符。减去 48(或 30h 或“0”)以转换为字符......在存储之前,然后乘以 10。从那里开始,您大致正确(未经测试!)。你可能可以从那里解决它。有调试器吗?这会有所帮助。
  • 输入和打印输出之间仍然有 16 的差距。
  • 好的...我之前的评论中的错误:减去“0”以转换为数字 - 此时它不是“字符”。对不起。除此之外,您在调试器中看到了什么?

标签: variables assembly tasm


【解决方案1】:

查看以下程序。我已经编辑了你的。 Frank Kotler 已经提到了一个小错误。那就是您没有将用户输入转换为数字。您已将 48 添加到用户输入中。但你必须从中减去 48。

.model small
    .stack 100h
    .data
        msg db "Enter a number: $"
        msg2 db "You have entered: $"
        num1 db 0
        num2 db 0
        temp db 0
        ten db 10
        readNum db 0
        t2 db 0
        t1 db 0
    .code
        mov ax,@data
        mov ds,ax

        call read
        call endL
        call write


        proc endL
            mov dl,0ah
            mov ah,02h
            int 21h
            ret
        endp

        proc read
            mov dx,offset msg
            mov ah,09h
            int 21h

            mov ah,01h
            int 21h
            sub al,48
            mov num1,al

            mov ah,01h
            int 21h
            sub al,48
            mov num2,al     

            mov al,num1
            mul ten
            add al,num2

            mov readNum,al
            ret
        endp

        proc write
            mov dx,offset msg2
            mov ah,09h
            int 21h

            mov al,readNum
            mov ah,00
            div ten

            mov dl,ah
            mov t2,dl

            mov dl,al
            add dl,48
            mov ah,02h
            int 21h

            mov dl,t2
            add dl,48
            mov ah,02h
            int 21h
        endp

    mov ax,4c00h
    int 21h

    end 

【讨论】:

    【解决方案2】:

    除了其他人指出不将 ASCII 值转换为数字之外,我注意到您不必要地使用了太多变量。如果您只需要从用户那里获取一个数字并显示它,则只需要空间来存储该数字即可。

    您可能需要查看this page 作为参考。
    希望它能解决你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-07-17
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多