2011-10-22 101 views
0

我正在编写一个程序,它输入一个字符串,将其存储在内存中,然后输出回屏幕。但是我很难解决这个问题。TASM汇编程序代码中的无限循环错误

我的源代码:

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。

+0

看似不好的标题为合理作出的问题... :) – Mysticial

+1

请给从中试图复制该程序的URL或其他资源。 –

回答

0

虽然我不能编译和测试你的代码,但我相信int 21h/06h不会等待一个键被按下,它仅仅为无键(或扩展键)返回0, 。如果是这种情况,你的程序会非常快地丢弃内存。我认为如果键盘缓冲区中没有任何键,则需要21h/07h等待键。

+0

我不记得它,但[Ralf Brorws中断列表](http://www.ctyme.com/intr/rb-2559.htm)说'dl = 0ffh'有特殊的行为。不是我们应该在2011年调试这种问题,但你去:) – user786653

+0

好吧我尝试使用07h,这次没有发生死循环,它甚至显示我的输入。但为什么我的程序不打印我输入的字符? – Linas

+0

尝试使用啊作为06的人物出来。我不记得你是否需要设置stdio输出使用02 –

0

你想使用INT 21H函数01,它从STDIN中读取一个字符并回应它。因此,而不是

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

你想:

mov ah, 01h 
int 21h 

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

功能07h是“原始”控制台输入。它不检查control-C或进行其他预处理。它给你的是什么输入。

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

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