【发布时间】:2018-01-29 17:41:22
【问题描述】:
您好,我正在为学校项目编写游戏,但播放音频文件时遇到问题。 我能够播放该文件,但问题是程序冻结并停止响应用户
音乐文件代码
proc read Near ; Read next sample
push bx
push cx
push dx
mov ah, 3Fh
mov bx, [filehandle]
mov cx, 1
lea dx, [Buffer]
int 21h
jc errorcode
mov al, [Buffer]
xor ah, ah
mov bx, 54
mul bx
; mov ax, dx ; Result is in DX because we need to div by 65536 which is all of AX
shr ax, 8
pop dx
pop cx
pop bx
ret
endp
proc br Near; Print line break
push dx
push ax
mov dl, 10
mov ah, 2
int 21h
mov dl, 13
mov ah, 2
int 21h
pop ax
pop dx
ret
endp
proc PlayMusic Near
mov ah, 3Dh
xor al, al
lea dx, [filename]
int 21h
mov [filehandle], ax
call br
mov al, 90h
out 43h, al
in al, 61h
or al, 3
out 61h, al
cli
mov ax, 0
totalloop:
call read ; Read file
out 42h, al ; Send data
mov bx, ax
mov cx, [delay]
portloop:
loop portloop
mov ax, bx
out 42h, ax ; Send data
mov cx, [delay]
rloop:
loop rloop
call read
jmp totalloop
ret
errorcode:
; Close
sti
mov al, 86h
out 43h, al
mov ah, 3Eh
mov bx, [filehandle]
int 21h
pop dx
pop cx
pop bx
ret
endp PlayMusic
在我调用这个 proc 之后,我调用 int 16h 从用户那里读取一个密钥,但是音乐文件阻止了 IO 有人知道我需要做什么吗? 顺便说一句对不起我的英语不好 而且我是组装新手,所以我不太好
【问题讨论】:
-
那段代码很乱。比如你为什么要从函数
read跳转到errorcode? -
只有在进位标志打开时才会跳转到错误码,也就是说有错误时
-
但它做错了事。它与
read的序言不匹配,甚至没有向调用者发出错误信号。 -
我不认为有很多 86 位处理器(如标题)。我假设您的意思是 16 位或 x86,对吧?
-
@שחרדגן 见PCGPE 1.0 有您需要的所有东西,例如 VGA/VESA、TSR、ISR、PIT、SB、DOOM、Plasma 和 Fire 等等......但是最好的组装新手的所有时代的书是:Assembler a ZX Spectrum 1,但它是捷克语的 Z80 CPU,我不知道有任何翻译....
标签: audio assembly x86 dos tasm