2017-02-24 1 views
2

이상적인 모드에서 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 
+1

그런 다음, makeSound를 호출하는'ret' 명령 4 터지는 전에 스택에 2 바이트를 밀고 있다는 것을 될 수 있을까요? 'debug'를 사용하는 법을 배워야합니다. – Gene

+2

@Gene : TASM 코드라는 것을 감안할 때 기계 코드 모니터 대신 Turbo Debugger를 사용해 보시기 바랍니다. 그럼에도 불구하고 가난한 무식한 학생들에게 컴퓨터 아키텍처의 원리를 설명하기 위해 모든 것 중 _8086_을 선택하기로 결정한이 가학자들은 누구입니까? – doynax

+0

[Asm 8060 프로그램 doest가 콘솔에서 인쇄 할 수 있습니다] (http://stackoverflow.com/questions/42231958/asm-8060-program-doest-print-in-console) –

답변

2

'makeSound'라는 proc 파일을보십시오.
bp를 스택으로 밀어 넣었지만 다시 팝핑하지 않았습니다. 그것은 큰 실수입니다.
2 대신에 "ret 4"를 사용했습니다. proc를 호출하기 전에 한 단어 만 푸시했기 때문에 2입니다.

끝처럼 보일 것입니다 : 나는 또한 당신이 사용하는 것을보고

pop bp 
    ret 2 
endp makeSound 

'@'레이블의 일부. 2 개 (@@)를 사용해야합니다. 예를 들어 :

@@myLabel: 
    **code** 
    jmp @@myLabel 
+0

정말 고마워요! –

+1

@roeiedri Ben R이 제안한 수정에도 불구하고 'a'를 누르면 모든 소리가 차례로 ** 소리가납니다! * 피아노 *는 많은 소음을냅니다! 나는 그'makeSound 호출'명령이'jmp makeSound'가 될 것이라고 생각한다. (제안 된 것들과 다른 수정이 필요하다!) –

관련 문제