注册 登录
编程论坛 汇编论坛

王爽《汇编语言》实验13的问题

mxd000000 发布于 2013-10-11 20:00, 1329 次点击
实验的内容:
    编写并安装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 编辑 ]
7 回复
#2
xkwy00002013-10-12 15:30
王爽老师,也没有机会向他当面求教,这个实验章节的内容是从网上搜到的,
可把我害苦了,多次实验也没有成功,建议修改教材,本来打算从,后来只好
使用debug了,有同感楼主

#3
xkwy00002013-10-12 15:42
虽然我做这部分内容时有些侥幸,现在很难有时间重做,
不过总觉得不踏实,就是中断嵌套的问题。
#4
mxd0000002013-10-13 10:41
对了 还有一个问题就是 某些时候我可以不运行debug也可以达到效果,但是过了几分钟再开一个ms-dos窗口运行就不可以了 就非得运行debug后才可以正常显示
#5
xkwy00002013-10-13 18:43
我有一个很不错的dos系统环境,可是正是由于很多事情都很纠结,很多练习都是在windows_xp环境下进行的,
弄清楚这个事情,我想对于王爽老师更有意义,因为要维护教材的权威性
#6
mfwwxd2013-10-17 21:41
要维护教材的权威性
#7
szwillis2013-11-17 16:47
我学这个的时候也碰到过这个问题,你的代码应该没问题。是XP的虚拟DOS的问题,需要真实的DOS环境。建议你用DOSBOX来运行纯DOS汇编,网上找一下DOSBOX,有很多。
#8
极点寸芒2013-12-30 20:58
我一般是先看下显示字符串的偏移地址,然后直接g命令到达那里,看是否显示,如果显示就代码没错,不显示,就去调试
1