鱼C论坛

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

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

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

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

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

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

历时一个月,终于将要把8086汇编学完了,开始学习最后一章。

  1. ;实验16
  2. ;功能:安装中断例程,并调用;(调用程序独立)
  3. ;功能1.清屏;功能2.改变前景色;3.改变背景色;4.向上滚动一行.
  4. ;条件:当ah=0时,清屏;当ah=1,al={0~7},改变前景色;当ah=2,al={0~7},改变背景色;当al=3,向上滚动一行
  5. assume cs:code
  6. code segment
  7. ;****************中断主程序开始****************;
  8. setscreen:        jmp short set

  9.         table        dw sub1,sub2,sub3,sub4        ;功能号偏移地址表
  10.                
  11.         set:        push bx
  12.         
  13.                         cmp ah,3        ;判断功能号是否大于3
  14.                         ja sret
  15.                         mov bl,ah
  16.                         mov bh,0
  17.                         add bx,bx        ;判断ah中的功能号计算对于的子程序在table表中的偏移
  18.                         call word ptr table[bx]        ;cs的值是:0020h,table的偏移地址是:2h,因为,jmp short set 占了两个字节;

  19.         sret:        pop bx
  20.                         iret
  21. ;****************中断主程序结束****************;

  22. ;****************中断子程序开始****************;
  23. ;清屏
  24.         sub1:        push bx
  25.                         push cx
  26.                         push es

  27.                         mov bx,0b800h        ;显示缓冲区
  28.                         mov es,bx
  29.                         mov bx,0                ;字符位

  30.                         mov cx,2000                ;每页2000个显示位
  31.         sub1s:        mov byte ptr es:[bx],' '
  32.                         add bx,2
  33.                         loop sub1s

  34.                         pop es
  35.                         pop cx
  36.                         pop bx
  37.                         ret
  38. ;设置前景色
  39.         sub2:        push bx
  40.                         push cx
  41.                         push es

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

  45.                         mov cx,2000                ;每页2000个显示位
  46.         sub2s:        mov byte ptr es:[bx],al        ;前景色代码为0-7
  47.                         add bx,2
  48.                         loop sub2s

  49.                         pop es
  50.                         pop cx
  51.                         pop bx
  52.                         ret        
  53. ;设置背景色
  54.         sub3:        push ax
  55.                         push bx
  56.                         push cx
  57.                         push es

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

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

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

  67.                         pop es
  68.                         pop cx
  69.                         pop bx
  70.                         pop ax
  71.                         ret        
  72. ;向上滚动一行
  73.         sub4:        push cx
  74.                         push ds
  75.                         push si
  76.                         push es
  77.                         push di

  78.                         mov cx,0b800h
  79.                         mov es,cx
  80.                         mov di,0        ;es:di指向N行
  81.                         mov ds,cx
  82.                         mov si,160        ;ds:si指向N+1行

  83.                         cld                        ;正向复制
  84.                         mov cx,24        ;复制24行
  85.         sub4a:        push cx
  86.                         mov cx,160        ;每行复制160个字符
  87.                         rep movsb        ;si和di会自动递增160
  88.                         pop cx
  89.         loop sub4a
  90.         
  91.         ;此时ds:si指向第24行,第0个字节。
  92.                         mov cx,80        ;处理80个字符
  93.         sub4b:        mov byte ptr [si],' '         ;最后一行清空
  94.                         add si,2
  95.         loop sub4b

  96.                         pop di
  97.                         pop es
  98.                         pop si
  99.                         pop ds
  100.                         pop cx
  101.                         ret
  102. ;****************中断子程序结束****************;
  103.         send:        nop

  104. ;**********************************************;
  105.         start:        ;中断安装程序开始
  106.                 mov ax,cs
  107.                 mov ds,ax
  108.                 mov si,offset setscreen                                        ;设置ds:si指向源地址
  109.                
  110.                 mov ax,0
  111.                 mov es,ax
  112.                 mov di,200h                                                                ;设置es:di指目标地址
  113.                
  114.                 mov cx,offset send - offset setscreen        ;设置cx为传输长度
  115.                 cld                                                                                ;设置方向为正
  116.                 rep movsb
  117. ;中断安装程序结束

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

  123.                 mov ax,4c00h
  124.                 int 21h
  125. ;**********************************************;
  126. code ends

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 00:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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