首页 > 解决方案 > 组装 - 程序按预期工作,但第二次运行时,打印乱码

问题描述

我正在用 TASM 汇编程序编写程序(老实说,我不知道它是 16 位、x86、64 位还是 8086?。我在 DOSBox 中使用 TASM 进行汇编、链接和测试。

用户输入字符直到用户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

我第一次运行该程序时,它按预期工作。当我使用相同的输入第二次运行相同的程序时,它会在控制台上打印乱码。

我的理论是,我上一次运行的记忆以某种方式复制到下一次运行。这可能是一个非常愚蠢的事情,但我是一个菜鸟......

截屏

我的问题可能是什么?我该如何解决?

编辑:感谢 Mike Nakis 和 Peter Cordes 的解决方案:
问题是我没有为输入保留足够的空间。

整体输入 db 00

只保留一个字节。使固定:

整体输入 db 100 重复(0)

标签: assemblydosx86-16tasmdosbox

解决方案


您的理论(之前运行的记忆仍然存在)可能是正确的,根本不是一个愚蠢的想法。

db 00只会为单个字节保留空间。因此,对于任何超过 0 字节的输入,您都在 DATA 段的末尾写入。(只需立即按 Enter 将导致您的程序将 a 存储'$'到该字节。)

您需要db 100 dup(0)一个包含 100 个零的数组。请参阅TASM 中的 `dup (?)` 是什么意思?

为什么保留空间不足会导致这种特殊行为,我不知道,而且说实话,这不是我对这种错误所期望的行为。但是话又说回来,在我们的职业中,会发生各种奇怪的事情,当您看到问题最可能的原因时,您可以快速修复它并继续您的生活,或者您可以花费数小时排除故障以尝试并准确找出观察到特定行为的原因。这是你的选择。


我不确定 TASM 是否曾用于 16 位以外的任何东西。无论如何,代码看起来肯定是 16 位的,而且这也肯定是由 TASM 组装为 16 位的,否则该model small子句会出错,因为该子句仅存在于 16 位模式下。


推荐阅读