鱼C论坛

 找回密码
 立即注册
查看: 2135|回复: 12

十三章的一个例题,没搞懂,请大牛指点一下,非常感谢!

[复制链接]
发表于 2012-12-19 00:18:56 | 显示全部楼层 |阅读模式
3鱼币
  1. assume cs:code
  2. code segment
  3. start:               
  4. ;===============中断处理程序=========================================
  5.                         mov ax,0                                                ;安装中断处理程序
  6.                         mov es,ax
  7.                         mov di,200h
  8.                        
  9.                         mov ax,cs
  10.                         mov ds,ax
  11.                         mov cx,offset s1end - offset s1        ;传送数据所用到的偏移地址
  12.                        
  13.                         cld                                                                ;数据传送方向
  14.                         rep movsb                                                ;开始传送数据
  15.                        
  16.                         mov ax,0                                                ;定义中断向量
  17.                         mov es,ax
  18.                         mov word ptr es:[7ch*4],200h        ;程序入口偏移地址
  19.                         mov word ptr es:[7ch*4+2],0                ;程序入口段地址

  20.                        
  21. ;============以下为主程序================================================                       


  22.                         mov ax,0b800h                                        ;定义显存位置
  23.                         mov es,ax
  24.                         mov di,160*12
  25.                         mov bx,offset s - offset send
  26.                         mov cx,80
  27.                        
  28.         s:                mov byte ptr es:[di],'!'                  ;执行程序
  29.                         mov byte ptr es:[di+1],41h
  30.                         add di,2
  31.                         int 7ch                                                        ;中断7ch,调用中断处理程序

  32.                         mov ax,4c00h
  33.                         int 21h               
  34.         send:        nop
  35.                                                
  36. ;============需要安装的处理程序============================================
  37.         s1:                push bp
  38.                         mov bp,sp
  39.                         dec cx
  40.                         jcxz ok
  41.                         add [bp+2],bx
  42.                         ;这个是地方是不是要加一条指令,使cpu指向s标号处执行循环呢?
  43.                        
  44.                        
  45.         ok:                pop bp
  46.                         iret
  47.                        
  48.         s1end:        nop
  49.                        
  50.                         code ends
  51. end start ;请大牛指点,问题出在那里了?中断处理程序如何像LOOP指令一样,跳回主程序继续循环执行?非常感谢!
复制代码

最佳答案

查看完整内容

首先,lz你忘了给si赋值 其次,lz应该把36、37行写在38行后面 如果按lz这么写的话,bx应该是"mov ax,4c00h"到标号s的偏移值吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-12-19 00:18:57 | 显示全部楼层
首先,lz你忘了给si赋值
其次,lz应该把36、37行写在38行后面
如果按lz这么写的话,bx应该是"mov ax,4c00h"到标号s的偏移值吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-19 00:46:07 | 显示全部楼层
不需要,因为每次执行add【bp+2】,bx以后cs和ip都已经指向s了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-19 02:50:09 | 显示全部楼层

非常感谢朋友的指点,但是我的这个程序不能正确执行,可不可以帮忙指出问题出在什么地方?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-19 21:08:28 | 显示全部楼层
ycg 发表于 2012-12-19 00:18
首先,lz你忘了给si赋值
其次,lz应该把36、37行写在38行后面
如果按lz这么写的话,bx应该是"mov ax,4c00 ...

一语惊醒梦中人呢!
先谢谢了。
另外,还想请问一下,为什么调用了处理程序后,中断处理程序并没有返回指令,程序又如何返回的呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-19 21:58:10 | 显示全部楼层
lyoal 发表于 2012-12-19 21:08
一语惊醒梦中人呢!
先谢谢了。
另外,还想请问一下,为什么调用了处理程序后,中断处理程序并没有返回 ...

不是有iret指令的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-19 23:24:18 | 显示全部楼层
ycg 发表于 2012-12-19 21:58
不是有iret指令的吗
  1. assume cs:code


  2. code segment
  3. start:       
  4. ;=========================安装中断处理程序================================================
  5.                 mov ax,cs
  6.                 mov ds,ax
  7.                 mov si,offset s0
  8.                
  9.                 mov ax,0
  10.                 mov es,ax
  11.                 mov di,200h
  12.                
  13.                 mov cx,offset s0end - offset s0
  14.                 cld
  15.                 rep movsb
  16.                
  17.                 mov ax,0
  18.                 mov es,ax
  19.                 mov word ptr es:[7ch*4],200h
  20.                 mov word ptr es:[7ch*4+2],0
  21.                
  22.                
  23. ;===========================主程程序分隔线=================================================
  24.                
  25.                        
  26.                 mov ax,cs
  27.                 mov ds,ax
  28.                 mov si,202h
  29.                 mov ax,0b800h
  30.                 mov es,ax
  31.                 mov di,12*160
  32.                
  33.                 jmp near ptr s
  34.                 db 'conversation',0
  35. s:                cmp byte ptr [si],0
  36.                 je ok
  37.                 mov al,[si]
  38.                 mov es:[di],al
  39.                 inc si
  40.                 add di,2
  41.                 mov bx,offset s - offset ok                           ;给出中断处理程序的位移值
  42.                 int 7ch
  43.                
  44. ok:                mov ax,4c00h
  45.                 int 21h
  46.                
  47.                
  48. ;============================中断处理程序=================================================

  49. s0:                push bp
  50.                 mov bp,sp
  51.                 cmp byte ptr [si],0
  52.                 je s0en
  53.                 mov [bp+2],bx
  54.                
  55. s0en:         pop bp
  56.                 iret
  57.                
  58. s0end:        nop


  59.                 code ends
  60. end start
复制代码
这段代码错在那儿,如何改?请多指点一下。谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-20 14:57:34 | 显示全部楼层
lyoal 发表于 2012-12-19 23:24
这段代码错在那儿,如何改?请多指点一下。谢谢!
  1.                mov ax,cs

  2.                 mov ds,ax

  3.                 mov si,0

  4.                 mov ax,0b800h

  5.                 mov es,ax

  6.                 mov di,12*160

  7.                
  8.                 jmp near ptr s

  9.                a db 'conversation',0

  10. s:                cmp byte ptr a[si],0

  11.                 je ok

  12.                 mov al,a[si]

  13.                 mov es:[di],al

  14.                 inc si

  15.                 add di,2

  16.                 mov bx,offset s - offset ok                           

  17.                 int 7ch
复制代码
我把你的代码从主程序到调用中断修改了下
你定义的数据"db 'conversation',0"的偏移地址不是202h,这里的'a'就代表了cs:a的偏移地址
还有你后面56行写错了,是add,不是mov;54行的cmp指令就不用写了,如果[si]是0的话,就不会调用中断了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-20 21:46:58 | 显示全部楼层
ycg 发表于 2012-12-20 14:57
我把你的代码从主程序到调用中断修改了下
你定义的数据"db 'conversation',0"的偏移地址不是202h,这里的 ...

这是教材上的检测点,我才学到十三章,你用的这个解决方法好像是十四章里的。总之非常感谢朋友你的指点。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-12-20 22:00:40 | 显示全部楼层
lyoal 发表于 2012-12-20 21:46
这是教材上的检测点,我才学到十三章,你用的这个解决方法好像是十四章里的。总之非常感谢朋友你的指点。

嗯,貌似是的。那就干脆把定义的数据放到数据段吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-12-20 22:38:44 | 显示全部楼层
我这还原了一下测试题目原先的定义,就可以了,问题就出在,我不知道如何写中断处理程序那里了。谢谢指点迷津!
  1. assume cs:code
  2. data segment
  3. db 'conversation',0
  4. data endscode segment
  5. start:
  6. ;=========================安装中断处理程序================================================
  7.   mov ax,cs
  8.   mov ds,ax
  9.   mov si,offset s0
  10.   
  11.   mov ax,0
  12.   mov es,ax
  13.   mov di,200h
  14.   
  15.   mov cx,offset s0end - offset s0
  16.   cld
  17.   rep movsb
  18.   
  19.   mov ax,0
  20.   mov es,ax
  21.   mov word ptr es:[7ch*4],200h
  22.   mov word ptr es:[7ch*4+2],0
  23.   
  24.   
  25. ;===========================主程程序分隔线=================================================
  26.   
  27.    
  28.   mov ax,data
  29.   mov ds,ax
  30.   mov si,0
  31.   mov ax,0b800h
  32.   mov es,ax
  33.   mov di,12*160
  34.   
  35.   
  36.   ;db 'conversation',0     ;这里的偏移地址不是202h,我有白吃了。s:  cmp byte ptr [si],0
  37.   je ok
  38.   mov al,[si]
  39.   mov es:[di],al
  40.   inc si
  41.   add di,2
  42.   mov bx,offset s - offset ok      ;给出中断处理程序的位移值
  43.   int 7ch
  44.   
  45. ok:  mov ax,4c00h
  46.   int 21h
  47.   
  48.   
  49. ;============================中断处理程序=================================================s0:  push bp
  50.   mov bp,sp
  51.   add [bp+2],bx
  52.   
  53. s0en:  pop bp
  54.   iret
  55.   
  56. s0end: nop
  57.   code ends
  58. end start
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-24 18:14:46 | 显示全部楼层
路过看看呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-4-24 20:16:29 | 显示全部楼层
强烈支持楼主ing……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-27 01:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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