Код сборки для отображения строки - PullRequest
2 голосов
/ 29 декабря 2011

У меня есть этот фрагмент кода сборки, чтобы принять строку и вывести ее обратно.

Моя проблема в том, что я не могу понять, как именно имя сохраняется в name1, так как мы используем бафф для хранения ввода от пользователя.

Я знаю, что

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

пожалуйста, помогите!

спасибо.

1 Ответ

3 голосов
/ 29 декабря 2011

Входные данные читаются с использованием функции 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 не было доступно).Я предполагаю, что это непреднамеренно, и ошибка просто никогда не проявлялась в чем-либо заметном.

...