汇编语言(王爽)实验十七
程序员文章站
2024-03-23 22:32:28
...
实验十七
用面号、磁道号、扇区号访问磁盘不太方便,考虑对它们进行统一编号
方法如下,称此编号为逻辑扇区编号
逻辑扇区号=(面号*80 + 磁道号)*18 + 扇区号-1
反过来
面号=int(逻辑扇区号/1440)
磁道号=int(rem(逻辑扇区号/1440)/18)
扇区号=rem(rem(逻辑扇区号/1440)/18)+1
int():取商
rem():取余数
安装一个新的int 7ch中断例程,实现通过逻辑扇区号对软盘进行读写
ah传递功能号:0表示读 1表示写
dx传递逻辑扇区号
es:bx指向读出/写入数据的内存区
提示:可调用int 13h进行实际的读写
assume cs:code
code segment
start: mov ax,cs
mov ds,ax
mov si,offset int7cstart
mov ax,0
mov es,ax
mov di,200h
mov cx,offset int7cend-offset int7cstart
cld
rep movsb
cli
mov ax,0
mov ds,ax
mov word ptr ds:[4*7ch],200h
mov word ptr ds:[4*7ch+2],0
sti
mov ax,4c00h
int 21h
int7cstart: cmp ah,1
ja ok ; 违法的功能号
push ax ; 保护现场
push bx
push cx
push dx
push ax ; ah中存着功能号
mov ax,dx ; 传递逻辑扇区号
mov dx,0
mov cx,1440
div cx
push ax ; ax保存得到的商,即面号,入栈保存
mov cx,18
mov ax,dx ; 所得结果的余数传递给ax,继续做除法
mov dx,0
div cx
push ax ; ax保存得到的商,即磁道号
inc dx ; 计算出扇区号
push dx ; 入栈保存
pop ax
mov cl,al ; 扇区号
pop ax
mov ch,al ; 磁道号
pop ax
mob dh,al ; 面号
mov dl,0 ; 驱动器号
pop ax ; 弹出ax,其中ah中存着功能号
mov al,1 ; 扇区数
cmp ah,0
je read
cmp ah,1
je write
read: mov ah,2
jmp short func
write: mov ah,3
jmp short func
func: int 13h
pop dx ; 恢复现场
pop cx
pop bx
pop ax
ok: iret
int7cend: nop
code ends
end start
下一篇: 汇编语言(王爽)实验一