本人把es:bx改为了es:si,下面是我的代码,包括测试
assume cs:code
data segment
db 512 dup(0)
data ends
code segment
start:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;安装int 7ch号中断例程
mov ax, cs
mov ds, ax
mov si, offset rwfloppy
mov ax, 0
mov es, ax
mov di, 200h
mov cx, offset rwfloppyend - offset rwfloppy
cld
rep movsb
mov word ptr es:[7ch*4], 200h
mov word ptr es:[7ch*4+2], 0
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;测试(把A盘复制到B盘)
mov ax, data
mov es, ax
mov si, 0h
mov di, 0
mov cx, 2880 ;2880个扇区
s:
mov ah, 0 ;读
mov al, 1 ;读入扇区数
mov dl, 0 ;软驱A
mov bx, di ;逻辑扇区号
int 7ch
mov ah, 1 ;写
mov al, 1 ;写入扇区数
mov dl, 1 ;软驱B
mov bx, di ;逻辑扇区号
int 7ch
inc di
loop s
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax, 4c00h
int 21h
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;功能:使用逻辑扇区号读写软盘
;参数:(ah) = 0 表示读,1 表示写
; (al) = 要读写的扇区数
; (dl) = 驱动器号,0:软盘A,1:软盘B
; (bx) = 要读写的逻辑扇区号
; es:si 指向存储读出数据或写入数据的内存区
rwfloppy: cmp ah, 1
ja ok ;大于1跳出
push bx ;保护bx
push cx ;保护cx
push dx ;保护dx
add ah, 2 ;读或写:0+2 or 1+2
push ax ;保存写入的扇区数和功能号(al)和(ah)
push dx ;保存驱动器号(dl)
mov ax, bx
mov dx, 0
mov bx, 1440
div bx
mov bx, dx ;(bx) = (bx)%1440
pop dx ;恢复驱动器号(dl)
mov dh, al ;面: (dh) = (bx)/1440
mov ax, bx
mov bl, 18
div bl
mov ch, al ;磁道号:(ch) = ((bx)%1440)/18
mov cl, ah
inc cl ;扇区号:(cl) = ((bx)%1440)%18+1
mov bx, si
pop ax
int 13h ;调用bios中断
sub ah, 2 ;恢复ax
pop dx ;恢复dx
pop cx ;恢复cx
pop bx ;恢复bx
ok: iret
rwfloppyend: nop
code ends
end start |