|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
实验17 通过逻辑扇区号对软盘进行读写
要求:安装新的int 7ch中断例程,实现通过逻辑扇区号对软盘进行读写
参数说明:
(1) (ah)=0表示读扇区,(ah)=1表示写扇区
(2) (dx)=读写扇区的逻辑扇区号
(3) es:bx指向存储读出数据或写入数据的内存区
题目的难度不大,只不过是把现有的参数转化为符合中断例程13h的参数,然后调用13h,
但是对读出/写入的扇区数并没有说明或规定,es:bx指向的读出数据或写入数据没有结束标志,
不能通过数据计算出需要的扇区数,所以该题目隐含了还需要一个扇区数的参数。我们可以用
al寄存器传递扇区数给7ch中断例程。
- ;实验17 通过逻辑扇区号对软盘进行读写
- ;名称:ex17.nas
- ;编译:nasm -f obj ex17.nas
- ;连接:alink ex17.obj
- ;生成:ex17.exe
- ;日期:2016年3月6日 9:20
- ;功能:安装新的int 7ch中断例程,实现通过逻辑扇区号对软盘进行读写
- ;入口参数:
- ; (ah)=0表示读扇区,(ah)=1表示写扇区
- ; (al)=扇区数
- ; (dx)=读写扇区的逻辑扇区号
- ; es:bx指向存储读出数据或写入数据的内存区
- [section code]
- ..start:
- mov ax, cs
- mov ds, ax
- mov si, int7ch
-
- mov ax, 0
- mov es, ax
- mov di, 0200h
- ;安装中断例程7ch,首地址为0:0200h,长度为len
- mov cx, len
- cld ;正向传输
- rep movsb ;if cx>0 [es:di]=[ds:si],si++,di++,cx--
- ;设置中断例程7ch的入口地址
- cli
- mov word [es:7ch*4], 0200h
- mov word [es:7ch*4+2], 0
- sti
-
- mov ax, 4c00h
- int 21h
-
- int7ch:
- cmp ah, 0
- jb exit
- cmp ah, 1
- ja exit ;ah小于0或者大于1则退出。
- cmp al, 1
- jb exit ;读写扇区数应大于1
-
- push cx
- push ax ;暂存入口参数
-
- mov ax, dx ;(ax)=读写扇区的逻辑扇区号0-2879
- mov dx, 0
- mov cx, 1440
- div cx ;磁头号=int(逻辑扇区号/1440)
- push ax ;磁头号入栈暂存
- mov ax, dx ;ax=rem(逻辑扇区号/1440)
- mov dx, 0
- mov cx, 18
- div cx ;ax=int(rem(逻辑扇区号/1440)/18)
- inc dx ;dx=rem(rem(逻辑扇区号/1440)/18)+1
- mov ch, al ;磁道号
- mov cl, dl ;扇区号
- pop dx ;磁头号出栈到dx
- mov dh, dl ;磁头号(面)
- mov dl, 0 ;驱动器号(dl=0为A盘,dl=1为B盘)
-
- pop ax ;恢复入口参数到ax,ah的值0为读、1为写,al=扇区数
- add ah, 2 ;ah加2后刚好符合int 13h的参数要求。
- int 13h
- pop cx
- exit: iret
- len equ $ - int7ch
复制代码
程序在虚拟机上测试通过,测试程序如下:
- ;名称:ex17test.nas
- ;编译:nasm -f obj ex17test.nas
- ;连接:alink ex17test.obj
- ;生成:ex17test.exe
- ;功能:测试实验17
- ;日期:2016年3月6日 9:41
- [section code]
- ..start:
- mov ax, 0b800h
- mov es, ax
- mov bx, 0 ;es:bx为读写内存首地址
-
- mov ah, 0 ;ah=0为读,ah=1为写
- mov al, 8 ;扇区数
- mov dx, 1 ;逻辑扇区号
- int 7ch
-
- mov ax, 4c00h
- int 21h
复制代码
如有错误希望各位鱼友指正,谢谢!
|
评分
-
查看全部评分
|