十三章的一个例题,没搞懂,请大牛指点一下,非常感谢!
assume cs:codecode 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指令一样,跳回主程序继续循环执行?非常感谢!
首先,lz你忘了给si赋值
其次,lz应该把36、37行写在38行后面
如果按lz这么写的话,bx应该是"mov ax,4c00h"到标号s的偏移值吧
不需要,因为每次执行add【bp+2】,bx以后cs和ip都已经指向s了 shdfsbgfjks 发表于 2012-12-19 00:46 static/image/common/back.gif
不需要,因为每次执行add【bp+2】,bx以后cs和ip都已经指向s了
非常感谢朋友的指点,但是我的这个程序不能正确执行,可不可以帮忙指出问题出在什么地方? ycg 发表于 2012-12-19 00:18 static/image/common/back.gif
首先,lz你忘了给si赋值
其次,lz应该把36、37行写在38行后面
如果按lz这么写的话,bx应该是"mov ax,4c00 ...
一语惊醒梦中人呢!
先谢谢了。
另外,还想请问一下,为什么调用了处理程序后,中断处理程序并没有返回指令,程序又如何返回的呢? lyoal 发表于 2012-12-19 21:08 static/image/common/back.gif
一语惊醒梦中人呢!
先谢谢了。
另外,还想请问一下,为什么调用了处理程序后,中断处理程序并没有返回 ...
不是有iret指令的吗 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这段代码错在那儿,如何改?请多指点一下。谢谢!
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的话,就不会调用中断了 ycg 发表于 2012-12-20 14:57 static/image/common/back.gif
我把你的代码从主程序到调用中断修改了下
你定义的数据"db 'conversation',0"的偏移地址不是202h,这里的 ...
这是教材上的检测点,我才学到十三章,你用的这个解决方法好像是十四章里的。总之非常感谢朋友你的指点。 lyoal 发表于 2012-12-20 21:46 static/image/common/back.gif
这是教材上的检测点,我才学到十三章,你用的这个解决方法好像是十四章里的。总之非常感谢朋友你的指点。
嗯,貌似是的。那就干脆把定义的数据放到数据段吧 我这还原了一下测试题目原先的定义,就可以了,问题就出在,我不知道如何写中断处理程序那里了。谢谢指点迷津!
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
路过看看呵呵 强烈支持楼主ing……
页:
[1]