как я это сделал на экзамене :) подсчитав количество нажатий клавиш - PullRequest
0 голосов
/ 14 апреля 2011

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

Проблема: для микропроцессора 8086 напишите код, который выполняетследующая задача.он запрашивает у пользователя ввод данных и подсчитывает нажатия клавиш.
при выполнении ALP получено первое сообщение «подсчет нажатий клавиш, нажмите escape для остановки».(без кавычек), если пользователь вводит escape, второе сообщение «подсчет нажатий клавиш» отображается, а результат подсчета сохраняется в BX и отображается в двоичном виде.также при нажатии клавиш (при вводе данных) клавиша ввода должна отображаться в следующей строке.

Решение: (что я написал)
.model tiny<br> .data<br> text1 db "counting keypresses,press escape to stop $"<br> text2 db "counting keypresses"<br> .code<br> .startup<br> mov dx,offset text1 ;displaying text1 (i guess so) mov ah,09h<br> int 21h<br> and bx,00h<br> label1 mov ah,01h ;(getting input from user and incrementing bx on every click) int 21h<br> inc bx<br> cmp al,1bh ;comparing with 'escape' np label1<br> mov dx,offset text2 ;if zero then do this i.e display text2 mov ah,09h<br> int 21h<br> mov dx,offset bx ;display bx mov ah,09h<br> int 21h<br> .exit<br> end

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

1 Ответ

1 голос
/ 14 апреля 2011

У вас есть основная идея, хотя есть несколько деталей.

Во-первых, у вас есть это:

cmp al, 1bh
np label1

Я не уверен, что должно означать np. Инструкция, которую вы хотите найти, вероятно, jnz label1. Это произойдет, если флаг Z не установлен, то есть пользователь не нажал ESC.

У вас есть следующее, чтобы отобразить счет:

mov dx,offset bx ;display bx
mov ah,09h
int 21h

Это не сработает. На самом деле, это не должно компилироваться, так как вы не можете взять смещение регистра. Вам нужно сохранить значение из BX в памяти, а затем передать этот адрес памяти в функцию вывода. Итак, определите 2-байтовое значение в вашей области данных:

count dw 0  ; counter for output
      db '$' ; terminate output

Тогда вы можете написать:

move [count],bx
mov dx, offset count
mov ah, 09h
int 21h

Вы сказали, что хотите вывести счет в двоичном виде, но я не уверен, что вы знаете последствия этого. Если пользователь нажимает только две клавиши, выводом будет двоичный 0 и двоичный 2, которые могут отображаться в виде блоков, или вообще ничего, или, возможно, прикольных символов. Я не помню, как функции int21 интерпретируют все управляющие символы. Тем не менее, если пользователь нажмет 13 клавиш, все, что вы получите, это возврат каретки. И если пользователь нажимает 36 символов, вывод будет ... ничего. Потому что 36 - это код ASCII для '$', и это символ выходного терминатора.

Если вы хотите улучшить вывод, вам нужно преобразовать значение в BX в шестнадцатеричное или десятичное (шестнадцатеричное проще) в символы ASCII и вывести их. У меня нет образца под рукой.

Наконец, я не помню, что такое соглашение для функций, сохраняющих регистры int21. Сохраняется ли BX при звонках? Если нет, вам нужно будет push bx перед вызовом любой функции int21 и pop bx при ее возврате. В противном случае ваш счет будет ... "неопределенным".

...