【发布时间】: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 调试问题不同,使用调试器发现单步执行并观察寄存器值的变化并不容易。