汇编题目:编写包含多个功能子程序的中断例程

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

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

(一)用ah寄存器传递功能号:0表示清屏,1表示设置前景色,2表示设置背景色,3表示向上滚动一行;

(二)对于2、3号功能,用al传递颜色值,(al)∈{0,1,2,3,4,5,6,7}。

代码如下:

复制代码
;功能:安装一个新的int7ch中断例程,实现一个子程序 setScreen ,提供如下功能:
; (1)清屏。
; (2)设置前景色。
; (3)设置背景色。
; (4)向上滚动一行

; 入口参数说明:
; (1)每个子程序用 ah 寄存器传递功能号:
; (2)对于2、3号功能,用al传送颜色值,

assume cs:code,ds:data
  data segment  
    err db '   ~~~~~ ah args is error! ~~~~~','$'
    init dw 10 dup(0)
  data ends
    
code segment
    start:
    mov ax,data
    mov ds,ax
    mov ax,0
    mov es,ax
    mov ax,es:[7ch*4]
    mov init[0],ax
    mov ax,es:[7ch*4+2]
    mov init[1],ax
    
    mov es:[7ch*4],offset setScreen
    mov es:[7ch*4+2],cs
    
    
    
    
    mov ax,102h
    int 7ch
    ;call breakPoint
    mov ax,201h
    int 7ch
    ;call breakPoint
    mov ax,300h
    int 7ch
    ;call breakPoint
    mov ax,0h
    int 7ch
    mov ax,400h
    int 7ch
    
    
    mov ax,0
    mov es,ax
    mov ax,data
    mov ds,ax
    mov ax,init[0]
    mov es:[7ch*4],ax
    mov ax,init[1]
    mov es:[7ch*4+2],ax
    
    ok: mov ax,4c00h
    int 21h
    
    
setScreen:
    jmp short setmain
    list dw sub0,sub1,sub2,sub3
    
    setmain:
    cmp ah,3
    ja subErr
    mov bl,ah
    mov bh,0
    shl bx,1
    call word ptr list[bx]
    iret
    
    sub0:    ;清屏
    mov cx,0b800h
    mov es,cx
    mov cx,2000
    mov bx,0
    sub0s:
    mov byte ptr es:[bx],' '
    add bx,2
    loop sub0s
    ret
    
    sub1:    ;设置前景色。
    mov cx,0b800h
    mov es,cx
    mov cx,2000
    mov bx,1
    sub1s:
    and byte ptr es:[bx],11111000b
    or es:[bx],al
    add bx,2
    loop sub1s
    ret
    
    sub2:    ;设置背景色。
    mov cx,0b800h
    mov es,cx
    mov cx,2000
    mov bx,1
    shl al,1
    shl al,1
    shl al,1
    shl al,1
    sub2s:
    and byte ptr es:[bx],10001111b
    or es:[bx],al
    add bx,2
    loop sub2s
    ret
    
    sub3:    ;向上滚动一行
    mov cx,0b800h
    mov es,cx
    mov ds,cx
    mov di,0
    mov si,160
    cli
    mov cx,24
    sub3s:
    push cx
    mov cx,160
    rep movsb
    pop cx
    loop sub3s
    mov cx,160
    mov bx,0
    sub3s1:
    mov byte ptr es:3840[bx],' '
    add bx,2
    loop sub3s1
    ret
    
    
    subErr:    ;显示错误信息
    mov ax,data
    mov ds,ax
    mov ah,9
    mov dx,offset err
    int 21h
    jmp ok
    
    
    
breakPoint:    ;设置断点,用于调试
    pushf
    pop bx
    or bh,3
    push bx
    popf
    ret
    
    code ends
 end start
复制代码

 

posted on   jack_Meng  阅读(1297)  评论(0编辑  收藏  举报

编辑推荐:
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· NetPad:一个.NET开源、跨平台的C#编辑器
历史上的今天:
2015-01-27 在C#获取麦克风输入的声音的波形图

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示

喜欢请打赏

扫描二维码打赏

支付宝打赏

主题色彩