Программа сборки не печатает прочитанную строку - PullRequest
0 голосов
/ 12 июня 2019

Я написал следующий код, который позволяет пользователю вводить число и печатать его обратно

.model tiny
.stack 100
.data
    userMsg db 13,10, 'Please enter a number: $'
    dispMsg db 13,10, 'You have entered: $'
    num dw dup 5(?)
.code
mov ax,@data
mov ds,ax

lea dx,userMsg
mov ah,9
int 21h

mov ah,0ah
lea dx,num
int 21h

lea dx,dispMsg
mov ah,9
int 21h

lea dx,num
mov ah,9
int 21h

mov ah,4ch
int 21h

Однако он не печатает номер пользователя, но показывает следующую ошибку:

INT 21h, AH=09h
address: 07131
byte 24h not found after 2000 bytes.
; correct example of INT 21h/9h:
mov dx, offset msg
mov ah,9

Что именно я делаю не так?

1 Ответ

1 голос
/ 17 июня 2019
num dw dup 5(?)

Это своеобразный синтаксис. Собирался ли вообще?
Обычный способ записать это - num dw 5 dup (?), поэтому счетчик повторений ставится перед оператором dup.

О проблеме с печатью номера пользователя, о котором вы говорите в комментарии

Спасибо, я добавил $ и теперь он печатает

Я серьезно сомневаюсь, что печатается введенный номер и ничего больше, потому что вы используете функции DOS 09h и функцию DOS 0Ah неправильно!

Функция DOS.BufferedInput 0Ah ожидает получить от вас указатель в DS:DX, который указывает на структуру с четко определенной структурой.
1-й байт должен указывать, насколько велика область памяти, которая начинается с 3-го байта.
Второй байт предназначен для DOS, чтобы сообщить вам, сколько байтов было введено.

Это пример, который позволит вводить 5 символов. Почему вы спросите, нужно ли мне тогда писать 6? Ну, DOS всегда добавляет байт возврата каретки (13) к введенным символам. Ваш счет в 1-м байте должен сделать это возможным.

num     db      6, 0, 6 dup (0)

Поскольку действительные символы начинаются с num + 2, это будет адрес, который вам нужно передать в функцию DOS.PrintString 09h.
И тут есть небольшая проблема $ -кончающихся символов. Просто замените байт возврата каретки (13) символом $.

xor     bx, bx
mov     bl, [num+1]  ; The count that DOS gave to you
mov     byte ptr [num+2+bx], '$'
mov     dx, offset num+2
mov     ah, 09h
int     21h

до

num     6, 0, 0, 0, 0, 0, 0, 0,

ввод

2 0 1 9

после

num     6, 4, 50, 48, 49, 57, 13, 0

печать

num     6, 4, 50, 48, 49, 57, 36, 0
              ^
              DX
...