|
主题 : : 不知是否是最简的实验17代码 [待解决] |
回复[ 1次 ]
点击[ 664次 ] | |
|
|
|
|
[帖 主]
[ 发表时间:2008-09-21 20:30 ]
[引用]
[回复]
[ top ] | |
荣誉值:5
信誉值:0
注册日期:2008-07-04 19:03 |
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;原题目:传递参数时用BX传两参数出现矛盾.
;;改为由CX传递逻辑扇区号,BX应按INT13H要求
;;做偏移基址使用.
assume cs:sande_code
sande_code segment
start:
mov ax,0
mov es,ax
push cs
pop ds
mov di,200h
mov si,offset in7c_start
mov cx,offset in7c_end - offset in7c_start
cld
rep movsb
cli
mov word ptr es:[7ch*4],200h
mov word ptr es:[7ch*4+2],0
sti
jmp in7c_end
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;in7c中断,按逻辑扇区号读写磁盘
;参数:AH 0读盘 1写盘
; CX 读写逻辑扇区号(改用CX防止ES:BX中的BX不能被传值)
; ES:BX 指向用于与磁盘交换数据的存诸区
;另: AL 恒取1,即每次总是读写一个扇区,若每次读写数个扇区
; 则需要可去掉MOV AL,1指令,以AL传读写扇区扇数.但应进
; 行面剩余扇区数是否够读写判断.
in7c_start:
jmp short sande1
par db 0,0,0,0 ;定义字节变量用于暂存计算结果
sande1:
cmp cx,2779 ;;检查读写逻辑扇区号CX参数是否合法
ja over ;;计算逻辑扇区对应的A驱的 面\道\扇区
push ax ;;按INT13H参数要求传值给DH,DL,CH,CL,AL
mov dx,0
mov ax,cx
mov cx,1440
div cx
mov cs:par[0],al
mov ax,dx
mov cl,18
div cl
mov cs:par[1],al
inc ah
mov cs:par[2],ah
pop ax
mov al,1 ;;读写一个扇区
mov dh,cs:par[0] ;;面
mov dl,0 ;;对A驱读写
mov ch,cs:par[1] ;;道
mov cl,cs:par[2] ;;扇
cmp ah,1 ;;取功能号完成相应工作.
ja over
add ah,2
int 13h
over:
iret
in7c_end:
mov ax,4c00h
int 21h
sande_code ends
end start | | |
|
|
|
|
[第1楼]
[ 回复时间:2008-09-21 20:48 ]
[引用]
[回复]
[ top ] | |
荣誉值:5
信誉值:0
注册日期:2008-07-04 19:03 |
测试程序
写盘代码 读显存第一页第3行0列起一个扇区容量的数据内容存入A驱第100号逻辑扇区
mov ax,0b800h
mov es,ax
mov bx,320
mov cx,100
mov ah,1
int 7ch
mov ax,4c00h
int 21h
读盘代码 读A驱第100号逻辑扇区内容至显存第一页第6行0列起
mov ax,0b800h
mov es,ax
mov bx,900
mov cx,100
mov ah,0
int 7ch
mov ax,4c00h
int 21h
在WIN模拟DOS下测试通过呵 | | |
|