汇编代码显示字符串
问题描述:
我有这段汇编代码来接受一个字符串并显示字符串返回。汇编代码显示字符串
我的问题是我无法弄清楚如何在name1
中存储名称,因为我们使用buff来存储来自用户的输入。
我知道
buff label byte
maxchar db 50
readchar db 0
name1 db 48 dup(0)
是得到的东西与此有关。但我无法理解工作。
.model small
.stack
.data
buff label byte
maxchar db 50
readchar db 0
name1 db 48 dup(0)
m1 db 10,13,"enter name: $"
m2 db 10,13,"your name is: $"
.code
mov ax, @data
mov ds, ax
lea dx, m1
mov ah, 09
int 21h
lea dx, buff
mov ah, 10
int 21h
mov ah,0
mov al, readchar
add ax, 2
mov si, al
mov buff[si],24H ;ascii code for $ to terminate string
lea dx, m2
mov ah, 9
int 21h
lea dx, name1
mov ah, 09
int 21h
mov ah, 4ch
int 21h
end
请大家帮忙!
谢谢。
答
使用执行缓冲输入的DOS函数0x0a(或代码中的十进制数)读取输入。的DS:DX参数指向具有以下格式的缓冲器,其在buff
(或等价maxchar
)在程序中标记的位置:
offset meaning
------ -------------
0 Number of bytes available for the input data (starting at offset 2)
1 A location for DOS to put the number of characters read into the buffer
2 A buffer of bytes that can hold the number of characters specified in
offset 0
所以在代码,DS:DX指向buff
它表示最多可以将50个字符放入缓冲区name1
。它看起来像代码有潜在的问题,因为缓冲区中只有48个字节,但数据结构表明有50个字节。所以输入可能会覆盖m1
的前两个字节。现在,汇编程序 - 特别是旧程序 - 被称为执行各种技巧以节省空间。在调用DOS函数0x0a之后不会使用m1
,所以这可能是有意的(但如果是这样,我不确定为什么更多的m1
不可用)。我猜想这是无意的,而且这个错误从来没有表现出任何明显的表现。
此外,它可能应该是'mov si,ax',而不是'mov si,al'。只有'movsx'和'movzx'可以将一个8位寄存器值移动到一个16位寄存器,'mov'不能。 – 2011-12-29 08:03:00
非常感谢:)清除了我的疑问! – 2011-12-29 08:13:13