assembly - 组装 - 程序按预期工作,但第二次运行时,打印乱码
问题描述
我正在用 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)
解决方案
您的理论(之前运行的记忆仍然存在)可能是正确的,根本不是一个愚蠢的想法。
db 00
只会为单个字节保留空间。因此,对于任何超过 0 字节的输入,您都在 DATA 段的末尾写入。(只需立即按 Enter 将导致您的程序将 a 存储'$'
到该字节。)
您需要db 100 dup(0)
一个包含 100 个零的数组。请参阅TASM 中的 `dup (?)` 是什么意思?
为什么保留空间不足会导致这种特殊行为,我不知道,而且说实话,这不是我对这种错误所期望的行为。但是话又说回来,在我们的职业中,会发生各种奇怪的事情,当您看到问题最可能的原因时,您可以快速修复它并继续您的生活,或者您可以花费数小时排除故障以尝试并准确找出观察到特定行为的原因。这是你的选择。
我不确定 TASM 是否曾用于 16 位以外的任何东西。无论如何,代码看起来肯定是 16 位的,而且这也肯定是由 TASM 组装为 16 位的,否则该model small
子句会出错,因为该子句仅存在于 16 位模式下。
推荐阅读
- android - NDK 构建命令失败:使用 ndk-build 制作任何本机项目时
- performance - 监控会话的 Firestore 使用/性能
- apache-kafka - 我们可以使用 Kafka Streams API 对消息进行顺序处理吗?
- xamarin - 为什么文件打不开?具有依赖注入的 FileProvider
- android - 快速持续推送通知
- jquery - 带有模型和百里香叶的 Spring Boot Ajax 发布表单提交
- linux - bash 脚本中的事件指示符
- postgresql - 合并中的 Concat 函数
- javascript - 如果包装器包含特定元素,则替换 HTML 标记
- walmart-api - 沃尔玛搜索不尊重 responseGroup 参数