Assembly NASM:如何正确访问ssd驱动器?

Assembly NASM:如何正确访问ssd驱动器?,assembly,nasm,x86-16,hard-drive,solid-state-drive,Assembly,Nasm,X86 16,Hard Drive,Solid State Drive,我需要使用NASM 16位代码访问SSD驱动器。访问常规硬盘时,需要设置寄存器AX、DX、CX以选择柱面/磁道/扇区/扇区数AH-选择读取扇区功能,DL-选择驱动器号,CH-选择柱面,DH-选择磁盘侧面,CL-选择磁道扇区,AL-选择扇区数 但是,我假设SSD磁盘具有其他结构,那么如何正确访问它们呢?假设将伪几何体转换为LBA最有可能的情况是,int 0x13,ah=0x02最多只能处理16515072个扇区。每个扇区512字节也是最有可能达到8064 MiB或大约7.8 GiB的情况。硬盘驱动

我需要使用NASM 16位代码访问SSD驱动器。访问常规硬盘时,需要设置寄存器AX、DX、CX以选择柱面/磁道/扇区/扇区数AH-选择读取扇区功能,DL-选择驱动器号,CH-选择柱面,DH-选择磁盘侧面,CL-选择磁道扇区,AL-选择扇区数


但是,我假设SSD磁盘具有其他结构,那么如何正确访问它们呢?

假设将伪几何体转换为LBA最有可能的情况是,int 0x13,ah=0x02最多只能处理16515072个扇区。每个扇区512字节也是最有可能达到8064 MiB或大约7.8 GiB的情况。硬盘驱动器(包括固态硬盘)比这更大已经有20年了;所以int 0x13,ah=0x02不是一个正常的选项


相反,对于要使用int 0x13、ah=0x42的硬盘驱动器(包括SSD),请参阅。此函数使用LBA地址,不使用CHS;使用64位LBA地址和每个扇区相同的512字节,它最多可以处理8589934592个TiB驱动器。

假设将伪几何体转换为LBA最有可能的情况是,int 0x13,ah=0x02最多只能处理16515072个扇区。每个扇区512字节也是最有可能达到8064 MiB或大约7.8 GiB的情况。硬盘驱动器(包括固态硬盘)比这更大已经有20年了;所以int 0x13,ah=0x02不是一个正常的选项


相反,对于要使用int 0x13、ah=0x42的硬盘驱动器(包括SSD),请参阅。此函数使用LBA地址,不使用CHS;使用64位LBA地址和每个扇区相同的512字节,它最多可以处理8589934592个TiB驱动器。

无论您使用的是SSD还是HDD都没有区别。即使是在HDD上,CHS结构也只是被模拟,因为现代硬盘的每个磁道都有超过63个扇区。无论是SSD还是HDD都没有区别。即使在HDD上,CHS结构也只是被模拟,因为现代硬盘的每条磁道有63个扇区。有趣的是,在我将AH更改为0x42后,我得到了一个错误状态代码01h,根据此表,这意味着AH中的函数无效或参数无效,当AH=0x02时,一些数据实际上是使用此处的代码从磁盘读取的。是因为16位代码吗?@stackoverflower鉴于此接口仅在实际16位模式下可用,而不是因为16位模式。请发布一个新问题。@stackoverflower:对于int 0x13,ah=0x42返回无效函数;我怀疑dl中的驱动器号与有效的硬盘/SSD不对应。例如,如果第一张软盘的DL=0,您希望int 0x13,ah=0x02工作,int 0x13,ah=0x42不受支持。我与qemu进行了检查,我认为qemu将引导加载程序代码视为一个单独的驱动器或类似的东西。有趣,在我将AH更改为0x42之后,我得到了一个错误状态代码01h,根据此表,这意味着AH中的函数无效或参数无效,并且当AH=0x02时,实际上使用此处的代码从磁盘读取了一些数据。是因为16位代码吗?@stackoverflower鉴于此接口仅在实际16位模式下可用,而不是因为16位模式。请发布一个新问题。@stackoverflower:对于int 0x13,ah=0x42返回无效函数;我怀疑dl中的驱动器号与有效的硬盘/SSD不对应。例如,如果第一张软盘的DL=0,您可能希望int 0x13,ah=0x02工作,int 0x13,ah=0x42不受支持。我与qemu进行了检查,我认为qemu将引导加载程序代码视为一个单独的驱动器或类似的东西。。