在网上找到利用汇编写的一个背景音乐的程序,我在MASMplus个人版上编辑调试了完全通过,可是在运行时弹出如下窗口内容“NTVDM CPU遇到无效的指令。CS:0202 IP:ff ff ff 03 26 选择“关闭”终止应用程序。”我的电脑主板是Intel ICH9M-E/M SATA AHCI Controller 是不是端口的问题啊?网上说PC上绝大多数的I/O操作都是由系统主机板上的8255(或8255A)可编程外设芯片PPI(Pro.grammable Peripheral Interface)控制,和PC喇叭发音有关的端口是61H。哪位高手帮帮忙呀,非常感谢。源代码如下:
CSEG SEGMENT
ASSUME CS:CSEG,DS:CSEG
COUNT DW 0
countl dw 0
mus_freq dw 6 dup(262,294,330,262,262,294,330,262),-1
mus_time dw 6 dup(4,4,4,4,4,4,4,4)
NEW1CH:push CS
pop ds
cmp count,0
jz next
dec count
IRET
mov si,countl
mov ax,cs:[bx][si]
mov count,ax;
mov dx,countl
mov ah,2
int 21h
pop si
pop bx
pop ax
STI
PUSH DS
PUSH ES
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH BP
PUSH CS
POP DS
PUSH ds
pop es;
mov bx,offset mus_freq
mov si,countl
mov di,[bx][si]
cmp di,-1
jZ lloop
add countl,2
mov dx,12h
mov ax,533h*896
NEXT:push cs
pop ds
push ax
push bx
push si
lea bx,mus_time
POP DX
POP CX
POP BX
POP AX
POP ES
POP DS
IRET;
OLD1CH DD ?
START:
push cs
pop ds
mov al,0b6h
out 43h,al
in al,61h
mov ah,al
or al,3
out 61h,al
push ax
MOV AX,351CH
INT 21H
MOV WORD PTR OLD1CH,BX
MOV WORD PTR OLD1CH+2,ES
MOV DX,OFFSET NEW1CH
MOV AX,251CH
INT 21H;此处插入前台程序
MOV AH,0
INT 16H
LDS DX,OLD1CH
MOV AX,251CH
INT 21H
div di
out 42h,al
mov al,ah
out 42h,al
jmp exit
lloop:mov count,0
mov countl,0
exit:POP BP
POP SI
pop ax
mov al,ah
out 61h,al
MOV AH,4CH
INT 21H
CSEG ENDS
END START
------解决方案--------------------------------------------------------
in/out指令在windows NT中属于特权指令,无法正常完成,如果要执行,有几种办法:
A 在win9x下执行
B 在DOS虚拟机中执行
C 在NT中加载驱动执行
D 在某些未打安全补丁较老的NT版本中通过调试API从Ring3跳至Ring0执行
E 使用开放接口的库来完成,比如WinIO
------解决方案--------------------------------------------------------
每天回帖即可获得10分可用分!
------解决方案--------------------------------------------------------
我来学习的~