【问题标题】:The 2nd digit of my first number has the same value as the 1st digit of the 2nd number. I don't know why我的第一个数字的第二个数字与第二个数字的第一个数字具有相同的值。我不知道为什么
【发布时间】:2015-08-09 15:22:17
【问题描述】:

我是汇编语言的新手。我正在尝试添加 2 个只有 2 位数字的整数,但是每当我尝试访问 num1 中的第二个数字时,它就会神秘地访问 num2 的第一个数字。我需要帮助!我真的不知道为什么。顺便说一句,我正在使用 TASM。

这是我的代码。

;-----------------------
.model small
.stack 
.data

num db ?
num2 db ?
result db ?

prompt1 db "Enter 1st number: $"
prompt2 db "Enter 2nd number: $"
prompt3 db "Addition: $"

.code

main proc

;use the data segment
mov ax, @data
mov ds, ax
mov es, ax

;-------input first number--------------------  

;setcursor
mov ah, 02
mov dh, 00h
mov dl, 00h
int 10h

mov ah, 09
lea dx, prompt1
int 21h

mov cx, 02
lea si, num

loop1:
    mov ah, 07
    int 21h

    cmp al, 0Dh
    je outA

    cmp al, '0'
    jge True_A
    jmp false

    True_A:
        cmp al, '9'
        jle True_B
        jmp false


    True_B:
        mov ah, 02
        mov dl, al
        int 21h

        mov [si], al
    jmp next

    next:
    inc si
    dec cx      

    false:

jnz loop1

outA:

mov bl, '$'
mov [si], bl

;--------input 2nd number-----------------------------

;setcursor
mov ah, 02
mov dh, 02h
mov dl, 00h
int 10h

mov ah, 09
lea dx, prompt2
int 21h

mov cx, 02
lea di, num2

loop2:
    mov ah, 07
    int 21h

    cmp al, 0Dh
    je outB

    cmp al, '0'
    jge True_C
    jmp falseA

    True_C:
        cmp al, '9'
        jle True_D
        jmp falseA

    True_D:
        mov ah, 02
        mov dl, al
        int 21h

        mov [di], al
    jmp nextA

    nextA:
    inc di
    dec cx      

    falseA:
jnz loop2

outB:

mov bl, '$'
mov [di], bl

;-------------------------------------- 

mov ah, 02
mov dh, 05h
mov dl, 00h
int 10h

mov ah, 02
mov dl, num + 1
int 21h


mov ax, 4c00h
int 21h

main endp
end main

【问题讨论】:

  • 奥秘是你为你的号码分配了一个字节,所以很明显第二个数字会与第二个数字重叠。您可以改用db ?, ?dw ?。当然,您应该对所有三个数字都这样做。
  • 我照你说的做了。我更改了所有 3 个数字 num1 dw ? num2 dw ? result dw ? 但是当我尝试打印 num1 时,它打印了 2 个数字。 mov ah, 09 lea dx, num1 int 21h
  • 众所周知,int21/09 在打印的字符串末尾需要一个$ 符号。例如,您可以通过 db ?, ?, '$' 嵌入它。
  • 哇。谢谢,我想现在意识到我的错误了。 :D
  • @random:stackoverflow.com/tags/x86/info 上的一些链接可能有助于调试未来的问题。要自己捕捉到这一点,您必须注意到两个变量的指针靠得太近了。与我们在这里遇到的许多 asm 调试问题不同,使用调试器发现单步执行并观察寄存器值的变化并不容易。

标签: assembly x86 tasm


【解决方案1】:
num db ?
num2 db ?
result db ?

两个输入 2 位数字的例程都执行 3 字节大小的内存写入。第一个数字,第二个数字,然后是 $ 字符。但是您只为每个数字定义了一个字节的存储空间。只需更改相关定义。

num    db ?,?,?
num2   db ?,?,?
result db ?,?,?,?

我建议为 result 提供一个额外的存储字节,因为添加可能有 3 位数字。最大值为 99 + 99 = 198

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-04
    • 2018-04-04
    • 2014-12-23
    • 2014-07-08
    相关资源
    最近更新 更多