K
K
Konstantin2019-04-16 11:08:05
assembler
Konstantin, 2019-04-16 11:08:05

Why doesn't it compile? What does 27d mean and where does it come from?

why does the program stop compiling when writing the line mov a, al? How to fix it?
according to which table to look for key codes and where did the code 27d come from (it works with this code)?

code problem area

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
all program code
.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

Answer the question

In order to leave comments, you need to log in

1 answer(s)
P
pfemidi, 2019-04-16
@kostyakos52000

why does the program stop compiling when writing the line mov a, al? How to fix it?

I believe that because the variable 'a' is declared as a word:
and the register 'al' is byte. Again, I suppose (it was not said about what specific error the translator gives) that if the variable 'a' is declared as a byte, then the error should disappear:
For example here , but in general there are many places.
Because the ESC key has an ASCII code of just 27. And the scan code for it is 1, the scan code after executing the 00h interrupt function 16h returns in the 'ah' register, and the ASCII code in 'al'.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question