. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->使用BIOS进行键盘输入和磁盘读写
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验17 bx存储逻辑扇区号  [待解决] 回复[ 4次 ]   点击[ 772次 ]  
lloveasm
[帖 主]   [ 发表时间:2008-09-17 11:04 ]   [引用]   [回复]   [ top ] 
荣誉值:18
信誉值:0
注册日期:2008-08-31 11:07
302页


实验17 bx存储逻辑扇区号,es:bx指向存储读出数据或写入数据的内存区

请问bx怎么可能保存两个数据?
lloveasm
[第1楼]   [ 回复时间:2008-09-17 15:34 ]   [引用]   [回复]   [ top ] 
荣誉值:18
信誉值:0
注册日期:2008-08-31 11:07
本人把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
gsyangchao
[第2楼]   [ 回复时间:2009-02-05 13:21 ]   [引用]   [回复]   [ top ] 
荣誉值:12
信誉值:0
注册日期:2009-01-25 01:37
楼主用得是第一版吧,第二版修正了,分别为dx和es:bx
gift925
[第3楼]   [ 回复时间:2009-09-05 20:51 ]   [引用]   [回复]   [ top ] 
荣誉值:22
信誉值:12
注册日期:2009-08-28 00:17
啊?dx和es:bx?
gift925
[第4楼]   [ 回复时间:2009-09-05 20:52 ]   [引用]   [回复]   [ top ] 
荣誉值:22
信誉值:12
注册日期:2009-08-28 00:17
难道不是bx和es:di吗?毕竟这个更符合习惯啊!
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved