2011-12-29 68 views
2

我有这段汇编代码来接受一个字符串并显示字符串返回。汇编代码显示字符串

我的问题是我无法弄清楚如何在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 

请大家帮忙!

谢谢。

回答

3

使用执行缓冲输入的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不可用)。我猜想这是无意的,而且这个错误从来没有表现出任何明显的表现。

+0

此外,它可能应该是'mov si,ax',而不是'mov si,al'。只有'movsx'和'movzx'可以将一个8位寄存器值移动到一个16位寄存器,'mov'不能。 – 2011-12-29 08:03:00

+0

非常感谢:)清除了我的疑问! – 2011-12-29 08:13:13