Но когда я запускаю файл, он просто застревает на входе ...
Это потому, что при использовании функции ввода DOS 0Ah, вам нужно заранее указать DOS размер вашего файла.входной буфер.С определением типа ISTR DB 10 DUP(0)
вы фактически запросили отсутствие буфера вообще!
Правильное определение в вашей программе:
ISTR DB 9, 0, 9 DUP(0)
1-й байт определяет размер входного буфера.Поместите его в DesiredNumberOfCharacters + 1 .
2-й байт указывает, сколько символов уже содержится в буфере.Поместите это в ноль .
Вы можете найти гораздо больше информации об этой функции DOS в другом моем посте Как работает буферизованный ввод .
Как только ваш ввод сработает, вам нужно исправить несколько проблемв TOSTACK части вашей программы:
- Инструкция
LOOP
зависит от всего регистра CX
, но вы только заполнили CL
, который является младшим байтомCX
.Просто добавьте mov ch, 0
.
Это, очевидно, означает, что вам также нужно скопировать в BX
вместо BL
при подготовке к FROMSTACK части. - Поскольку пользовательЕсли бы вы не выбрали какой-либо символ, ваша программа должна быть подготовлена к этому случаю.Достаточно будет всего
jcxz EXIT
. - Каждый символ из входного буфера хранится в байте .Таким образом, ваш код не должен читать слова .
.
mov si, offset ISTR + 1
mov cl, [si] ; Characters read 0, 1, 2, ... 8
mov ch, 0
jcxz EXIT
mov bx, cx ; Save count
TOSTACK:
inc si
mov dl, [si] ; This is a byte
push dx ; Don't care about high byte in DH
loop TOSTACK
...
mov cx, bx ; Restore count ( is GT 0 )
FROMSTACK:
pop dx ; Still don't care about DH
mov ah, 02h
int 21h
loop FROMSTACK
EXIT:
mov ax, 4C00h
int 21h
Избавление от slow LOOP
легко:
mov si, offset ISTR + 1
mov cl, [si] ; Characters read 0, 1, 2, ... 8
mov ch, 0
jcxz EXIT
mov bx, cx ; Save count
TOSTACK:
inc si
mov dl, [si] ; This is a byte
push dx ; Don't care about high byte in DH
dec cx
jnz TOSTACK
...
FROMSTACK:
pop dx ; Still don't care about DH
mov ah, 02h
int 21h
dec bx
jnz FROMSTACK
EXIT:
mov ax, 4C00h
int 21h