调用int13对扇区进行读写的问题

qnapjiujiu 2014-12-23 04:01:21
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处出现乱码,但是查看此时的寄存器:磁道号、扇区号、磁头号、软盘符号、写入扇区数,都没有问题,请各位大神帮我看看这是哪出的问题?感激不尽!
...全文
412 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
zara 2014-12-25
  • 打赏
  • 举报
回复
用的是同一个软盘映像文件吗,如果是的话就有些怪异了,不应该的,不过我没有 vm 虚拟软件,没法测试了。
另外,你的那个显示的字符串还是放在了原来的程序区间,这个是不大合适的;更合理的做法是和下面的 int7c 组织在一起并被搬移到 0000 段那里。
zara 2014-12-24
  • 打赏
  • 举报
回复
没有,看了下应该是属性那里的 dl 为 00 的缘故吧。
qnapjiujiu 2014-12-24
  • 打赏
  • 举报
回复
引用 10 楼 zara 的回复:
虚拟机是 vpc2007,然后就是两个简单的软盘映像 img 文件,里面是最基本的 dos 引导程序。我觉得,先在你顶楼的代码里 int7c: 前加上 mov ah, 4ch 及 int 21h 两指令,首先保证执行流程的正确。
已经加了,我是加上了后又在dos内运行的,出现了上述问题,在屏幕上显示hello world!了吗?
zara 2014-12-24
  • 打赏
  • 举报
回复
虚拟机是 vpc2007,然后就是两个简单的软盘映像 img 文件,里面是最基本的 dos 引导程序。我觉得,先在你顶楼的代码里 int7c: 前加上 mov ah, 4ch 及 int 21h 两指令,首先保证执行流程的正确。
qnapjiujiu 2014-12-24
  • 打赏
  • 举报
回复
引用 8 楼 zara 的回复:
你这个和上面的这个和顶楼的不是一回事吧。这个,比较可能是你的代码最后没有结束程序的调用导致执行流程失控造成的?用你的代码在 dos622 (没加载himem 和 emm386) 和 win9x 的 dos7 (加载了 himem 和 emm386)上试过,没有问题(添加了程序结束的调用)。当然了,你写入的数据或可能破坏磁盘上的内容导致文件上的意外。对int13h的防范,刚开始时好像是有个程序 lock/unlock 什么的可以允许它的,具体是什么版本哪个名字,太久记不清了。

您那两个环境怎么搭建啊,能稍微说一下吗?我添加了程序结束调用以后出现这个问题:

可能是环境不对吧,这个纯dos环境, dos622 (没加载himem 和 emm386) 和 win9x 的 dos7 (加载了 himem 和 emm386),您这两个环境怎么搭建的?给我个提示什么的,谢谢了
zara 2014-12-24
  • 打赏
  • 举报
回复
你这个和上面的这个和顶楼的不是一回事吧。这个,比较可能是你的代码最后没有结束程序的调用导致执行流程失控造成的?用你的代码在 dos622 (没加载himem 和 emm386) 和 win9x 的 dos7 (加载了 himem 和 emm386)上试过,没有问题(添加了程序结束的调用)。当然了,你写入的数据或可能破坏磁盘上的内容导致文件上的意外。对int13h的防范,刚开始时好像是有个程序 lock/unlock 什么的可以允许它的,具体是什么版本哪个名字,太久记不清了。
qnapjiujiu 2014-12-24
  • 打赏
  • 举报
回复
引用 6 楼 zara 的回复:
#4 那个链接里的“原理:”部分不是说了吗,用虚拟机啊,写在软盘映像里进行试验的。

我就是用的软盘映像啊
现在我装了一个dos系统,在dos系统里运行这个程序,出现这个问题:
这也是系统保护吗,怎么回事?
zara 2014-12-24
  • 打赏
  • 举报
回复
#4 那个链接里的“原理:”部分不是说了吗,用虚拟机啊,写在软盘映像里进行试验的。
qnapjiujiu 2014-12-24
  • 打赏
  • 举报
回复
引用 16 楼 zara 的回复:
1. 共享的问题,如果操作成功正常的话,应该是 Z: 命令进入到 Z: 盘吧,不是通过 cd Z:\ ,或者加个 /D 选项试试,不过早期的 cd 命令不一定支持这个选项。这个功能,以前 vpc5.2 用过,但 vpc2007 没用起来,需要安装什么组件的,我装了也没用;你这个地方,就是直接用软盘映像。 2. 这个是修改软盘根目录下的 config.sys 吧。
问题解决了,字符出来了,谢谢您了zara,这个问题困扰我将近一周了,太感谢了 不过我就是纳闷,为什么VM装的dos系统不行,而VPC装得虚拟系统就可以,难道是因为版本不同?我的VM中装得dos7.1,VPC中装得dos6.22,结果VM中运行就会出现EMM386 has detected error #17 in an application at memory address EA07:0589.to minimize the cance of data loss, EMM386 has halted your computer.for more information, consult your documentation.to restart your computer,press ENTER.这个提示。而VPC中就完美运行了,我再试一下是不是版本问题。 再次感谢zara!!!
zara 2014-12-24
  • 打赏
  • 举报
回复
1. 共享的问题,如果操作成功正常的话,应该是 Z: 命令进入到 Z: 盘吧,不是通过 cd Z:\ ,或者加个 /D 选项试试,不过早期的 cd 命令不一定支持这个选项。这个功能,以前 vpc5.2 用过,但 vpc2007 没用起来,需要安装什么组件的,我装了也没用;你这个地方,就是直接用软盘映像。
2. 这个是修改软盘根目录下的 config.sys 吧。
qnapjiujiu 2014-12-24
  • 打赏
  • 举报
回复
引用 14 楼 zara 的回复:
启动虚拟机后,在那个虚拟机窗口的菜单上有 CD (光盘)及 Floppy (软驱)项,点击 Floppy 的 Catch Floppy Image (加载软盘映像)即是了。第一次的这个操作要快,否则可能就进硬盘的系统了;如果要修改相应的软盘映像文件的话,还要先 Floppy.Release 释放它。
谢谢zara,现在把系统装好了,共享文件夹也装好了,现在还有两个问题: 1、共享的文件夹驱动器号为z为什么cd z:\进不去啊? 2、如何设置不加载himem 和 emm386,如何设置加载himem 和 emm386?在哪个文件里修改?怎样修改?
zara 2014-12-24
  • 打赏
  • 举报
回复
启动虚拟机后,在那个虚拟机窗口的菜单上有 CD (光盘)及 Floppy (软驱)项,点击 Floppy 的 Catch Floppy Image (加载软盘映像)即是了。第一次的这个操作要快,否则可能就进硬盘的系统了;如果要修改相应的软盘映像文件的话,还要先 Floppy.Release 释放它。
qnapjiujiu 2014-12-24
  • 打赏
  • 举报
回复
引用 10 楼 zara 的回复:
虚拟机是 vpc2007,然后就是两个简单的软盘映像 img 文件,里面是最基本的 dos 引导程序。我觉得,先在你顶楼的代码里 int7c: 前加上 mov ah, 4ch 及 int 21h 两指令,首先保证执行流程的正确。
请问zara,我把虚拟机安装好了,如何加载软盘影响文件啊?只有虚拟磁盘向导,这只能vhd,vfd的文件。软盘驱动器那只有自动检测软盘选项,搞不定啊,如何加载软盘映像文件啊?
qnapjiujiu 2014-12-23
  • 打赏
  • 举报
回复
引用 3 楼 zara 的回复:
windows 环境下,从 win98 开始就不运行 int13h 直接读写磁盘了吧。
或者有其他方法验证我写的程序吗?
qnapjiujiu 2014-12-23
  • 打赏
  • 举报
回复
引用 3 楼 zara 的回复:
windows 环境下,从 win98 开始就不运行 int13h 直接读写磁盘了吧。
是windows禁止了吗?可是有人用这种方法运行成功了啊http://www.docin.com/p-327466497.html
zara 2014-12-23
  • 打赏
  • 举报
回复
windows 环境下,从 win98 开始就不运行 int13h 直接读写磁盘了吧。
qnapjiujiu 2014-12-23
  • 打赏
  • 举报
回复

软盘是虚拟的软盘,软盘是没问题的我进行了读写测试
qnapjiujiu 2014-12-23
  • 打赏
  • 举报
回复

这是debug到int 13h处出问题的截图,此处的寄存器数值都是对的

21,459

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧