【问题标题】:Infinite Loop Error in TASM Assembler CodeTASM 汇编程序代码中的无限循环错误
【发布时间】:2011-10-22 19:31:33
【问题描述】:

我目前正在编写一个程序,它输入一个字符串,将其存储在内存中,然后输出回屏幕。但我无法解决这个任务。

我的源代码:

IDEAL

MODEL small
STACK 100h

DATASEG

beggining db 100 dup(0)

CODESEG

Start:
   mov ax, @data
   mov ds, ax

   mov bx, offset beggining

myloop:

   mov ah, 06h
   mov dl, 0ffh
   int 21h

   mov [bx], al

   mov dl, [bx]
   mov ah, 02h
   int 21h

   inc bx

   cmp al, 13
   je quit   

   jmp myloop


quit:

   mov  ax, 4c00h
   int  21h


end Start

当我使用上面显示的源代码运行程序时,它不起作用。它进入一个无限循环。

为什么我的程序不打印我之前输入的字符??

顺便说一句,我在 TASM 中写作。

【问题讨论】:

  • 一个合理的问题的标题看似糟糕...... :)
  • 请提供您试图复制此程序的 URL 或其他资源。

标签: assembly tasm


【解决方案1】:

虽然我目前无法编译和测试您的代码,但我相信 int 21h/06h 不会等待按键被按下,它只是返回 0 表示无键(或扩展键)。如果是这种情况,您的程序将非常非常快速地浪费内存。如果键盘缓冲区中不存在任何键,我认为您需要 21h/07h 来等待键。

【讨论】:

  • 我也不记得了,但Ralf Brorws interrupt listdl=0ffh 有特殊行为。并不是说我们应该在 2011 年调试这种问题,但是你去吧:)
  • 好的,我尝试使用 07h,这次没有发生无限循环,它甚至显示了我的输入。但是为什么我的程序不打印我输入的字符呢?
  • 尝试使用 ah 作为 06 作为字符输出。我不记得您是否需要将 stdio 输出设置为使用 02
【解决方案2】:

您想使用INT 21H 函数01,它从STDIN 读取一个字符并回显它。所以不是

mov ah, 06h
mov dl, 0ffh
int 21h

你想要:

mov ah, 01h
int 21h

函数01h 是“熟”控制台输入。它输入字符并回显。它还会检查 control-C 和 control-break,如果您按下其中一个键,它将终止您的程序。它也可能解释扩展字符,如 Page Up 等。我不记得了。

函数07h 是“原始”控制台输入。它不检查 control-C 或进行任何其他预处理。它可以准确地为您提供输入的内容。

您的问题说您应该在用户按 Enter 后输出字符串,但我没有看到任何输出您存储在 beggining 的字符串的代码。

(顺便说一句,这个词通常拼写为“开始”)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-12
    • 1970-01-01
    • 2015-04-26
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多