由于读和写的代码很多相似之处,所以没必要用直接定址表
assume cs:code
stack segment
db 32 dup (0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
push cs
pop ds
mov si,offset int7c ;ds:si中断例程
mov ax,0
mov es,ax
mov di,200h
mov cx,offset int7cend-offset int7c
cld
rep movsb ;中断例程复制到起始地址0:200的内存单元
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0 ;设置中断向量
mov ax,4c00h
int 21h
int7c:
push ax
push cx
push dx
cmp ah,1
ja sret ;当功能号大于1,退出
push ax ;保存功能号
push bx ;保存存储区的偏移地址,以防下面程序破坏
mov ax,dx
xor dx,dx
mov bx,1440
div bx
push ax ;面号入栈
mov ax,dx
xor dx,dx
mov bx,18
div bx
inc dx
mov cl,dl
mov ch,al
pop ax ;面号出栈
mov dh,al ;通过给定dx求面号,磁道号,扇区号
mov dl,0 ;驱动器号
pop bx ;恢复存储区的偏移地址
pop ax ;恢复功能号
add ah,2
mov al,1 ;读取一个扇区
int 13h
sret:
pop dx
pop cx
pop ax
iret
int7cend:
nop
code ends
end start
测试程序就不贴了,书中说的逻辑扇区号与物理扇区号的换算公式不是唯一的,我们真正操作的还是物理扇区号,用哪种换算公式无所谓,都是方便人理解的,但值得注意的是,公式要保持一致性。
- [游客] 是没必要用还是你根本就不明白呢? 你应该重头再学了 07/17 15:24
- [younggay] 恭喜,恭喜。 07/14 15:06
- [rswjf] 你完成啦,恭喜啊,我这个刚刚开始。。。。。。 07/10 17:01
- [lengxiaoyao] 1. mov word ptr es:[0],200 这个确实错了 2.db 'divide 07/10 11:32
- [yannzi] 不对呀,你的程序有点问题哦,要细心呀 mov word ptr es:[0],200 应该为 mov 07/09 20:37
- [wsrf] 它们是两个不同的命令,程序没有问题。 07/05 09:59
- [wsrf] 正确。 07/05 09:52
- [mywiil] 对头,继续加油。 07/04 11:01
- [mywiil] 程序运行没问题。 07/04 11:00
- [mywiil] OK 07/04 10:54
[ 游客 发表于 2009-07-17 15:24 ]
是没必要用还是你根本就不明白呢?
你应该重头再学了