Assembly-程序按预期方式工作,但是第二次运行时,打印出乱码

问题描述 投票:0回答:1

我正在用TASM汇编编写程序(老实说,我不知道它是16位,x86、64位还是8086 ?。我只知道汇编程序是TASM,所以如果您知道TASM使用的是什么,请告诉我)和dosbox

用户输入字符,直到用户按下Enter键。然后打印回用户给出的程序。

这是我的代码:

IDEAL
model small
STACK 100h

DATASEG
wholeinput db 00

CODESEG
start:

mov ax,@data
mov ds,ax
    mov bx, 0 ; bx is the counter

    input:
    mov ah, 1 ; input moves the input to al
    int 21h

    cmp al, 13 ; 0xD is enter key
    je enterPressed ; if its not 'enter' then continue
    add [wholeinput+bx], al ; add the given character to the end of the string

    inc bx    ; inc counter of string length
    jmp input ; continue loop


    enterPressed:
    add [wholeinput+bx], '$' ; add to the last byte of the thing a string terminator
    mov ah, 9
    mov dx, offset wholeinput ; print the whole thing
    int 21h


exit:
mov ax,4c00h
int 21h
END start

现在,该程序可以正常运行,实际上,一切正常。但是,当我运行相同的程序时,没有任何变化。相同的输入。一切都一样它只是打印乱码,没有任何意义。然后,当我重新启动DOSBox并运行它时,它只能再次运行一次。

我的理论是,我之前运行的记忆会以某种方式复制到下一次运行。这可能是很愚蠢的话,但我是菜鸟...

Screenshot

可能是我的问题吗?

assembly dos x86-16 tasm dosbox
1个回答
0
投票

我不确定TASM是否用于16位以外的任何东西;无论如何,代码肯定看起来是16位的,而且TASM也肯定会将其汇编为16位,否则model small子句将给出错误,因为此子句仅以16位模式存在。 >

您的理论完全不是很愚蠢的说法,它很可能是正确的。

我不确定为什么这位拥有约80k声誉的绅士会删除他的答案,但是db 00的确会为单个字节保留空间。而且,如果我没记错我的程序集,则需要db 00 dup(100)或类似的东西来保留100个字节。

为什么不保留足够的空间会导致这种特殊的行为,我不知道,说实话,这不是我从这种错误中所期望的行为。但是话又说回来,在我们的专业中,各种各样的事情都会发生,当您看到问题最可能的原因是什么时,您可以快速解决问题并继续生活,也可以花数小时进行故障排除以尝试解决问题。准确找出为什么观察到特定行为。选择是您的。

© www.soinside.com 2019 - 2024. All rights reserved.