【问题标题】:Assembly code to display string显示字符串的汇编代码
【发布时间】:2011-12-29 07:35:24
【问题描述】:

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

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

请帮忙!

谢谢。

【问题讨论】:

    标签: string assembly input dos


    【解决方案1】:

    使用执行缓冲输入的 DOS 函数 0x0a(或代码中的十进制 10)读取输入。 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 的前两个字节。现在,汇编程序——尤其是旧程序——以执行各种技巧来节省空间而闻名。 m1 在调用 DOS 函数 0x0a 后没有使用,所以这可能是故意的(但如果是这样,我不确定为什么更多的 m1 不可用)。我猜这是无意的,而且这个错误从未表现出任何明显的东西。

    【讨论】:

    • 另外,它可能应该是mov si, ax,而不是mov si, al。只有 movsxmovzx 可以将 8 位寄存器值移动到 16 位寄存器,mov 不能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多