Ошибка бесконечного цикла в коде ассемблера TASM - PullRequest
0 голосов
/ 22 октября 2011

В настоящее время я пишу программу, которая вводит строку, сохраняет ее в памяти, а затем выводит обратно на экран.Но у меня проблемы с решением этой задачи.

Мой исходный код:

IDEAL

MODEL small
STACK 100h

DATASEG

beggining db 100 dup(0)

CODESEG

Start:
   mov ax, @data
   mov ds, ax

   mov bx, offset beggining

myloop:

   mov ah, 06h
   mov dl, 0ffh
   int 21h

   mov [bx], al

   mov dl, [bx]
   mov ah, 02h
   int 21h

   inc bx

   cmp al, 13
   je quit   

   jmp myloop


quit:

   mov  ax, 4c00h
   int  21h


end Start

Когда я запускаю программу с указанным выше исходным кодом, она не работает.Это входит в бесконечный цикл.

Почему моя программа не печатает символы, которые я набрал ранее ??

Кстати, я пишу в TASM.

Ответы [ 2 ]

0 голосов
/ 23 октября 2011

Вы хотите использовать INT 21H функцию 01, которая читает символ из STDIN и выводит его.Таким образом, вместо

mov ah, 06h
mov dl, 0ffh
int 21h

Вы хотите:

mov ah, 01h
int 21h

Функция 01h - это «приготовленный» консольный ввод.Он вводит характер и эхо.Он также проверяет control-C и control-break и завершит вашу программу, если вы нажмете одну из этих клавиш.Он также может интерпретировать расширенные символы, такие как Page Up и т. Д. Я не помню.

Функция 07h - это «необработанный» консольный ввод.Он не проверяет control-C и не выполняет никакой другой предварительной обработки.Он дает вам именно то, что было введено.

Ваш вопрос говорит, что вы должны вывести строку после того, как пользователь нажмет Enter, но я не вижу никакого кода, который выводит строку, которую вы сохранилиbeggining.

(кстати, слово обычно пишется как «начало»)

0 голосов
/ 22 октября 2011

Хотя я не могу скомпилировать и протестировать ваш код там, где я сейчас нахожусь, я считаю, что int 21h / 06h не ждет нажатия клавиши, он просто возвращает 0 для отсутствия клавиши (или расширенной клавиши). Если это так, ваша программа очень ОЧЕНЬ быстро очистит память. Я думаю, вам нужно 21h / 07h, чтобы дождаться нажатия клавиши, если ее нет в буфере клавиатуры.

...