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

安装一个新的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 2016-01-27 14:40  jack_Meng  阅读(1295)  评论(0编辑  收藏  举报

导航