鱼C论坛

 找回密码
 立即注册
查看: 4519|回复: 4

交作业了,实验16 编写包含多个功能子程序的中断例程

[复制链接]
发表于 2011-2-25 23:59:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 china0008 于 2011-2-26 00:01 编辑

;程序目的,安装新的  int 7cH 中断例程,0号功能清屏  1号功能设置前景色 2号功能设置背景色 3号功能向上滚动一行。
;ah传递功能好0  1  2  3 , 对于1  2 功能al传递颜色值 (0-7)。
assume cs:code

code segment
start:
    push cs
    pop ds
    mov ax,0
    mov es,ax
    mov si,offset setscreen
    mov di,200h
    mov cx,offset int7cend-offset setscreen
    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

setscreen:
        jmp short set   ;本条占2字节
    table dw sub1+1D8H,sub2+1D8H,sub3+1D8H,sub4+1D8H     ;编译器计算出的是相对地址,所以需要根据实际修正偏移。

set:
        push bx
        cmp ah,3
        ja sret
        mov bl,ah
        mov bh,0
        add bx,bx
        ;call word ptr table[bx]   ;debug 发现table返回的值是 2A   而 sub1 实际的位置在 0000:0217
        ;理想情况下  table[bx] 指向 31行的第一个字单元,sub1返回的是 子程序sub1的入口偏移地址。
        ;现在问题 table[bx]指不到正确的位置,31行的 sub1返回的也不是正确的入口偏移.(暂时使用修正偏移的方法,希望以后找到更好的方法)
        call word ptr table[bx+1d8H]  
sret:
        pop bx
        iret

sub1:  ;功能:全屏写空格,实现清屏 
        push bx
        push cx
        push es
        push ax
        mov bx,0b800h
        mov es,bx
        mov bx,0
        mov ax,0ff20h
        mov cx,2000
sub1s:
        mov word ptr es:[bx],ax
        add bx,2
        loop sub1s
        pop ax
        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
        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
int7cend:
        nop
code ends
end start
调试这个程序感触颇多,十多分钟写好,调试了将近24小时。思路上完全正确。只是在偏移处因为自己了解的不够透彻才看不到问题所在,最后只要一步一步的debug才找到原因。遇到问题一定要深究,会对学过的知识有一个全新的认识。感谢:小甲鱼 等众多友人的帮助。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-2-26 09:16:51 | 显示全部楼层
俺晕 楼主   138行代码.....会死人的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-2-26 10:48:40 | 显示全部楼层
啊!  不至于不至于。呵呵。其实很简单。就是罗唆而已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-2-26 19:13:27 | 显示全部楼层
:lol虽然看不懂代码,但是觉得版主挺厉害的。
  版主是不是计算机专业的学生??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-2-26 23:04:49 | 显示全部楼层
俺不是计算机专业的。完全是看小甲鱼视频+其推荐的书  然后每道课后题都认真完成。就可以了。 说实话,这只是很简单的程序。原理非常简单。书上写的很清楚。有了思路和方法,代码只是打字而已。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-21 20:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表