- Assembly code
assume cs:codesg,ss:stacksgstacksg segment db 128 dup(0)stacksg endscodesg segment;代码域start: mov ax , stacksg mov ss ,ax mov sp , 0080H mov ax , 0H mov ds , ax mov si , 24H;如果(0000:0200)!=0,防止第二次执行程序的时候把0000:0024H的地址写入0000:0200 mov ax , ds:[0024H] cmp ax ,0204h je useprogram mov ax , 0000H mov es , ax mov di , 0200H ;int 9的地址保存到0000:0200中 mov cx , 4h cld REP MOVSBuseprogram:;安装程序 MOV AX , 0h MOV DS , AX;======================================================================================== mov DS:[0024H] ,0204H ;到这里老是出现错误,说这里是无效的cpu指令 mov DS:[0024H+2h] ,0000H;======================================================================================== mov ax , cs mov ds , ax mov si , offset int9install mov ax , 0000h mov es , ax mov di , 0204H mov cx , offset endint9install - offset int9install cld rep movsb mov cx , 0010Hs0: call delay loop s0 mov ax , 4c00h int 21h;cpu空转delay: push ax push dx mov dx , 1000h mov ax , 0s1: sub ax , 1 sbb dx , 0 cmp ax , 0 jne s1 cmp dx , 0 jne s1 pop dx pop ax ret;需要安装的程序int9install: push ax push bx push cx push es in al ,60H pushf call dword ptr ds:[0200H] ;调用真实的int9程序 cmp AL , 9EH jne endint9 mov ax , 0b800H mov es , ax mov di , 0000H mov cx , 0100Hs2: mov es:[di] , 'A' inc di mov es:[di] , 11000101B inc di loop s2endint9: pop es pop cx pop bx pop ax iretendint9install: nopcodesg endsend start
此程序为DOS中的9号中断int 9,此中断是响应键盘中断,
实现的功能为在按下A键松开后显示满屏的A
但是在往0000:0024内存地址写入的时候出现了cpu不能执行的问题【跪求解答】
------解决方案--------------------------------------------------------
在虚拟机上面测试吧
windows上面是不能这样的
------解决方案--------------------------------------------------------
在纯DOS模式下试一试。 因为保护模式下,有些内存是不允许被访问的。
------解决方案--------------------------------------------------------
学习8086汇编,装一个DOSBOX是一个不错的选择。
http://www.dosbox.com
------解决方案--------------------------------------------------------
整体程序就没帮您看了.
个人对您程序中出现无效指令的情况的看法是这样的:
从前面的情况来看:
useprogram:之前是实现保存原INT9向量的,是没有问题的.
问题出现在这-->
useprogram:
;安装程序
MOV AX , 0h
MOV DS , AX
;========================================================================================
mov DS:[0024H] ,0204H ;到这里老是出现错误,说这里是无效的cpu指令
mov DS:[0024H+2h] ,0000H
;========================================================================================
为什么呢?
你也知道,INT9是键盘中断,只要按下键盘它就要响应的.而INT9的入口地址你也知道是存放在(DOUBLE WORD)0:24,而你在这里将0204H和0存在了INT9的向量地址,导致在这执行后INT9的向量入口地址变成了0:204H.--.我自己实践了下.我在WINXP下使用CMD,在0:204H一段是全为0,(估计一般用这段都为0,但不排除有不为0的情况).此后只要你按下键盘,可想而知,INT9一响应,就跑去0:0去执行了.你说!会出现什么情况?
顺便略微看了眼后面,我估计:
一,你是在执行DEBUG时出现T或其他命令在这两句时出现"无效指令"的情况.
二,整体执行这两句应该没问题,但此后一按键盘就出现问题.
三,建议你先把新INT9的代码复制到0:0204后再跟上改中断向量!
其他就没时间帮你看了.
你自己试改下这几句在代码中的位置.