王爽《汇编语言》实验13的问题
实验的内容:编写并安装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
[ 本帖最后由 mxd000000 于 2013-10-11 20:06 编辑 ]