xusiman 发表于 2017-2-22 12:37:35

作业实验16

中断程序的编译安装都没问题,下面是中断处理程序:
assume cs:code
code segment

start:mov ax,cs
        mov ds,ax
        mov si,offset s
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset send - offset s
        cld
        rep movsb
       
        cli
        mov word ptr es:,200h
        mov word ptr es:,0
        sti
        mov ax,4c00h
        int 21h
       
s:jmp short set
        table dw sub1-s+200h,sub2-s+200h,sub3-s+200h,sub4-s+200h
       
set:push bx

        cmp ah,3         ;判断功能号是否大于3
        ja sret
        mov bl,ah
        mov bh,0
        add bx,bx          ;根据ah中的功能号计算对应子程序在table表中的偏移
        call word ptr table
       
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:,' '
        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:,11111000b
        or es:,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:,10001111b
        or es:,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
        cld
        mov cx,24
       
sub4s:push cx
        mov cx,160
        rep movsb             ;复制
        pop cx
        loop sub4s
       
        mov cx,80
        mov si,0
sub4s1:mov byte ptr ,' '      ;最后一行清空
        add si,2
        loop sub4s1
        pop ds
        pop es
        pop di
        pop si
        pop cx
        ret
       
send:nop

code ends
end start其实代码就是小甲鱼提供的答案1.但调用该中断程序就出问题了!下面为问题截图和调用代码:

assume cs:code,ds:data
data segment
        db 'I love masm!',0
data ends
code segment
start:mov dh,8
        mov dl,3
        mov cl,24h
        mov ax,data
        mov ds,ax
        mov si,0
        call show_str
        mov ah,1
        mov al,6
        int 7ch
       
        mov ax,4c00h
        int 21h
       
show_str:
        push bx
        push ax
        push di
        push es
        dec dh                ;当前行之前的行数
    dec dl                ;从当前行开始的当前列之前的列数
        mov al,0a0h         ;将160送入al,为下一步乘法运算准备
        mul dh                ;乘法结果在ax中,这步是计算所在行的偏移
    mov di,ax             ;将行偏移数送入di
        mov ax,0b800h
        mov es,ax             ;将段地址b800h送入es
       
        mov al,2            ;将2送入al中,为下一步乘法运算准备
        mul dl                ;乘法结果在ax中,这一步是计算所在列的偏移
        add di,ax             ;将列偏移加上之前保存在di的行偏之和送入di
       
        mov bl,cl
s:mov cl,         ;将ds:si指向的字符数据送入cl
        mov ch,0            ;ch置0
        jcxz ok
        mov al,         ;将ds:si指向的字符数据送入al
        mov ah,bl             ;将颜色信息送入ah
        mov es:,ax      ;将字符及字符颜色等信息送入es:di指向的内存字单元,即显卡缓存
        inc si
        add di,2
        jmp short s
ok: pop es
        pop di
        pop ax
        pop bx
        ret
code ends
end start
页: [1]
查看完整版本: 作业实验16