实验17(nasm版)
实验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指向存储读出数据或写入数据的内存区
..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 =,si++,di++,cx--
;设置中断例程7ch的入口地址
cli
mov word , 0200h
mov word , 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
..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
如有错误希望各位鱼友指正,谢谢!
犹记得以前学汇编语言的场~{:10_250:}
页:
[1]