王爽.汇编.第三版.实验16.答案

; int 7c中断例程
; 

assume  cs:code

code segment

start:
    ; 拷贝代码
    mov ax, 0
    mov es, ax
    mov ax, 200h
    mov di, ax

    push cs
    pop ds
    mov ax, offset int7c
    mov si, ax

    mov cx, offset int7c_end - offset int7c

    cld
    rep movsb

    cli
    mov ax, 0
    mov ds, ax
    mov bx, 07ch*4
    mov word ptr ds:[bx], 200h
    mov word ptr ds:[bx+2], 0
    sti

    mov ax, 4c00h
    int 21h

int7c:
    jmp short int7c_code
    ; 注意此处放的是放在绝对地址0:200时,子程序处于的相对地址,
    ; 此方法不好,因为如果程序不是安装在0:200,就会出错
    ; 当如如果直接jmp到标号,是没有问题的
    table dw sub1-int7c+200h, sub2-int7c+200h
int7c_code:
    push ax 
    push bx

    ; 功能号
    cmp ah, 1
    ja int7c_ok
    sub bx, bx
    mov bl, ah

    add bx, bx
    push cs
    pop ds
    ; 200是本中断代码的起始地址,2:是jmp指令的长度。bx索引到相应table位置
    call word ptr [bx+200h+2]
int7c_ok:
    pop bx
    pop ax

    iret

    ; clear screen
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
    ; change text color
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 byte ptr es:[bx], al
    add bx, 2
    loop sub2s

    pop es
    pop cx
    pop bx

    ret
suberror:


    ret

int7c_end:
    nop
code ends

end start
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值