最近又犯懒,而且效率比较低。好在今天下午有点工夫静下新来调试会程序。
刚看完 第15章,做完了实验15。
包括15.5,我是在看了书之后,试着自己做的,感觉比较有成就感。
这个程序牵扯到许多关于中断、端口还有子程序调用的知识点,比较综合。
读起来很简单,自己写的时候会犯许多错误。
再次验证了编程就是得不停上机的道理。
不过这俩程序相比第10章的课程设计1,难度还是差了一些啊……
上代码~
15.5,按F1键,屏幕变色
assume cs:code
stack segment
db 128 dup(0)
stack ends
code segment
start: mov ax,stack ; init stack
mov ss,ax
mov sp,128
push cs ; mov NI9 to 0:204
pop ds
mov si,offset ni9
mov ax,0
mov es,ax
mov di,204H
mov cx,offset ni9e - offset ni9
cld
rep movsb
; save BIOS origin int9
push es:[9*4] ; IP
pop es:[200H]
push es:[9*4+2] ; CS
pop es:[202H]
; set ni9 as int9
cli
mov word ptr es:[9*4],204H
mov word ptr es:[9*4+2],0
sti
mov ax,4c00H
int 21H
ni9: push ax
push es
push bx
push cx
mov bx,0
mov es,bx
pushf ; call BIOS origin int9
call dword ptr es:[200H]
in al,60H ; get keyboard input from port 60H
cmp al,3bH ; cmp with F1
jne ni9r
; change screen color
mov ax,0b800H
mov es,ax
mov bx,1
mov cx,2000 ; 2000 chars per page
lp: inc byte ptr es:[bx]
add bx,2
loop lp
ni9r: pop cx
pop bx
pop es
pop ax
iret
ni9e: nop
code ends
end start
实验15,松开A键,显示一屏幕A
assume cs:code
stack segment
db 128 dup(0)
stack ends
code segment
start: mov ax,stack ; init stack
mov ss,ax
mov sp,128
push cs ; mov NI9 to 0:204
pop ds
mov si,offset ni9
mov ax,0
mov es,ax
mov di,204H
mov cx,offset ni9e - offset ni9
cld
rep movsb
; save BIOS origin int9
push es:[9*4] ; IP
pop es:[200H]
push es:[9*4+2] ; CS
pop es:[202H]
; set ni9 as int9
cli
mov word ptr es:[9*4],204H
mov word ptr es:[9*4+2],0
sti
mov ax,4c00H
int 21H
ni9: push ax
push es
push bx
push cx
mov bx,0
mov es,bx
pushf ; call BIOS origin int9
call dword ptr es:[200H]
in al,60H ; get keyboard input from port 60H
cmp al,9EH ; cmp with "A" UP
jne ni9r
; change screen color
mov bx,0b800H
mov es,bx
mov bx,0
mov cx,2000 ; 2000 chars per page
lp: mov byte ptr es:[bx],41H
add bx,2
loop lp
ni9r: pop cx
pop bx
pop es
pop ax
iret
ni9e: nop
code ends
end start
发个图~
15.5
实验15