能力值:
( LV2,RANK:10 )
2 楼
为什么 键盘不能输入了呢、、、
能力值:
( LV2,RANK:10 )
3 楼
检查了一下午 以为是程序重入问题 所以把以前用栈来保存中断地址换成内存 但是 还是不行
代码如下:
assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
db 128 dup(0)
stacksg ends
datasg segment
int9ip dw 0
int9cs dw 0
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,0
mov es,ax
mov si,0
mov dx,es:[9*4]
mov word ptr int9ip,dx
mov dx,es:[9*4+2]
mov word ptr int9cs,dx ;保存当前的int 9的中断向量
;
mov word ptr es:[9*4],offset int99
mov word ptr es:[9*4+2],cs ;设置int 9中断向量
mov ax,0b800h
mov es,ax
mov di,160*12+2*40 ;第13行中间开始
mov cx,10
;
mov al,'a'
mov ah,7ch ;颜色
mov es:[di+1],ah
;
s:
mov es:[di],al
call time
inc al
loop s ;循环显示
mov dx,int9ip
mov word ptr es:[9*4],dx
mov dx,int9cs
mov word ptr es:[9*4+2],dx ;恢复int 9中断向量
mov ax,4c00h
int 21h ;----------------------------------
int99: ;到这里 CS IP 标志寄存器 已经由硬件完成入栈
mov ah,0fch
mov byte ptr es:[di+1],ah ;恢复向量表
iret
;----------------------------------
;用于延时
time proc
push ax
push bx
mov bx,1000h
mov ax,0
s1:
sub ax,1
sbb bx,0
cmp ax,0
jne s1
cmp bx,0
jne s1
pop bx
pop ax
ret
time endp
codesg ends
end start
继续研究。。。
能力值:
(RANK:260 )
4 楼
原来那个程序的问题没看出来,不过后来这个,你恢复向量表时ES不正确。
能力值:
( LV2,RANK:10 )
5 楼
恩 ES确实没有保护好
以下是改后的代码 我全贴出来吧, 复制过去,编译下就能运行
我想实现的功能是这样的, 在逐个显示字符期间, 如果有键盘按键。就改变原来的字符颜色。 并用改写int 9 中断的方式去实现。
assume cs:codesg,ds:datasg,ss:stacksg
stacksg segment
db 128 dup(0)
stacksg ends
datasg segment
int9ip dw 0
int9cs dw 0
datasg ends
codesg segment
start:
mov ax,datasg
mov ds,ax
mov ax,0
mov es,ax
mov si,0
mov dx,es:[9*4]
mov word ptr int9ip,dx
mov dx,es:[9*4+2]
mov word ptr int9cs,dx ;保存当前的int 9的中断向量
;
mov word ptr es:[9*4],offset int9
mov word ptr es:[9*4+2],cs ;设置int 9中断向量
push es
mov ax,0b800h
mov es,ax
mov di,160*12+2*40 ;第13行中间开始
mov cx,10
;
mov al,'a'
mov ah,7ch ;颜色
mov es:[di+1],ah
;
s:
mov es:[di],al
call time
inc al
loop s ;循环显示
pop es
mov dx,int9ip
mov word ptr es:[9*4],dx
mov dx,int9cs
mov word ptr es:[9*4+2],dx ;恢复int 9中断向量
mov ax,4c00h
int 21h ;----------------------------------
int9: ;到这里 CS IP 标志寄存器 已经由硬件完成入栈
mov ah,0fch
mov byte ptr es:[di+1],ah ;恢复向量表
iret
;----------------------------------
;用于延时
time proc
push ax
push bx
mov bx,1000h
mov ax,0
s1:
sub ax,1
sbb bx,0
cmp ax,0
jne s1
cmp bx,0
jne s1
pop bx
pop ax
ret
time endp
codesg ends
end start
程序运行 和第一次的结果一样, 在显示字符期间按键盘,字符颜色就改变。 但是,程序运行结束 键盘就不能用了,输入不了字符了。
另外,我在time子程序里 S标号的上一句加了 int 9让程序自身产生中断。 运行结果是,字符的颜色改变,键盘能用。 这就奇怪了直接在程序里写int 9和按键触发的int 9应该一样呀 都是是cs ip 寄存器 入栈。iret 恢复。
能力值:
( LV2,RANK:10 )
6 楼
问题 解决了。
三天。