我正在尝试在程序集中创建一个逐字符读取的程序,将其存储在一个数组中然后逐个字符地打印。我知道我可以使用中断来读取和打印字符串,但需要一个自己的代码来了解更多信息。
读取代码,但不知道为什么不打印:
buff dw 0,0,0,0,0,0
len equ 5
mov ah, 1
mov si, 0
read:
mov al b.buff[si]
int 21h
inc si
cmp si, len
jl read
jmp print
mov si, 0
mov ah, 2
print:
mov dl, b.buff [si]
int 21h
inc si
cmp dl, 0
je end
jmp print
end:
答案 0 :(得分:1)
你做错了。不要心疼 - 没有人知道这些东西。
1)您没有告诉我们您正在使用的汇编程序。他们是不同的! (看起来像Eric Isaacson的a86?)
2)您的缓冲区被声明为“word”,但您将其用作“byte”。这可能不会造成太大的伤害。
3)你的缓冲区应该在“数据”部分。你将尝试执行你的缓冲区。这可能会让你非常糟糕。
4)在你的“阅读”循环中,你将缓冲区中的零置于al
,然后读取一个字符(进入al
)并且不对它做任何事情!这是你的两个“大”问题之一。
5)在“阅读”循环结束时,您跳过将si
重置为零并将2加载到ah
的两条线...所以您仍然“正在阅读” ,而不是打印(并在缓冲区中的非预期位置)。这是另一个“大问题”。
6)你的“print”循环需要一个以零结尾的字符串。在“读取”循环结束时,您没有明确地将字符串置零。由于您的缓冲区预先填充了零,这可能不会受到影响,但您可能希望这样做。
7)你没有干净地退回到DOS(int 21h/4Ch
)...除非“结束”这样做(取决于汇编程序?)。
可能会有更多,但这应该让你更接近。