@kostyakos52000
student

Почему не компилируется? Что значит 27d и откуда оно берётся?

почему при написании строки mov a, al программа перестаёт компилироваться? Как это исправить?
по какой таблице смотреть коды клавиш и откуда взялся код 27d (с данным кодом работает)?
проблемная область кода

fill: ; основной цикл
;ввод в переменную кода клавиши
mov ah,0 ;ожидание нажатия клавиши
int 16h
cmp al,27d ;проверка кода клавиши ESC
je endprg_; перепрыгнуть на метку, завершить программу

; mov a,al ; !!!!!!!!!!debug!!!!!!!!!!!! строка, вызывающая ошибку компиляции
;вычисление формулы периода
mov ax, 50
add ax, a
mov bl, 2
div bl
mov time, ax
mov di, 200
mov bx, time
call sound ; вызов функции для воспроизведения звука
loop fill
весь код программы
.286 
	.model	small
        .stack 256h
        .data

	

msg label byte ;стуктура для ввода символов с клавиатуры
maxnum db 6 ; переменная для перевода символов в число
reallen db (?)
numfld db 6 dup (?)
x dw ?
mult10 dw 1

          
txt db 'введите тон звучания ',10,13,'$'
txt1 db 'введите длительность звуания' 
a dw 30 ; test
ton  dw  200 ; test
time dw 100

        .code
asbin proc
  mov MULT10,0001
  mov x,0
  mov cx,10
  lea si,numfld-1
  mov bl,reallen
  sub bh,bh

b20:
  mov al,[si+bx]
	and ax,000fh
	mul MULT10
	add X,ax
	mov ax,MULT10
	mul cx
	mov MULT10,ax
	dec bx
	jnz b20
	ret
asbin endp 

sound proc
	mov 	al,0B6h  ;загрузка управлющего слова в  таймер
	out	43h,al   ;
	mov	dx,0014h ; задание мах периода звука
	mov	ax,4F38h


	div	di       ; вычисление фактиеского преиода звука
	out	42h,al   ;загрузка младшего байта периода звука в таймер
	mov	al,ah
	out	42h,al   ; загрузка старшего 
	in	al,61h  ;чтение порта состояния динамика
	mov	ah,al   ;сохраниение значение порта состояния в 
	or	al,3     ;включение звука установкой 2х младших бит в единицу
	out	61h,al  ;динамик начинает звучать

l1:	mov	cx,2801h  ;задержка в 1 млсек
l2:	loop	l2  ;цикл задержки
	
	dec	bx ;уменьшение длительности звучания на 1 дискрету !!!делаем звук бесконечным, нужно добавить выход по нажатию клавиши
	
	jnz	l1   ;цикл отработки длительности звучания динамика
	mov	al,ah  ;выключение звука от динамика
	out	61h,al
ret
sound endp

main	proc	far
	pusha

;mov ax,@data
;mov ds,ax
;mov ah,9
;lea dx,txt1
;int 21h


;mov ah,0ah ; ввод символов с клавиатуры в буфер msg
;lea dx,msg ; .
;int 21h ;    .
;call asbin ; преобразование символов в число
;mov ax, x ;ввод переменной а
;mov a,ax



	

fill:
	;ввод в переменную кода клавиши
	mov ah,0 ;ожидание нажатия клавиши 
	int 16h
	cmp al,27d ;проверка кода клавиши ESC
	je endprg_; 
;	mov a,al      ;debug but must work
	;вычисление формулы периода
	mov ax, 50
	add ax, a
	mov bl, 2
	div bl
	mov time, ax

	mov di, 200
	mov	bx, time
	call sound
	;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	;...
	;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
	loop fill
endprg_:	
	popa        ;восстановление из стека регистров 
         mov ah,4ch  ; возврат в ОС
         int 21h
	
 main	endp
	end main

  • Вопрос задан
  • 186 просмотров
Решения вопроса 1
@pfemidi
Тут могло бы быть краткое описание меня
почему при написании строки mov a, al программа перестаёт компилироваться? Как это исправить?

Я так полагаю что потому, что переменная 'a' объявлена как слово:

a dw 30 ; test

а регистр 'al' байтовый. Опять полагаю (про то какую конкретно ошибку выдаёт транслятор сказано не было) что если переменную 'a' объявить как байт то ошибка должна пропасть:

a db 30 ; test

по какой таблице смотреть коды клавиш

Например тут, но вообще много где.

и откуда взялся код 27d (с данным кодом работает)?

Потому что у клавиши ESC код ASCII как раз 27. А скан код к неё же 1, скан код после выполнения функции 00h прерывания 16h возвращается в регистре 'ah', а ASCII код в 'al'.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы