У вас есть основная идея, хотя есть несколько деталей.
Во-первых, у вас есть это:
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
при ее возврате. В противном случае ваш счет будет ... "неопределенным".