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

我的博客

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

[2010-03-15 09:42] 实验16改进

学习了同学们的程序,发现了更好的方法。自己总是跳不出框框,思维定势。怎么办?

上一个程序,将子程序的偏移地址定义为dw sub1-(int7c-start)+200h。

1.将中断例程放在安装程序start之前,就可以在偏移量中去掉复制指令那段代码占用的字节,变成dw sub1+200h。

2.将中断例程入口地址设置为0020:0000,就可以解决总是以0为基础地址的问题,变成dw sub1。

修改后程序如下:
        assume  cs:code
code    segment

int7c:  jmp     short set
table   dw      sub1,sub2,sub3,sub4
set:    push    bx

        cmp     ah,3
        ja      sret
        mov     bl,ah
        mov     bh,0
        add     bx,bx
        call    word ptr table[bx]

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

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],0
        mov     word ptr es:[4*7ch+2],20h
;注意这里中断例程入口地址的设置
        mov     ax,4c00h
        int     21h

code    ends
        end     start
评论次数(0)  |  浏览次数(1155)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码