鱼C论坛

 找回密码
 立即注册
查看: 5172|回复: 1

[技术交流] 实验16重点难点详解!

[复制链接]
发表于 2012-6-21 08:36:20 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 hackiy 于 2012-6-21 08:38 编辑

历时一个月,终于将要把8086汇编学完了,开始学习最后一章。
;实验16 
;功能:安装中断例程,并调用;(调用程序独立) 
;功能1.清屏;功能2.改变前景色;3.改变背景色;4.向上滚动一行. 
;条件:当ah=0时,清屏;当ah=1,al={0~7},改变前景色;当ah=2,al={0~7},改变背景色;当al=3,向上滚动一行
assume cs:code 
code segment
;****************中断主程序开始****************;
setscreen:        jmp short set

        table        dw sub1,sub2,sub3,sub4        ;功能号偏移地址表
                
        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]        ;cs的值是:0020h,table的偏移地址是:2h,因为,jmp short set 占了两个字节; 

        sret:        pop bx
                        iret
;****************中断主程序结束****************;

;****************中断子程序开始****************;
;清屏
        sub1:        push bx
                        push cx
                        push es

                        mov bx,0b800h        ;显示缓冲区
                        mov es,bx
                        mov bx,0                ;字符位

                        mov cx,2000                ;每页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                ;每页2000个显示位
        sub2s:        mov byte ptr es:[bx],al        ;前景色代码为0-7
                        add bx,2
                        loop sub2s

                        pop es
                        pop cx
                        pop bx
                        ret        
;设置背景色
        sub3:        push ax
                        push bx
                        push cx
                        push es

                        mov bx,0b800h        ;显示缓冲区
                        mov es,bx
                        mov bx,1                ;属性位

                        mov cl,4
                        shl        al,cl                ;相当于al*10h,前景色代码为0-10h-70h

                        mov cx,2000                ;每页2000个显示位
        sub3s:        mov byte ptr es:[bx],al
                        add bx,2
                        loop sub3s

                        pop es
                        pop cx
                        pop bx
                        pop ax
                        ret        
;向上滚动一行
        sub4:        push cx
                        push ds
                        push si
                        push es
                        push di

                        mov cx,0b800h
                        mov es,cx
                        mov di,0        ;es:di指向N行
                        mov ds,cx
                        mov si,160        ;ds:si指向N+1行

                        cld                        ;正向复制
                        mov cx,24        ;复制24行
        sub4a:        push cx
                        mov cx,160        ;每行复制160个字符
                        rep movsb        ;si和di会自动递增160
                        pop cx
        loop sub4a
        
        ;此时ds:si指向第24行,第0个字节。
                        mov cx,80        ;处理80个字符
        sub4b:        mov byte ptr [si],' '         ;最后一行清空
                        add si,2
        loop sub4b

                        pop di
                        pop es
                        pop si
                        pop ds
                        pop cx
                        ret
;****************中断子程序结束****************;
        send:        nop

;**********************************************;
        start:        ;中断安装程序开始
                mov ax,cs
                mov ds,ax
                mov si,offset setscreen                                        ;设置ds:si指向源地址
                
                mov ax,0
                mov es,ax
                mov di,200h                                                                ;设置es:di指目标地址
                
                mov cx,offset send - offset setscreen        ;设置cx为传输长度
                cld                                                                                ;设置方向为正
                rep movsb
;中断安装程序结束

;!!!!!!!!!!!!!!!!!!!!!!!!!注册7号中断向量表开始,重点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                mov word ptr es:[7ch*4],0               ;这里的地址以20位的方式去理解. 
                mov word ptr es:[7ch*4+2],20h      ;这样安装完中断向量后,CS段的值就是0020h,偏移地址从0开始。20h*10h+0=200h。
;就不会出现转移定位不准确的问题,因为转移是根据自身偏移地址进行位移的。切记!
;!!!!!!!!!!!!!!!!!!!!!!!!!注册7号中断向量表结束,重点!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

                mov ax,4c00h
                int 21h
;**********************************************;
code ends

end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2021-6-13 17:05:09 | 显示全部楼层
我来看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-23 03:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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