鱼C论坛

 找回密码
 立即注册
查看: 4100|回复: 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)。

  1. assume cs:code

  2. code segment
  3. start:
  4.     push cs
  5.     pop ds
  6.     mov ax,0
  7.     mov es,ax
  8.     mov si,offset setscreen
  9.     mov di,200h
  10.     mov cx,offset int7cend-offset setscreen
  11.     cld
  12.     rep movsb
  13.     cli
  14.     mov word ptr es:[7ch*4],200h
  15.     mov word ptr es:[7ch*4+2],0
  16.     sti
  17.         ;以上 安装中断并设置中断向量
  18.     mov ax,4c00h
  19.     int 21h

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

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

  37. sub1:  ;功能:全屏写空格,实现清屏
  38.         push bx
  39.         push cx
  40.         push es
  41.         push ax
  42.         mov bx,0b800h
  43.         mov es,bx
  44.         mov bx,0
  45.         mov ax,0ff20h
  46.         mov cx,2000
  47. sub1s:
  48.         mov word ptr es:[bx],ax
  49.         add bx,2
  50.         loop sub1s
  51.         pop ax
  52.         pop es
  53.         pop cx
  54.         pop bx
  55.         ret
  56.        
  57. sub2:
  58.         push bx
  59.         push cx
  60.         push es
  61.        
  62.         mov bx,0b800h
  63.         mov es,bx
  64.         mov bx,1
  65.         mov cx,2000
  66. sub2s:
  67.         and byte ptr es:[bx],11111000b
  68.         or es:[bx],al
  69.         add bx,2
  70.         loop sub2s
  71.        
  72.         pop es
  73.         pop cx
  74.         pop bx
  75.         ret

  76. sub3:
  77.         push bx
  78.         push cx
  79.         push es
  80.         mov cl,4
  81.         shl al,cl
  82.         mov bx,0b800h
  83.         mov es,bx
  84.         mov bx,1
  85.         mov cx,2000
  86. sub3s:
  87.         and byte ptr es:[bx],10001111b
  88.         or es:[bx],al
  89.         add bx,2
  90.         loop sub3s
  91.         pop es
  92.         pop cx
  93.         pop bx
  94.         ret
  95.        
  96. sub4:
  97.         push cx
  98.         push si
  99.         push di
  100.         push es
  101.         push ds
  102.        
  103.         mov si,0b800h
  104.         mov es,si
  105.         mov ds,si
  106.         mov si,160
  107.         mov di,0
  108.         cld
  109.         mov cx,24
  110. sub4s:
  111.         push cx
  112.         mov cx,160
  113.         rep movsb
  114.         pop cx
  115.         loop sub4s
  116.        
  117.         mov cx,80
  118.         mov si,0
  119. sub4s1:
  120.         mov byte ptr [160*24+si],' '
  121.         add si,2
  122.         loop sub4s1
  123.        
  124.         pop ds
  125.         pop es
  126.         pop di
  127.         pop si
  128.         pop cx
  129.         ret
  130. int7cend:
  131.         nop
  132. code ends
  133. 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-4-25 19:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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