이상적인 모드에서 8086 어셈블리 및 터보 어셈블러 (TASM)를 사용하여 피아노를 제작하려고합니다. 모든 항목을 실행해도 문제가 없으며 키를 클릭하면 소리가 나지만 다시 클릭하면 전체 화면에 가비지 데이터가 인쇄됩니다.사용자가 키를 친 후에 프로그램이 쓰레기를 표시합니다.
이 TASM 코드에서 문제를 볼 수 있습니까?
IDEAL
MODEL small
STACK 100h
DATASEG
Welcome db "Welcome! Just Try Clicking those buttons on your keyboard $"
CODESEG
start:
mov ax, @data
mov ds, ax
call printWelcome
jmp loopGetKey
loopGetKey:
call getKey
jmp loopGetKey
exit:
mov ax, 4c00h
int 21h
proc printWelcome
mov dx, offset Welcome
mov ah, 9
int 21h
ret
endp printWelcome
proc getKey
waitForKey:
;Check the status of the keyboard
mov ah, 1
int 16h
jz waitForKey
;read key
mov ah, 0
int 16h
;exit if ESC is pressed
cmp al, 1Bh
je exit
cmp al, 61h
je soundA
cmp al, 73h
je soundS
cmp al, 64h
je soundD
cmp al, 66h
je soundF
cmp al, 67h
je soundG
cmp al, 68h
je soundH
cmp al, 6Ah
je soundJ
cmp al, 6Bh
je soundK
cmp al, 6ch
je soundL
jne @continue
soundA:
push 2280
call makeSound
soundS:
push 2031
call makeSound
soundD:
push 1809
call makeSound
soundF:
push 1715
call makeSound
soundG:
push 1521
call makeSound
soundH:
push 1355
call makeSound
soundJ:
push 1207
call makeSound
soundK:
push 2031
call makeSound
soundL:
push 2031
call makeSound
@continue:
ret
endp getKey
proc makeSound
push bp
mov bp, sp
in al, 61h
or al, 00000011b
out 61h, al
mov al, 0b6h
out 43h, al
mov ax, [bp+4]
out 42h, al
mov al, ah
out 42h, al
call delay
call stopSound
ret 4
endp makeSound
proc stopSound
push ax
in al, 61h
and al, 11111100b
out 61h, al
pop ax
ret
endp stopSound
proc delay
push cx
push dx
push ax
mov cx, 0FH
mov dx, 4240H
mov ah, 86H
int 15H
pop ax
pop dx
pop cx
ret
endp delay
END start
그런 다음, makeSound를 호출하는'ret' 명령 4 터지는 전에 스택에 2 바이트를 밀고 있다는 것을 될 수 있을까요? 'debug'를 사용하는 법을 배워야합니다. – Gene
@Gene : TASM 코드라는 것을 감안할 때 기계 코드 모니터 대신 Turbo Debugger를 사용해 보시기 바랍니다. 그럼에도 불구하고 가난한 무식한 학생들에게 컴퓨터 아키텍처의 원리를 설명하기 위해 모든 것 중 _8086_을 선택하기로 결정한이 가학자들은 누구입니까? – doynax
[Asm 8060 프로그램 doest가 콘솔에서 인쇄 할 수 있습니다] (http://stackoverflow.com/questions/42231958/asm-8060-program-doest-print-in-console) –