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

前言:本实验为王爽老师的《汇编语言》第三版中的实验16(p299)

实验环境:DOSBox 0.74-3

实验任务:

        安装一个新的 int 7ch 中断例程,为显示输出提供如下功能子程序:

        (1)  清屏;
        (2)  设置前景色;
        (3)  设置背景色;
        (4)  向上滚动一行。


        入口参数说明:

        (1) 用 ah 寄存器传递功能号0 表示清屏,表示设置前景色,2 表示设置背景色,3 表示向上滚动一行;
        (2) 对于1、2号功能,用 al 传送颜色值,(al) ∈{0,1,2,3,4,5,6,7}

程序代码:

assume cs:code

code segment 
start: ;安装新的do7ch中断例程到0:200
       mov ax,cs
       mov ds,ax
       mov si,offset do7ch
       mov ax,0
       mov es,ax
       mov di,200h
       mov cx,offset do7chend - offset do7ch
       cld
       rep movsb

       ;设置中断向量表
       cli
       mov word ptr es:[7ch*4],200h  ;es=0
       mov word ptr es:[7ch*4 + 2],0

       ;返回
       mov ax,4c00h
       int 21h

org 200h  ;设定程序段的起始地址(从“org 偏移地址”开始,后面指令的偏移地址将按照设定的起始地址(偏移地址)为起点开始递增)
do7ch: jmp short do7chstart
       table dw sub1,sub2,sub3,sub4  ;存储子程序的偏移地址(一个地址占2字节)
               ;0    2    4    6
               ;ah=0 ah=1 ah=2 ah=3
do7chstart:
       push bx

       mov bl,ah  ;bx存储相应的子程序在table中的偏移
       mov bh,0
       add bx,bx

       call word ptr table[bx]

       pop bx

       mov ax,4c00h
       int 21h      

sub1: ;ah = 0 清屏
      push bx
      push es
      push cx

      mov bx,0b800h
      mov es,bx
      mov bx,0
      mov cx,2000
  s1: mov byte ptr es:[bx],' '
      add bx,2
      loop s1

      pop cx
      pop es
      pop bx

      ret

sub2: ;ah = 1
      ;al = 设置的前景色(0、1、2位)
      push bx
      push es
      push cx

      mov bx,0b800h
      mov es,bx
      mov bx,1
      mov cx,2000
  s2: and byte ptr es:[bx],11111000b  ;将前景色012位清零
      or es:[bx],al  ;设置前景色
      add bx,2
      loop s2
      pop cx
      pop es
      pop bx

      ret

sub3: ;ah = 2
      ;al = 设置的背景色(4、5、6位)
      push bx
      push es
      push cx
      push ax

      mov bx,0b800h
      mov es,bx
      mov bx,1
      mov cl,4
      shl al,cl
      mov cx,2000
  s3: and byte ptr es:[bx],10001111b  ;将背景色456位清零
      or es:[bx],al
      add bx,2
      loop s3
      
      pop ax
      pop cx
      pop es
      pop bx

      ret

sub4: ;ah = 3 向上滚动一行
      push bx
      push ds
      push si
      push es
      push di
      push cx

      mov bx,0b800h
      mov ds,bx
      mov si,160  ;ds:si指向显示区第2行
      mov es,bx
      mov di,0  ;es:di指向显示区第1行
      mov cx,24  ;需要copy 24行
  s4: push cx
      mov cx,160  ;一行有160个字节单元
      cld
      rep movsb  ;该指令执行完成后si、di都+160
      pop cx
      loop s4

      pop cx
      pop di
      pop es
      pop si
      pop ds
      pop bx

      ret

do7chend:
      nop

code ends
end start

1、清屏 功能测试: 

运行以下程序:

assume cs:code

code segment
start: mov ah,0  ;ah=0 清屏
       ;调用新的 int 7ch 中断例程
       int 7ch

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

 运行结果:

2、设置前景色 功能测试: 

运行以下程序:

assume cs:code

code segment
start: mov ah,1  ;ah=1 设置前景色
       mov al,2  ;al传递颜色值(绿色)
       ;调用新的 int 7ch 中断例程
       int 7ch

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

运行结果:

3、设置背景色 功能测试: 

运行以下程序:

assume cs:code

code segment
start: mov ah,2  ;ah=2 设置背景色
       mov al,1  ;al传递颜色值(蓝色)
       ;调用新的 int 7ch 中断例程
       int 7ch

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

运行结果:

4、向上滚动一行 功能测试: 

运行以下程序:

assume cs:code

code segment
start: mov ah,3  ;ah=3 向上滚动一行
       ;调用新的 int 7ch 中断例程
       int 7ch

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

运行结果:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值