|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
中断程序的编译安装都没问题,下面是中断处理程序:
- 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:[7ch*4],200h
- mov word ptr es:[7ch*4+2],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[bx]
-
- 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:[bx],' '
- 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:[bx],11111000b
- or es:[bx],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:[bx],10001111b
- or es:[bx],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 [160*24+si],' ' ;最后一行清空
- 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,[si] ;将ds:si指向的字符数据送入cl
- mov ch,0 ;ch置0
- jcxz ok
- mov al,[si] ;将ds:si指向的字符数据送入al
- mov ah,bl ;将颜色信息送入ah
- mov es:[di],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
复制代码 |
-
|