汇编学习-实验十六解析

来源:互联网 发布:手机版淘宝闲鱼在哪里 编辑:程序博客网 时间:2024/05/18 01:00

本来按照书上的流程,自己走了一遍,想着是没有问题。可是死活出现不了预想的结果。

在网上查了一下,发现都有这个问题。原因在call word ptr table[bx]这里,对于解析理解的不是很好,只是在setscreen程序之前加上org 200h就可以了。

而org 200的作用是将该指令以后的内容,全部存放在00;[200]起始的位置上。有点纠结。。。

代码如下:

;install int 7ch to realize the test 16assume cs:codecode segmentstart:;传递int 7ch位置mov ax,0mov es,axmov ax,0200hmov di,axmov ax,csmov ds,axmov si,offset setscreenmov cx,offset setscreenend-offset setscreencld rep movsbmov ax,0mov es,axmov word ptr es:[7ch*4],0200hmov word ptr es:[7ch*4 +2],0mov ah,1mov al,1int 7chmov ax,4c00hint 21h;设置屏幕org 200hsetscreen:jmp short settable dw s1,s2,s3,s4set:push bxcmp ah,3ja setretmov bh,0mov bl,ahadd bx,bxcall word ptr cs:table[bx]mov ax,4c00hint 21hsetret:pop bxiret;清屏,将显存中所有字符设置为空格符s1:push bxpush espush cxmov bx,0b800hmov es,bxmov bx,0mov cx,2000s1s:mov byte ptr es:[bx],' 'add bx,2loop s1spop cxpop espop bxret;设置前景色s2:push bxpush espush cxmov bx,0b800hmov es,bxmov bx,1mov cx,2000;前景色存放在0,1,2位置,由al决定s2s:and byte ptr es:[bx],11111000bor byte ptr es:[bx],aladd bx,2loop s2spop cxpop espop bxret;设置背景色s3:push bxpush espush cxmov cl,4shl al,clmov bx,0b800hmov es,bxmov bx,1mov cx,2000;前景色存放在0,1,2位置,由al决定s3s:and byte ptr es:[bx],10001111bor byte ptr es:[bx],aladd bx,2loop s3spop cxpop espop bxret;向上滚动一行s4:push bxpush espush cxpush dipush simov bx,0b800hmov es,bxmov ds,bxmov si,160;指向第二行mov di,0mov cx,24;屏幕共24行clds4s:push cxmov cx,160rep movsbpop cxloop s4smov si,160*24mov cx,80s4ss:mov byte ptr es:[si],' 'add si,2loop s4sspop sipop dipop cxpop espop bxretsetscreenend:nopcode endsend start