#2
xkwy00002013-10-12 15:30
|
编写并安装int 7ch中断例程,功能为显示一个用0结尾的字符串,中断例程安装在0:200处。
参数: (dh)=行号, (dl)=列号, (cl)=颜色 ds:si指向字符串首地址
以上中断例程安装好后,对下面的程序进行单步跟踪,尤其注意int,iret指令执行前后cs,ip的和栈中的状态。
程序代码:
assume cs:code
data segment
db "welcome to masm!",0
data ends
code segment
start: mov dh,10
mov dl,10
mov cl,2h
mov ax,data
mov ds,ax
mov si,0
int 7ch
mov ax,4c00h
int 21h
code ends
end start
上面这个程序我把它命名为test.exe
ok,叙述下我的问题吧。 我在安装好自己写的int 7ch中断例程后,运行了上面这个test.exe程序,可是不显示字符串。
如图(有图有真相,= =!汗颜,怎么发图啊??我发个附件看看。)
只有本站会员才能查看附件,请 登录
我很奇怪,检查了中断例程和test.exe的源码后也没有发现问题。 然后我就开debug一步步跟踪。发现字符会一个个显示,颜色也会显示正确。调试结束,我又运行了test.exe 发现这下可以显示字符串"welcome to masm!"了。后来我发现,我必须在运行test.exe之前运行一下debug才可以正常显示字符串。
下面是截图
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
好吧,这下我更加纠结了,到底哪里出错了呢??是我的代码错了,还是那个操作有问题。为什么非要运行debug。难道是因为不是真正的实模式?
我是在VMware Workstation中xp sp3虚拟机中运行的。
下面是我写的int 7ch 中断例程,我命名为install7c.exe 各位有空帮忙看看,多谢多谢!!!
程序代码:
assume cs:code
code segment
;>>>>>>>>>>>>>>>>>
;安装程序,将int 7ch中断例程安装到0:200处
;>>>>>>>>>>>>>>>>>
start: mov ax,0h
mov es,ax
mov ax,200h
mov di,ax
mov ax,cs
mov ds,ax
mov si,offset s0
mov cx,offset ed - 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,4c00h
int 21h
;dh=行号 dl=列号 cl=颜色 ds:si指向字符串
s0: push ax
push dx
push es
push di
mov ax,0b800h
mov es,ax
;>>>>>>>>>>>>>>>>>>>>>>>>>>
;设置di= dh*160+dl*2 但是di是16位的 dh,dl是8位的不可以直接传输
;>>>>>>>>>>>>>>>>>>>>>>>>>>
mov al,160
mul dh
mov di,ax
mov al,2
mul dl
add di,ax ;di=dh*160+dl*2
;>>>>>>>>>>>>>>>>>>>>>>>>>>>
s: cmp byte ptr [si],0
je cn ;如果到字符串尾则停止复制
mov al,[si]
mov es:[di],al ;显示字符
mov es:[di+1],cl ;设置颜色属性
inc si
add di,2
jmp s
cn: pop di
pop es
pop dx
pop ax
iret
ed: nop
code ends
end start
code segment
;>>>>>>>>>>>>>>>>>
;安装程序,将int 7ch中断例程安装到0:200处
;>>>>>>>>>>>>>>>>>
start: mov ax,0h
mov es,ax
mov ax,200h
mov di,ax
mov ax,cs
mov ds,ax
mov si,offset s0
mov cx,offset ed - 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,4c00h
int 21h
;dh=行号 dl=列号 cl=颜色 ds:si指向字符串
s0: push ax
push dx
push es
push di
mov ax,0b800h
mov es,ax
;>>>>>>>>>>>>>>>>>>>>>>>>>>
;设置di= dh*160+dl*2 但是di是16位的 dh,dl是8位的不可以直接传输
;>>>>>>>>>>>>>>>>>>>>>>>>>>
mov al,160
mul dh
mov di,ax
mov al,2
mul dl
add di,ax ;di=dh*160+dl*2
;>>>>>>>>>>>>>>>>>>>>>>>>>>>
s: cmp byte ptr [si],0
je cn ;如果到字符串尾则停止复制
mov al,[si]
mov es:[di],al ;显示字符
mov es:[di+1],cl ;设置颜色属性
inc si
add di,2
jmp s
cn: pop di
pop es
pop dx
pop ax
iret
ed: nop
code ends
end start
[ 本帖最后由 mxd000000 于 2013-10-11 20:06 编辑 ]