首页
社区
课程
招聘
[求助]8086汇编中调用int13h出现问题
发表于: 2014-12-24 10:32 6050

[求助]8086汇编中调用int13h出现问题

2014-12-24 10:32
6050
assume cs:code 
 
data segment
strr db 512 dup (0)
strw db 'hello world!',500 dup(0)
data ends 
 
stack segment
    dw 100 dup(0)
stack ends
 
code segment
     
start:   
        mov ax, stack
        mov ss,ax
        mov sp,100
         
        mov ax,data
        mov es,ax;取得strr的段地址
        push es
;把新的int7c装在7ch*4处\/
        mov ax,cs
        mov ds,ax
        mov si,offset int7c
        mov ax,0
        mov es,ax
        mov di,200h
        mov cx,offset int7cend-offset int7c
        cld
        rep movsb
         
        mov ax,0
        mov es,ax
        mov word ptr es:[7ch*4],200h
        mov word ptr es:[7ch*4+2],0
;把新的int7c装在7ch*4处^
         
        ;设定es:bx指向存储读出数据或写入数据的内存区\/
        pop es
        mov bx,0
        ;设定es:bx指向存储读出数据或写入数据的内存区^
         
        mov ah,1;写
        mov al,1;写入的扇区数
        mov dx,2;逻辑扇区号
        int 7ch
         
        mov ah,0;读
        mov al,1;读出的扇区数
        mov dx,2;逻辑扇区号
        int 7ch
         
int7c:
        push ax
        push bx
        push cx
        push dx
        push ax
        push bx
         
    ;计算物理磁道号ch,扇区号cl,磁头号dh\/
        mov ax,dx
        mov dx,0
        mov bx,1440
        div bx;rem(dx/1440)->dx;int(dx/1440)->ax
        push ax
        mov ax,dx
        mov dx,0
        mov bl,18
        div bl;int(rem(dx/1440)/18)->al;rem(rem(dx/1440)/18)->ah
        mov ch,al
        mov cl,ah
        add cl,1
        pop ax
        mov dh,al
    ;计算物理磁道号ch,扇区号cl,磁头号dh^
 
        pop bx
        pop ax
        mov dl,0;驱动器号    dl
         
        cmp ah,0
        je read
        jb sret
        cmp ah,1
        je write
        ja sret
    read:;读扇区
        push es
        push bx
        mov ah,2
        int 13h
        pop bx
        pop es
        mov dh,10;显示的行号
        mov dl,15;显示的列号
        mov cl,4ah
        mov ax,es
        mov ds,ax
        mov si,bx
        call show_str;调用显示字符串函数
        jmp sret
         
    write:;写扇区   
        push es
        push bx
        add bx,512;使es:bx指向strw
        mov ah,3
        int 13h
        pop bx
        pop es
        jmp sret
    ;显示字符串函数\/
            show_str: 
                push ax
                push bx
                push cx
                push dx
                push es
                push si
                 
                mov al,160
                dec dh
                mul dh
                push ax
                mov al,2
                dec dl
                mul dl
                pop si
                add si,ax
                mov ax,0b800h
                mov es,ax
                mov bx,0
                pop dx
                push cx
                mov ch,0
                 
            s:    mov cl,ds:[bx]
                jcxz ok
                mov al,ds:[bx]
                mov es:[si],al
                mov es:[si+1],dl
                inc bx
                add si,2
                jmp short  s
                 
                ok: 
                pop si
                pop es
                pop dx
                pop cx
                pop bx
                pop ax
                ret   
    ;显示字符串函数^
 
    sret:   
        pop dx
        pop cx
        pop bx
        pop ax
        iret
int7cend:nop
 
code ends
end start

这个程序的功能是:通过逻辑扇区推算出物理 磁道号、扇区号、磁头号,对此区域进行读写,写入的数据存在strw中,读出的数据存放在strr中,并把读出来的内容显示到屏幕上。
现在的问题是:程序运行后会提示:CS:0000 IP:0077 OP:f0 37 05 0c 02 选择“关闭”终止应用程序,忽略后还会有类似提示,如图:

通过debug调试可以发现程序在运行到 int 13h处出现乱码,但是查看此时的寄存器:磁道号、扇区号、磁头号、软盘符号、写入扇区数,都没有问题

软盘是虚拟的软盘,软盘是没问题的我进行了读写测试

有人帮忙说是xp系统有保护模式,现在我装了一个dos系统,在dos系统里运行这个程序,出现这个问题:

请各位大神帮我看看这是哪出的问题?感激不尽!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (8)
雪    币: 3
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2





不好意思这是那几张图片
2014-12-24 10:34
0
雪    币: 269
活跃值: (906)
能力值: ( LV12,RANK:345 )
在线值:
发帖
回帖
粉丝
3
看了一下,大概是这个样子,堆栈的默认空间太小了,设置大点试试吧http://bbs.csdn.net/topics/390140528
stack segment
    dw 10000 dup(0)
stack ends
2014-12-24 10:37
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
1.不要在Windows的ntvdm里调试实模式程序
2.你的DOS系统加载了EMM386,Emm386是DOS保护模式扩展,你需要修改DOS的config.sys,把关于himem.sys和emm386.exe的加载项去掉 然后再调试
2014-12-24 11:26
0
雪    币: 3
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
首先谢谢您,我把这两行:DEVICE=HIMEM.SYS
DEVICE=EMM386.EXE NOEMS
删了,现在config.sys中剩下这些内容:
DEVICE=ECHO.SYS W/e/l/c/o/m/e /t/o MS-DOS 7.10...
DEVICE=ECHO.SYS C/o/p/y/r/i/g/h/t M/i/c/r/o/s/o/f/t C/o/r/p. A/l/l /r/i/g/h/t/s /r/e/s/e/r/v/e/d.
DEVICEHIGH=SETVER.EXE
DEVICEHIGH=POWER.EXE
DEVICEHIGH=VIDE-CDD.SYS /D:IDE-CD
REM DEVICEHIGH=DISPLAY.SYS CON=(,,1)
REM COUNTRY=001,437,COUNTRY.SYS
SHELL=COMMAND.COM /P /E:640
DOS=HIGH,UMB,AUTO
FCBS=4,0
FILES=30
BUFFERS=20,0
LASTDRIVE=26
STACKS=9,256
可是还是出现同样的问题,我删除的方式不对吗?应该怎样把关于himem.sys和emm386.exe的加载项去掉?
2014-12-24 13:44
0
雪    币: 3
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
您好,我把它调大了,还是出现同样的问题
2014-12-24 13:46
0
雪    币: 3
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
把这himem.sys和emm386.exe两个文件删除了,也还有同样的问题。
2014-12-24 14:11
0
雪    币: 608
活跃值: (648)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
8
错误提示是什么
2014-12-24 16:46
0
雪    币: 3
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
问题解决了,是dos版本的问题,我用dos6.22的就可以了,谢谢帮助我的各位


您的回答给了我启发,特此感谢
2014-12-24 16:46
0
游客
登录 | 注册 方可回帖
返回
//