王爽 《汇编语言》 实验 15

时间:2021-04-10 00:43:59

最近又犯懒,而且效率比较低。好在今天下午有点工夫静下新来调试会程序。

刚看完 第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:codestack segmentdb 128 dup(0)stack endscode segmentstart:mov ax,stack;init stackmov ss,axmov sp,128push cs;mov NI9 to 0:204pop dsmov si,offset ni9mov ax,0mov es,axmov di,204Hmov cx,offset ni9e - offset ni9cldrep movsb;save BIOS origin int9push es:[9*4];IPpop es:[200H]push es:[9*4+2];CSpop es:[202H];set ni9 as int9climov word ptr es:[9*4],204Hmov word ptr es:[9*4+2],0stimov ax,4c00Hint 21Hni9:push axpush espush bxpush cxmov bx,0mov es,bxpushf;call BIOS origin int9call dword ptr es:[200H]in al,60H;get keyboard input from port 60Hcmp al,9EH;cmp with "A" UPjne ni9r;change screen colormov bx,0b800Hmov es,bxmov bx,0mov cx,2000;2000 chars per pagelp:mov byte ptr es:[bx],41Hadd bx,2loop lpni9r:pop cxpop bxpop espop axiretni9e:nopcode endsend start

 

发个图~

 

15.5

王爽 《汇编语言》 实验 15

 

 

实验15

王爽 《汇编语言》 实验 15