assume cs:code,ss:stack
stack segment
db 16 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,code
mov ds,ax
mov si,offset int9A ;设置数据源
mov ax,0
mov es,ax
mov di,204h ;设置程序存放的地址
mov cx,offset int9Aend-offset int9A
cld
rep movsb ;程序复制写入内存
push es:[9*4]
pop es:[200h]
push es:[9*4+2]
pop es:[202h] ;将原int9例程的入口地址存放
;设置新的中断向量
cli
mov word ptr es:[9*4],204h
mov word ptr es:[9*4+2],0
sti
mov ax,4c00h
int 21h
;--------int9A
int9A:
;如同子程序一样,各种寄存器的保存
push ax
push bx
push dx
push cx
in al,60h;从60h端口读入扫描码
;模拟int9中断调用,以便处理其它硬件细节
pushf
call dword ptr cs:[200h]
cmp al,9eh ;是否为A的断码
jne ok
;调用int10h设置光标
mov ah,2
mov bh,0
mov dh,0
mov dl,0
int 10h
;调用int10h在光标处显示字符
mov ah,9
mov al,'a'
mov bl,7
mov bh,0
mov cx,80*24
int 10h
ok:
pop cx
pop dx
pop bx
pop ax
iret ;程序返回
int9Aend:nop
;-----end .
code ends
end start
- [qingpengchen2011] 我的子程序是没错的,我在想是不是虚拟机的问题 08/08 12:17
- [qingpengchen2011] 嗯~行。我再认真详细看看,谢谢咯 08/08 10:38
- [tomato] 我运行了,不是地址的问题。也没有出现崩溃的现象,不过有的子程序功能好像不太对。子程序书中都有,建议你 08/07 22:07
- [tomato] 还是不行吗?我帮你看一下。 08/07 21:29
- [qingpengchen2011] table等标志的值都是在此安装程序中的偏移地址,所以那些子程序等等的地址都是要重新计算的。这点我倒 08/07 18:10
- [qingpengchen2011] table dw sub0-int7ch+200h,sub1-int7ch+200h,sub2-in 08/07 18:06
- [qingpengchen2011] table dw sub0-int7ch+200h,sub1-int7ch+200h,sub2-in 08/07 18:06
- [tomato] 结果也贴上来晾凉吧。 08/05 23:49
- [tomato] 我看不是死循环的问题,是子程序入口地址错了。告诉你一个解决思路,就是单步跟踪读取子程序地址那个地方, 08/05 23:45
- [tomato] 很有可能是你程序的问题,检查一下是不是死循环了。 08/05 23:41