lyoal 发表于 2012-12-19 00:18:56

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

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:,200h        ;程序入口偏移地址
                        mov word ptr es:,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:,'!'                ;执行程序
                        mov byte ptr es:,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 ,bx
                        ;这个是地方是不是要加一条指令,使cpu指向s标号处执行循环呢?
                       
                       
        ok:                pop bp
                        iret
                       
        s1end:        nop
                       
                        code ends
end start ;请大牛指点,问题出在那里了?中断处理程序如何像LOOP指令一样,跳回主程序继续循环执行?非常感谢!

ycg 发表于 2012-12-19 00:18:57

首先,lz你忘了给si赋值
其次,lz应该把36、37行写在38行后面
如果按lz这么写的话,bx应该是"mov ax,4c00h"到标号s的偏移值吧

shdfsbgfjks 发表于 2012-12-19 00:46:07

不需要,因为每次执行add【bp+2】,bx以后cs和ip都已经指向s了

lyoal 发表于 2012-12-19 02:50:09

shdfsbgfjks 发表于 2012-12-19 00:46 static/image/common/back.gif
不需要,因为每次执行add【bp+2】,bx以后cs和ip都已经指向s了

非常感谢朋友的指点,但是我的这个程序不能正确执行,可不可以帮忙指出问题出在什么地方?

lyoal 发表于 2012-12-19 21:08:28

ycg 发表于 2012-12-19 00:18 static/image/common/back.gif
首先,lz你忘了给si赋值
其次,lz应该把36、37行写在38行后面
如果按lz这么写的话,bx应该是"mov ax,4c00 ...

一语惊醒梦中人呢!
先谢谢了。
另外,还想请问一下,为什么调用了处理程序后,中断处理程序并没有返回指令,程序又如何返回的呢?

ycg 发表于 2012-12-19 21:58:10

lyoal 发表于 2012-12-19 21:08 static/image/common/back.gif
一语惊醒梦中人呢!
先谢谢了。
另外,还想请问一下,为什么调用了处理程序后,中断处理程序并没有返回 ...

不是有iret指令的吗

lyoal 发表于 2012-12-19 23:24:18

ycg 发表于 2012-12-19 21:58 static/image/common/back.gif
不是有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:,200h
                mov word ptr es:,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 ,0
                je ok
                mov al,
                mov es:,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 ,0
                je s0en
                mov ,bx
               
s0en:         pop bp
                iret
               
s0end:        nop


                code ends
end start这段代码错在那儿,如何改?请多指点一下。谢谢!

ycg 发表于 2012-12-20 14:57:34

lyoal 发表于 2012-12-19 23:24 static/image/common/back.gif
这段代码错在那儿,如何改?请多指点一下。谢谢!

               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,0

                je ok

                mov al,a

                mov es:,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指令就不用写了,如果是0的话,就不会调用中断了

lyoal 发表于 2012-12-20 21:46:58

ycg 发表于 2012-12-20 14:57 static/image/common/back.gif
我把你的代码从主程序到调用中断修改了下
你定义的数据"db 'conversation',0"的偏移地址不是202h,这里的 ...

这是教材上的检测点,我才学到十三章,你用的这个解决方法好像是十四章里的。总之非常感谢朋友你的指点。

ycg 发表于 2012-12-20 22:00:40

lyoal 发表于 2012-12-20 21:46 static/image/common/back.gif
这是教材上的检测点,我才学到十三章,你用的这个解决方法好像是十四章里的。总之非常感谢朋友你的指点。

嗯,貌似是的。那就干脆把定义的数据放到数据段吧

lyoal 发表于 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:,200h
mov word ptr es:,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 ,0
je ok
mov al,
mov es:,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 ,bx

s0en:pop bp
iret

s0end: nop
code ends
end start

落叶无痕 发表于 2013-4-24 18:14:46

路过看看呵呵

抗日保钓-小攵的 发表于 2013-4-24 20:16:29

强烈支持楼主ing……
页: [1]
查看完整版本: 十三章的一个例题,没搞懂,请大牛指点一下,非常感谢!