鱼C论坛

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

实验16的问题

[复制链接]
发表于 2016-7-31 13:18:21 | 显示全部楼层 |阅读模式

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

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

x
         答案有两种方式 附上代码


            第一种方法代码:

  1. assume cs:code

  2. code segment

  3. ;新的int 7ch中断例程

  4. s:   jmp short set

  5. table    dw sub1,sub2,sub3,sub4

  6. set: push bx

  7.      cmp ah,3           ;判断ah中的功能号是否大于3

  8.      ja sret

  9.      mov bl,ah

  10.      mov bh,0

  11.      add bx,bx          ;计算对应子程序在table表中的偏移

  12.      call word ptr table[bx]     ;调用对应的功能子程序

  13. sret:    pop bx

  14.      iret

  15. ;功能:清屏

  16. sub1:    push bx

  17.      push cx

  18.      push es

  19.      mov bx,0b800h

  20.      mov es,bx

  21.      mov bx,0

  22.      mov cx,2000

  23. subles:  mov byte ptr es:[bx],' '

  24.      add bx,2

  25.      loop subles

  26.      pop es

  27.      pop cx

  28.      pop bx

  29.      ret

  30. ;设置前景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}

  31. sub2:    push bx

  32.      push cx

  33.      push es

  34.      mov bx,0b800h

  35.      mov es,bx

  36.      mov bx,1

  37.      mov cx,2000

  38. sub2s:   and byte ptr es:[bx],11111000b

  39.      or es:[bx],al

  40.      add bx,2

  41.      loop sub2s

  42.      pop es

  43.      pop cx

  44.      pop bx

  45.      ret

  46. ;设置背景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}

  47. sub3:    push ax

  48.      push bx

  49.      push cx

  50.      push es

  51.      mov cl,4

  52.      shl al,cl

  53.      mov bx,0b800h

  54.      mov es,bx

  55.      mov bx,1

  56.      mov cx,2000

  57. sub3s:   and byte ptr es:[bx],10001111b

  58.      or es:[bx],al

  59.      add bx,2

  60.      loop sub3s

  61.      pop es

  62.      pop cx

  63.      pop bx

  64.      pop ax

  65.      ret

  66. ;向上滚动一行

  67. sub4:    push cx

  68.      push si

  69.      push di

  70.      push es

  71.      push ds

  72.      mov si,0b800h

  73.      mov es,si

  74.      mov ds,si

  75.      mov si,160             ;ds:si指向第N+1行

  76.      mov di,0           ;es:di指向第N行

  77.      cld

  78.      mov cx,24          ;共复制24行

  79. sub4s:   push cx

  80.      mov cx,160

  81.      rep movsb          ;复制

  82.      pop cx

  83.      loop sub4s

  84.      mov cx,80

  85. sub4s1:  mov byte ptr [160*24+si],' '     ;最后一行清空

  86.      add bx,2

  87.      loop sub4s1

  88.      pop ds

  89.      pop es

  90.      pop di

  91.      pop si

  92.      pop cx

  93.      ret

  94. send:    nop

  95. start:   mov ax,cs

  96.      mov ds,ax

  97.      mov si,offset s             ;设置ds:si指向源地址

  98.      mov ax,0

  99.      mov es,ax

  100.      mov di,200h            ;设置es:di指向目标地址

  101.      mov cx,offset send-offset s ;设置cx为传输长度

  102.      cld                ;设置传输方向为正

  103.      rep movsb

  104. ;在中断向量表中设置新的int 7ch中断例程的入口地址

  105.      cli                ;设置IF=0屏蔽中断

  106.      mov word ptr es:[7ch*4],0

  107.      mov word ptr es:[7ch*4+2],20h

  108.      sti                ;设置IF=1不屏蔽中断

  109. ;结束

  110.      mov ax,4c00h

  111.      int 21h



  112. code ends

  113. end start
复制代码


  我自己改的代码:

   
  1. assume cs:code

  2. code segment

  3. ;新的int 7ch中断例程

  4. s:   jmp short set

  5. table    dw sub1,sub2,sub3,sub4 ;这里对应的是你这里的代码的偏移地址,但是到了table【bx】中cs当前是0 ,也就是少加了200的偏移地址。可以通过在写偏移变成0短地址写成20h

  6. set: push bx

  7.      cmp ah,3           ;判断ah中的功能号是否大于3

  8.      ja sret

  9.      mov bl,ah

  10.      mov bh,0

  11.      add bx,bx           ;计算对应子程序在table表中的偏移
  12.          
  13.          add bx,2
  14.          
  15.      call word ptr ss:[bx]     ;调用对应的功能子程序

  16. sret:    pop bx

  17.      iret

  18. ;功能:清屏

  19. sub1:    push bx

  20.      push cx

  21.      push es

  22.      mov bx,0b800h

  23.      mov es,bx

  24.      mov bx,0

  25.      mov cx,2000

  26. subles:  mov byte ptr es:[bx],' '

  27.      add bx,2

  28.      loop subles

  29.      pop es

  30.      pop cx

  31.      pop bx

  32.      ret

  33. ;设置前景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}

  34. sub2:    push bx

  35.      push cx

  36.      push es

  37.      mov bx,0b800h

  38.      mov es,bx

  39.      mov bx,1

  40.      mov cx,2000

  41. sub2s:   and byte ptr es:[bx],11111000b

  42.      or es:[bx],al

  43.      add bx,2

  44.      loop sub2s

  45.      pop es

  46.      pop cx

  47.      pop bx

  48.      ret

  49. ;设置背景色,al传送颜色值,(al)∈{0,1,2,3,4,5,6,7}

  50. sub3:    push ax

  51.      push bx

  52.      push cx

  53.      push es

  54.      mov cl,4

  55.      shl al,cl

  56.      mov bx,0b800h

  57.      mov es,bx

  58.      mov bx,1

  59.      mov cx,2000

  60. sub3s:   and byte ptr es:[bx],10001111b

  61.      or es:[bx],al

  62.      add bx,2

  63.      loop sub3s

  64.      pop es

  65.      pop cx

  66.      pop bx

  67.      pop ax

  68.      ret

  69. ;向上滚动一行

  70. sub4:    push cx

  71.      push si

  72.      push di

  73.      push es

  74.      push ds

  75.      mov si,0b800h

  76.      mov es,si

  77.      mov ds,si

  78.      mov si,160             ;ds:si指向第N+1行

  79.      mov di,0           ;es:di指向第N行

  80.      cld

  81.      mov cx,24          ;共复制24行

  82. sub4s:   push cx

  83.      mov cx,160

  84.      rep movsb          ;复制

  85.      pop cx

  86.      loop sub4s

  87.      mov cx,80

  88. sub4s1:  mov byte ptr [160*24+si],' '     ;最后一行清空

  89.      add bx,2

  90.      loop sub4s1

  91.      pop ds

  92.      pop es

  93.      pop di

  94.      pop si

  95.      pop cx

  96.      ret

  97. send:    nop

  98. start:   mov ax,cs

  99.      mov ds,ax

  100.      mov si,offset s             ;设置ds:si指向源地址

  101.      mov ax,20h

  102.      mov ss,ax

  103.      mov di,200h            ;设置es:di指向目标地址

  104.      mov cx,offset send-offset s ;设置cx为传输长度

  105.      cld                         ;设置传输方向为正
  106.          
  107.      mov ax,0

  108.      rep movsb

  109. ;在中断向量表中设置新的int 7ch中断例程的入口地址

  110.      cli                ;设置IF=0屏蔽中断

  111.      mov word ptr es:[7ch*4],200h                              ;偏移地址位

  112.      mov word ptr es:[7ch*4+2],0h                              ;段地址位

  113.      sti                ;设置IF=1不屏蔽中断

  114. ;结束

  115.      mov ax,4c00h

  116.      int 21h



  117. code ends

  118. end start
复制代码



    问题一:   第一种方式正常运行,将int7ch的段地址设置为20h,运行完这个程序,运行其他程序触发了int7ch中断,那时候段地址是不是20h?
                    要是是的话,我自己把ss的值设置为20h,把int7ch中断的段地址写为0,这样写跳转地址的时候写ss:【bx】这样跟第一种方法定位是一样的效果,为什么 我没有成功运行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-7-31 13:29:45 | 显示全部楼层
我个人感觉第一个正常的代码有问题,table【bx】,这应该是cs:【bx】,也就是之前在int7ch中断地址段地址写的是20h所以应该就是 20:【0】,但是这个地址的代码是jmp short set 占两个字节,所以 sub1的地址应该是 20:【2】,才对为什么是这种情况,还有就是 即使第二个方式 没有多加这两个字节 也是不能成功运行的。  
   
   求大神赐教赐教!!!!!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-20 08:36

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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