【问题标题】:How to write on hard disk with bios interrupt 13h如何用bios中断13h在硬盘上写
【发布时间】:2012-02-21 21:08:45
【问题描述】:

我想将我的引导加载程序复制到其自身硬盘的第一个扇区 (512)(我应该使用 bios 中断 13h),我找到了以下代码:

mov bx, buffer1       ; set BX to the address (not the value) of BlahBlah 
mov ah,03h            ;When ah=, int13 reads a disk sector
mov al,5              ;Al is how many sectors to read

mov cl,0              ;Sector Id
mov dh,0              ;Head
mov dl,80h            ;Drive (0 is floppy)
mov cx,512            ;One sector /2   

mov ah, 0x3           ; set function 2h
int 0x13  

但它不起作用!

【问题讨论】:

  • 复制意大利面代码从来都不是一个好方法。您应该学习一些汇编程序并尝试理解为什么您的代码不起作用。然后你可以尝试自己解决它,如果你遇到困难来这里。
  • 你有没有注意到评论说 function 2h ?但它实际上将 0x3 移动到 ah
  • 我知道代码在做什么!我实际上改变了它(3h是一个例子)!我不知道为什么它不起作用!
  • 您是否使用缓冲区地址的适当段部分加载段寄存器?您是否检查了 BIOS 参考资料(例如 Ralf Brown 的中断列表),您是否正确使用了此 BIOS 功能(将其他寄存器设置为正确的值)?
  • 先学习从工作磁盘读取,习惯bios调用,然后你就会知道该写的时候该做什么了。

标签: assembly bootloader bootstrapping bios


【解决方案1】:

您的代码非常混乱。为了正确使用int 13hAH = 3,您还需要设置ESBX所在的段,例如ES:BX是应该读取和写入硬盘的缓冲区的地址磁盘),CX 是柱面和扇区号的组合(cylinder = CL[7:6] || CHsector = CL[5:0])。

假设您想将物理地址5000h 的一个扇区(512 字节)写入硬盘 0 上的 CHS 0:0:1,您的代码将如下所示:

xor ax, ax
mov es, ax    ; ES <- 0
mov cx, 1     ; cylinder 0, sector 1
mov dx, 0080h ; DH = 0 (head), drive = 80h (0th hard disk)
mov bx, 5000h ; segment offset of the buffer
mov ax, 0301h ; AH = 03 (disk write), AL = 01 (number of sectors to write)
int 13h

您还应该记住在执行中断后检查是否设置了进位标志。功能是否已正确执行将一目了然。如果已设置,则AH 寄存器将包含错误代码。

【讨论】:

    【解决方案2】:

    BIOS 函数具有输入参数。如果您没有正确输入所有参数,BIOS 功能将无法猜出您的意思。对于您正在使用的 BIOS 功能,请查看:http://www.ctyme.com/intr/rb-0608.htm

    据我所知,您缺少 CH 和 ES 的正常值,因此 BIOS 可以将数据从完全不同的地址写入完全不同的扇区。另请注意,CL 是 CX 寄存器的最低半部分 - 将值加载到 CL 中然后通过将某些内容加载到 CX 中来覆盖它是没有意义的。

    BIOS 函数也会返回值。在您的情况下,BIOS 可能会返回一个状态代码,告诉您出了什么问题,并且因为您不检查您不知道是否有任何问题或如果发生了问题。

    【讨论】:

      猜你喜欢
      • 2014-07-23
      • 2012-01-31
      • 2020-09-19
      • 1970-01-01
      • 2011-09-26
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 2014-12-28
      相关资源
      最近更新 更多