int 9中断例程-;在屏幕中间依次显示'a'~'z',并可以让人看清。 在显示的过程中,按下Esc键后,改变显示的颜色...
;在屏幕中間依次顯示'a'~'z',并可以讓人看清。
;在顯示的過程中,按下Esc鍵后,改變顯示的顏色
assume cs:code
stack segment
db 128 dup(0)
stack ends
data segment
dw 0, 0
data ends
code segment
start:
;設(shè)置棧
mov ax, stack
mov ss, ax
mov sp, 128
;設(shè)置數(shù)據(jù)段
mov ax, data
mov ds, ax
;--將原來的int 9中斷例程的入口地址保存在ds:0[IP]、ds:2[CS]單元中
mov ax, 0
mov es, ax
push es:[9*4]
pop ds:[0] ;IP
push es:[9*4+2]
pop ds:[2] ;CS
;--在中斷向量表中設(shè)置新的int 9中斷例程的入口地址
mov word ptr es:[9*4], offset int9
mov es:[9*4+2], cs
;--在屏幕中央顯示字符
mov ax, 0b800h
mov es, ax
mov ah, 'a' ;ah保存'a'的ASCII
s:
mov byte ptr es:[160*12+40*2], ah
call delay
inc ah ;ah = ah + 1
cmp ah, 'z' ;
jna s ;if(ah!='z'){jmp short s}
;jna 不高于則轉(zhuǎn)義 cf=1或zf=1
;--將中斷向量表中int 9中斷例程的入口恢復(fù)為原來的地址
mov ax, 0
mov es, ax
push ds:[0]
pop es:[9*4] ;IP
push ds:[2]
pop es:[9*4+2] ;CS
;--程序返回
mov ax, 4c00h
int 21h
;--緩沖顯示字符
delay:
push ax
push dx
mov dx, 1h ;循環(huán)1000 0000次
mov ax, 0 ;(dx)=(高16位) (ax)=(低16位)
s1:
sub ax, 1 ;(低16位[0000])-(1) 借位CF=1
sbb dx, 0 ;(高16位[0001])-0-CF
cmp ax, 0
jne s1 ;jne 不等于則轉(zhuǎn)義
cmp dx, 0
jne s1 ;jne 不等于則轉(zhuǎn)義
pop dx
pop ax
ret
;--新的int 9中斷例程
int9:
push ax
push bx
push es
in al, 60h
;--int指令執(zhí)行過程
; 1、取中斷類型碼
; 2、標(biāo)志寄存器入棧、(IF)=0, (TF)=0
; 3、CS、IP入棧
; 4、(IP)=(n*4)、(CS)=(n*4+2)
;--iret指令執(zhí)行過程
; 1、CS、IP出棧
; 2、標(biāo)志寄存器出棧
;//模擬int
;a、pushf將標(biāo)志寄存器的值壓棧
pushf
;b、將標(biāo)志寄存器 (IF)=0, (TF)=0
pushf ;第二次入棧是為了設(shè)置flag標(biāo)志寄存器中
pop bx
and bh, 11111100b ;將標(biāo)志寄存器 (IF)=0, (TF)=0
push bx
popf ;popf從棧中彈出數(shù)據(jù)送入標(biāo)志寄存器中
;c、執(zhí)行中斷例程
call dword ptr ds:[0] ;對(duì)int指令進(jìn)行模擬,調(diào)用原來的int 9中斷例程
;(IP)=ds:[0] (CS)=ds:[2]
cmp al, 1
jne int9ret
mov ax, 0b800h
mov es, ax
inc byte ptr es:[160*12+40*2+1] ;屬性增加1,改變顏色
int9ret:
pop es
pop bx
pop ax
iret
code ends
end start
?
?
總結(jié)
以上是生活随笔為你收集整理的int 9中断例程-;在屏幕中间依次显示'a'~'z',并可以让人看清。 在显示的过程中,按下Esc键后,改变显示的颜色...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [置顶] 强大的jqu
- 下一篇: MSSQL 2008 数据库变成可疑状态