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

Posted 小杰666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编:实验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

结果:

在这里插入图片描述

以上是关于汇编:实验16:安装新的7ch中断例程的主要内容,如果未能解决你的问题,请参考以下文章

汇编:实验13三题

汇编:实验13三题

汇编:实验15:安装新的int9中断例程

汇编:实验15:安装新的int9中断例程

汇编题目:在DOS下,按F1键后改变当前屏幕的显示颜色

汇编入门学习笔记 —— int指令port