汇编网首页登录博客注册
sissim的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
友情链接

[2010-03-12 21:12] 实验16

安装7ch中断的程序如下:
        assume  cs:code
code    segment
start:  mov     ax,0
        mov     es,ax
        mov     di,200h
        mov     ax,code
        mov     ds,ax
        mov     si,offset int7c
        mov     cx,offset int7ce-offset int7c
        cld
        rep     movsb

        mov     word ptr es:[4*7ch],200h
        mov     word ptr es:[4*7ch+2],0

        mov     ax,4c00h
        int     21h

int7c:  jmp     short set
        dw      sub1-(int7c-start)+200h,sub2-(int7c-start)+200h,sub3-(int7c-start)+200h,sub4-(int7c-start)+200h
;这里,不能用table dw sub1,sub2...因为table的地址以及定义的子程序的地址,代表这些标号在安装程序中的偏移地址,复制到0:200h后,这些标号所代表的地址应发生变化,而安装程序编译后,标号已经变成数值了,因为不会发生变化,会引起程序的转移发生变化。不知道有没有更好的方法解决这个问题。
set:    push    bx

        cmp     ah,3
        ja      sret
        mov     bl,ah
        mov     bh,0
        add     bx,bx
        call    word ptr cs:202h[bx];这里直接用了202h而没有用table,也是因为相对位移量发生了变化。

sret:   pop     bx
        iret

;以下为子程序1,完成清屏
sub1:   push    ax
        push    bx
        push    cx
        push    es

        mov     bx,0b800h
        mov     es,bx
        mov     bx,0
        mov     cx,2000
sub1s:  mov     byte ptr es:[bx],' '
        add     bx,2
        loop    sub1s

        pop     es
        pop     cx
        pop     bx
        pop     ax
        ret

;以下为子程序2,设置前景色
sub2:   push    bx
        push    cx
        push    es

        cmp     al,0
        jb      sub2e
        cmp     al,7
        ja      sub2e
        mov     bx,0b800h
        mov     es,bx
        mov     bx,1
        mov     cx,2000
sub2s:  and     byte ptr es:[bx],11111000b
        or      es:[bx],al
        add     bx,2
        loop    sub2s

sub2e:  pop     es
        pop     cx
        pop     bx
        ret

;以下为子程序3,完成设置背景色
sub3:   push    ax
        push    bx
        push    cx
        push    es

        cmp     al,0
        jb      sub3e
        cmp     al,7
        ja      sub3e
        mov     cl,4
        shl     al,cl
        mov     bx,0b800h
        mov     es,bx
        mov     bx,1
        mov     cx,2000
sub3s:  and     byte ptr es:[bx],10001111b
        or      es:[bx],al
        add     bx,2
        loop    sub3s

sub3e:  pop     es
        pop     cx
        pop     bx
        pop     ax
        ret

;以下为子程序41,完成向上滚动一行
sub4:   push    cx
        push    si
        push    di
        push    es
        push    ds
        
        mov     si,0b800h
        mov     es,si
        mov     ds,si
        mov     di,0
        mov     si,160
        mov     cx,24
        cld
sub4s:  push    cx
        mov     cx,160
        rep     movsb
        pop     cx
        loop    sub4s
        
        pop     ds
        pop     es
        pop     di
        pop     si
        pop     cx
        ret

int7ce: nop

code    ends
        end     start


调用7ch中断的程序如下:
        assume  cs:code
code    segment
start:  mov     ah,0;修改这里的立即数,分别测试四项功能
        mov     al,3
        int     7ch
        mov     ax,4c00h
        int     21h
code    ends
        end     start
评论次数(0)  |  浏览次数(1080)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码