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

我的博客

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

[2013-03-17 14:02] 实验16

assume cs:code,ss:stack

stack segment
  db 128 dup (0)
stack ends

code segment

int7c:      jmp short set
            table dw sub1,sub2,sub3,sub4             ;入口地址直接定址表
       set: push bx
            cmp ah,3                                 
            ja sret                                  ;判断输入值ah是否有效,无效直接推出循环
            mov bl,ah
            mov bh,0
            add bx,bx                                ;根据ah中的功能号计算对应子程序在table表中的偏移
            call word ptr table[bx]                  ;调用对应的功能子程序
      sret: pop bx
            iret  
            
      sub1: push ax
            push ds
            push bx
            push cx
            mov ax,0b800h
            mov ds,ax
            mov bx,0
            mov cx,2000
     sub11: mov byte ptr [bx],0                       ;将空字符填入屏幕
            add bx,2
            loop sub11
            pop cx
            pop bx
            pop ds
            pop ax
            ret
            
      sub2: push ax
            push ds
            push bx
            push cx
            mov bx,0b800h
            mov ds,bx
            mov bx,1
            mov cx,2000
     sub21: and byte ptr [bx],11111000b
            add [bx],al                               ;将前景色(al值)填入屏幕
            add bx,2
            loop sub21
            pop cx
            pop bx
            pop ds
            pop ax
            ret
            
      sub3: push ds
            push bx
            push cx
            mov bx,0b800h
            mov ds,bx
            mov bx,1
            mov cl,4
            shl al,cl
            mov cx,2000
     sub31: and byte ptr [bx],10001111b
            add [bx],al                               ;将背景色(al值)填入屏幕
            add bx,2
            loop sub31
            pop cx
            pop bx
            pop ds
            ret
            
      sub4: push es
            push ds
            push bx
            push cx
            mov bx,0b800h
            mov es,bx
            mov ds,bx
            mov di,0                                   ;第N行(目标地址)
            mov si,160                                 ;第N+1行(源地址)
            cld
            mov cx,24
     sub41: push cx
            mov cx,160
            rep movsb                                  ;上移一行
            pop cx
            loop sub41
            mov cx,80
     sub42: mov byte ptr [bx],0
            add bx,2
            loop sub42                                 ;最后一行为空字符
            pop cx
            pop bx
            pop ds
            pop es
            ret
 
int7cend:   nop

start:      mov ax,stack
            mov ss,ax
            mov sp,128                               ;设置栈段
           
            push cs
            pop ds
            mov si,offset int7c                      ;ds:[si]为中断例程源地址
            mov ax,0
            mov es,ax
            mov di,200h                              ;es:[bi]为中断例程目标地址
            mov cx,offset int7cend-offset int7c      ;中断例程长度
            cld
            rep movsb                                ;传递中断例程
           
            cli
            mov word ptr es:[7ch*4],0
            mov word ptr es:[7ch*4+2],020h
            sti                                      ;设置新中断例程的入口地址;考虑到call word ptr取得的是绝对的偏移地址,故入口ip需设置为0 
           
            mov ax,4c00h
            int 21h
            
code ends
end start
评论次数(0)  |  浏览次数(503)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码