鱼C论坛

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

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

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

                        
;============以下为主程序================================================                        


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

                        mov ax,4c00h
                        int 21h                
        send:        nop
                                                
;============需要安装的处理程序============================================
        s1:                push bp
                        mov bp,sp
                        dec cx
                        jcxz ok
                        add [bp+2],bx
                        ;这个是地方是不是要加一条指令,使cpu指向s标号处执行循环呢?
                        
                        
        ok:                pop bp
                        iret
                        
        s1end:        nop
                        
                        code ends
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指令的吗
assume cs:code


code segment
start:        
;=========================安装中断处理程序================================================
                mov ax,cs
                mov ds,ax
                mov si,offset s0
                
                mov ax,0
                mov es,ax
                mov di,200h
                
                mov cx,offset s0end - offset s0
                cld 
                rep movsb
                
                mov ax,0
                mov es,ax
                mov word ptr es:[7ch*4],200h
                mov word ptr es:[7ch*4+2],0
                
                
;===========================主程程序分隔线=================================================
                
                        
                mov ax,cs
                mov ds,ax
                mov si,202h
                mov ax,0b800h
                mov es,ax
                mov di,12*160
                
                jmp near ptr s
                db 'conversation',0
s:                cmp byte ptr [si],0
                je ok
                mov al,[si]
                mov es:[di],al
                inc si
                add di,2
                mov bx,offset s - offset ok                           ;给出中断处理程序的位移值
                int 7ch
                
ok:                mov ax,4c00h
                int 21h
                
                
;============================中断处理程序=================================================

s0:                push bp
                mov bp,sp
                cmp byte ptr [si],0
                je s0en
                mov [bp+2],bx
                
s0en:         pop bp
                iret
                
s0end:        nop


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

使用道具 举报

发表于 2012-12-20 14:57:34 | 显示全部楼层
lyoal 发表于 2012-12-19 23:24
这段代码错在那儿,如何改?请多指点一下。谢谢!
               mov ax,cs
 
                mov ds,ax
 
                mov si,0
 
                mov ax,0b800h
 
                mov es,ax
 
                mov di,12*160
 
                
                jmp near ptr s
 
               a db 'conversation',0
 
s:                cmp byte ptr a[si],0
 
                je ok
 
                mov al,a[si]
 
                mov es:[di],al
 
                inc si
 
                add di,2
 
                mov bx,offset s - offset ok                           
 
                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 | 显示全部楼层
我这还原了一下测试题目原先的定义,就可以了,问题就出在,我不知道如何写中断处理程序那里了。谢谢指点迷津!
assume cs:code
data segment
 db 'conversation',0
data endscode segment
start: 
;=========================安装中断处理程序================================================
  mov ax,cs
  mov ds,ax
  mov si,offset s0
  
  mov ax,0
  mov es,ax
  mov di,200h
  
  mov cx,offset s0end - offset s0
  cld 
  rep movsb
  
  mov ax,0
  mov es,ax
  mov word ptr es:[7ch*4],200h
  mov word ptr es:[7ch*4+2],0
  
  
;===========================主程程序分隔线=================================================
  
   
  mov ax,data
  mov ds,ax
  mov si,0
  mov ax,0b800h
  mov es,ax
  mov di,12*160
  
  
  ;db 'conversation',0     ;这里的偏移地址不是202h,我有白吃了。s:  cmp byte ptr [si],0
  je ok
  mov al,[si]
  mov es:[di],al
  inc si
  add di,2
  mov bx,offset s - offset ok      ;给出中断处理程序的位移值
  int 7ch
  
ok:  mov ax,4c00h
  int 21h
  
  
;============================中断处理程序=================================================s0:  push bp
  mov bp,sp
  add [bp+2],bx
  
s0en:  pop bp
  iret
  
s0end: nop
  code ends
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-10-7 20:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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