王爽《汇编语言》实验16:编写包含多个功能子程序的中断例程

安装一个新的int 7ch中断例程,提供如下功能

1.清屏
2.设置前景色
3.设置背景色
4.向上滚动一行
入口参数如下(功能号0-3,颜色值0-7):

	(ah) = 功能号,(al) = 颜色值

测试程序:

assume cs:codesg
codesg segment
start:
    mov ah,1
    mov al,4
    int 7ch     ;设置文字颜色为红色

    mov ah,2
    mov al,2
    int 7ch     ;设置背景颜色为绿色

    mov ax,4c00h
    int 21h
codesg ends
end start

int 7ch中断例程:

assume cs:codesg
codesg segment
start:          ;7ch中断例程安装程序
    mov ax,datasg
    mov ds,ax
    mov si,offset setscreen
    mov ax,0
    mov es,ax
    mov di,200h
    mov cx,(offset setscreen_end - offset setscreen)
    cld 
    rep movsb

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

    mov ax,4c00h
    int 21h
codesg ends

datasg segment  ;将中断例程放进一个段内,这样table中的偏移地址才是正确的
setscreen:      ;以下程序和书上一样
    jmp set
    table dw offset sub1,offset sub2,offset sub3,offset sub4
set:push bx

    xor bx,bx
    mov bl,ah
    add bx,bx
    call table[bx]

    pop bx
    iret

sub1:
    push es
    push bx
    push cx

    xor bx,bx
    mov ax,0b800h
    mov es,ax
    mov cx,80*25
s1: mov byte ptr es:[bx],' '
    add bx,2
    loop s1

    pop cx
    pop bx
    pop es
    ret

sub2:
    push es
    push bx
    push cx

    mov bx,0b800h
    mov es,bx
    mov bx,1
    mov cx,80*25
s2: and byte ptr es:[bx],11111000B
    or es:[bx],al
    add bx,2
    loop s2

    pop cx
    pop bx
    pop es
    ret

sub3:
    push es
    push bx
    push cx

    mov cl,4
    shl al,cl
    
    mov bx,0b800h
    mov es,bx
    mov cx,80*25
    mov bx,1
s3: and byte ptr es:[bx],10001111B
    or es:[bx],al
    add bx,2
    loop s3

    pop cx
    pop bx
    pop es
    ret

sub4:
    push cx
    push ds
    push es
    push di
    push si

    mov ax,0b800h
    mov ds,ax
    mov es,ax
    mov si,160
    mov di,0
    cld
    mov cx,160*24
    rep movsb

    mov cx,80
    xor si,si
s4: mov byte ptr ds:[si+160*24],' '
    add si,2
    loop s4

    pop si
    pop di
    pop es
    pop ds
    pop cx
    ret
setscreen_end:
    nop
datasg ends
end start

运行截图:
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值