***汇编语言 实验16 编写包含多个功能子程序的中断例程

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


实验要求

安装一个新的int7ch中断例程,为显示输出提供如下功能子程序。
    (1)清屏;
    (2)设置前置色;
    (3)设置背景色;
    (4)向上滚动一行。
入口参数说明如下。
    (1)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示想上滚动一行
    (2)对于1、2号功能,用al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}。

参考程序

;安装一个新的int7ch终端例程,为显示输出提供如下功能子程序
;入口参数:
    ;ah传递功能号
    ;al传递颜色值
assume cs:code
code segment
start:
    mov bx,cs
    mov ds,bx
    mov si,offset int7ch
    mov bx,0
    mov es,bx
    mov di,200h
    mov cx,offset int7ch_end-offset int7ch
    cld
    rep movsb
    cli
    mov word ptr es:[7ch*4],200h
    mov word ptr es:[7ch*4+2],0
    sti

    mov ah,2
    mov al,2
    int 7ch

    mov ax,4c00h
    int 21h
    ORG 200H
;中断例程
int7ch:
    push ax
    push bx
    jmp begin
    table dw sub0,sub1,sub2,sub3
begin:
    cmp ah,3
    ja sret
    add bl,ah
    mov bh,0
    add bx,bx
    call word ptr table[bx]
sret:
    pop ax
    pop bx
    iret

;清屏
sub0:
    push bx
    push es
    push ds
    push di
    push si
    push cx
    mov bx,0b800h
    mov es,bx
    mov ds,bx
    mov si,160
    mov di,0
    mov cx,24
    cld
sub0s:
    push cx
    mov cx,160
    movsb
    mov cx,80
    mov si,0
    pop cx              ;
    loop sub0s          ;
sub0ss:
    mov word ptr es:[si][160*24],' '
    add si,2
    loop sub0ss
    pop cx
    pop si
    pop di
    pop ds
    pop es
    pop bx
    ret
;改变前景色
sub1:
    push ax
    push bx
    push es
    push cx
    push di
    mov bx,0b800h
    mov es,bx
    mov di,1
    mov cx,2000
sub1s:
    and byte ptr es:[di],11111000b
    or es:[di],al
    add di,2
    loop sub1s
    pop di
    pop cx
    pop es
    pop bx
    pop ax
    ret
;改变背景色  
sub2:
    push bx
    push es
    push cx
    mov cl,4    ;al的取值范围是0-7,只占前4个字节
    shl al,cl   ;但是背景色是第4-6位,所以无法重合,需要左移4位
    mov bx,0b800h
    mov es,bx
    mov bx,1
    mov cx,2000
sub2s:
    and byte ptr es:[bx],10001111b
    or es:[bx],al
    add bx,2
    loop sub2s
    pop cx
    pop es
    pop bx
    ret
;向上滚动一行
sub3:
    push bx
    push es
    push ds
    push di
    push si
    push cx
    mov bx,0b800h
    mov es,bx
    mov ds,bx
    mov di,0
    mov si,160
    cld
    mov cx,24
sub3s:
    push cx
    mov di,0
    mov si,160
    mov cx,160
    rep movsb
    pop cx
    loop sub3s
sub3ss:
    mov byte ptr [160*24+si],' '    ;
    add si,2
    loop sub3ss;最后一行清空
    pop cx
    pop si
    pop di
    pop ds
    pop es
    pop bx
    ret

int7ch_end:
    nop
code ends
end start

中间又断了那么多天,今天是七月十号,就当做暑假第一天吧。
2017年7月10日17:26:42
原文地址:https://www.cnblogs.com/litlife/p/7512768.html