汇编:实验16:安装新的7ch中断例程

中断例程装载程序源码:

; 安装新的 7ch 中断例程,实现如下功能的子程序:
; 1) 清屏
; 2) 设置前景色
; 3) 设置背景色
; 4) 向上滚动一行

; 入口参数:
; ah=功能号:0清屏,1前景色,2背景色,3向上滚动一行
; 对于1、2号功能,用al传递颜色值,范围0~7的整数

assume cs:code
code segment
start:
    mov ax,cs
    mov ds,ax
    mov si,offset setscreent ; ds:si指向中断例程的代码
    
    mov ax,0
    mov es,ax
    mov di,200h ; es:di指向中断例程装载位置
    mov cx,offset setsrcend - offset setscreent ; 中断例程长度
    cld
    rep movsb ; 串传输

    ; 设置 7ch 号中断向量
    mov ax,0
    mov es,ax
    mov word ptr es:[7ch*4],200h
    mov word ptr es:[7ch*4+2],0
    
    mov ax,4c00h
    int 21h

; 中断处理程序开始
setscreent:
    jmp short set ; 此指令占2字节
    ; 此dw数据开始地址为 0:200h入口地址+2 即0:202h
    ; sub1为数据标号,dw sub1相当于dw offset sub1
    dw 200h+sub1-setscreent,200h+sub2-setscreent,200h+sub3-setscreent,200h+sub4-setscreent
set:
    push bx
    cmp ah,3  ; 判断功能号是否大于3
    ja sret 
    mov bl,ah
    mov bh,0
    add bx,bx ; ah中的功能号*2=table表中的偏移
    call word ptr cs:[bx+202h] ; 此中断执行时,cs=0
sret:
    pop bx
    iret

sub1: ; 清屏
    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
    ret

sub2: ; 设置字体颜色
    push bx
    push cx
    push es
    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
    pop es
    pop cx
    pop bx
    ret

sub3: ; 设置背景色
    push bx
    push cx
    push es
    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
    pop es
    pop cx
    pop bx
    ret

sub4: ; 向上滚动一行
    push cx
    push si
    push di
    push es
    push ds
    mov si,0b800h
    mov es,si
    mov ds,si
    mov si,160 ; ds:si指向n+1行
    mov di,0   ; es:di指向n行
    cld
    mov cx,24  ; 共复制24行
sub4s:
    push cx
    mov cx,160
    rep movsb  ; 一行复制完,si+=160,di+=160
    pop cx
    loop sub4s
    mov cx,80
    mov si,0
sub4s1:
    mov byte ptr [160*24+si],' '  ; 最后一行清空
    add si,2
    loop sub4s1
    pop ds
    pop es
    pop di
    pop si
    pop cx
    ret
; 中断处理程序结束

setsrcend:
    nop

code ends
end start

测试源码:

; 测试新的 7ch 中断例程

assume cs:code
code segment
    ; 测试清屏
    mov ah,0
    int 7ch

    ; 测试绿色字
    mov ah,1
    mov al,2
    int 7ch

    ; 测试红底
    mov ah,2
    mov al,4
    int 7ch

    ; 向上滚动一行
    mov ah,3
    int 7ch

    mov ax,4c00h
    int 21h
code ends
end

结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值