[2011-06-09 17:32] 15
assume cs:code
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack ;初始化栈段
mov ss,ax
mov sp,128
mov ax,0 ;es:di指向中断向量表0:204
mov es,ax
mov di,204h
push es:[9*4] ;压栈9号中断的中断向量
pop es:[0] ;出栈到es:[0]
push es:[9*4+2]
pop es:[2]
push cs ;压栈cs
pop ds ;出栈到ds
mov si,offset int9 ;ds:[si]指向新的int9中断处理程序
mov cx,offset int9end - offset int9 ;循环次数为标号
;int9end-int9
cld ;设置df=0 及设置
;串传送为正向
rep movsb ;串传送
mov ax,0
mov es,ax
cli ;设置if=0及屏蔽外中断
mov word ptr es:[9*4],204h ;设置中断向量表的
;中断向量指向0:204
mov word ptr es:[9*4+2],0
sti ;if=1恢复接受外中断
mov ax,4c00h ;返回
int 21h
int9: push ax ;压栈关联寄存器
push cx
push es
push di
in al,60h ;读取60h端口的数据送入al
mov di,0 ;指向0:0双字单元中保存的
;地址信息
mov es,di
pushf ;压栈标志寄存器
call dword ptr es:[0] ;将原来的9号中断列程作 ;为子列程调用,上面为什么要压
栈标志寄存器原因是 原中断列程 ;的返回指令是 iret 指令的工作原理是 1.出栈ip 2.出栈cs 3.出栈
;标志寄存器刚好和pushf,call 指令刚好相反
cmp al,9eh ;al和9eh比较不等于则返回
jne next
mov di,0b800h ;等于则在显示满屏的a
mov es,di
mov di,0
mov ah,2
mov al,'A'
mov cx,2000
s: mov es:[di],ax
add di,2
loop s
mov ax,0 ;恢复原int9不然返回后就用不了键盘哦
mov es,ax
push es:[0]
push es:[2]
pop es:[9*4+2]
pop es:[9*4]
next: pop di
pop es ;出栈开始压栈的关联寄存器然后返回
pop cx
pop ax
iret
int9end: nop
code ends
end start
stack segment
db 128 dup (0)
stack ends
code segment
start: mov ax,stack ;初始化栈段
mov ss,ax
mov sp,128
mov ax,0 ;es:di指向中断向量表0:204
mov es,ax
mov di,204h
push es:[9*4] ;压栈9号中断的中断向量
pop es:[0] ;出栈到es:[0]
push es:[9*4+2]
pop es:[2]
push cs ;压栈cs
pop ds ;出栈到ds
mov si,offset int9 ;ds:[si]指向新的int9中断处理程序
mov cx,offset int9end - offset int9 ;循环次数为标号
;int9end-int9
cld ;设置df=0 及设置
;串传送为正向
rep movsb ;串传送
mov ax,0
mov es,ax
cli ;设置if=0及屏蔽外中断
mov word ptr es:[9*4],204h ;设置中断向量表的
;中断向量指向0:204
mov word ptr es:[9*4+2],0
sti ;if=1恢复接受外中断
mov ax,4c00h ;返回
int 21h
int9: push ax ;压栈关联寄存器
push cx
push es
push di
in al,60h ;读取60h端口的数据送入al
mov di,0 ;指向0:0双字单元中保存的
;地址信息
mov es,di
pushf ;压栈标志寄存器
call dword ptr es:[0] ;将原来的9号中断列程作 ;为子列程调用,上面为什么要压
栈标志寄存器原因是 原中断列程 ;的返回指令是 iret 指令的工作原理是 1.出栈ip 2.出栈cs 3.出栈
;标志寄存器刚好和pushf,call 指令刚好相反
cmp al,9eh ;al和9eh比较不等于则返回
jne next
mov di,0b800h ;等于则在显示满屏的a
mov es,di
mov di,0
mov ah,2
mov al,'A'
mov cx,2000
s: mov es:[di],ax
add di,2
loop s
mov ax,0 ;恢复原int9不然返回后就用不了键盘哦
mov es,ax
push es:[0]
push es:[2]
pop es:[9*4+2]
pop es:[9*4]
next: pop di
pop es ;出栈开始压栈的关联寄存器然后返回
pop cx
pop ax
iret
int9end: nop
code ends
end start
评论次数(0) |
浏览次数(429) |
类型(汇编作业) |
收藏此文 |