关于用汇编语言从硬盘读取数据

MBR主扇区代码,代码从1号扇区,第2块扇区读取数据

[org 0x7c00]
[bits 16]

start:
    ; 设置段寄存器
    xor ax, ax
    mov ds, ax
    mov es, ax
    mov ss, ax
    mov sp, 0x7c00

    ; 设置读取参数
    mov ah, 0x02        ; BIOS读取扇区功能
    mov al, 1           ; 读取1个扇区
    mov ch, 0           ; 柱面号 = 0
    mov cl, 2           ; 扇区号 = 2
    mov dh, 0           ; 磁头号 = 0
    mov dl, 0x80        ; 驱动器号 = 0x80 (第一个硬盘)
    mov bx, buffer      ; ES:BX = 缓冲区地址

    ; 读取扇区
    int 0x13
    jc error            ; 如果CF=1,跳转到错误处理

    ; 显示成功消息
    mov si, success_msg
    call print_string

    ; 显示读取的字符串
    mov si, buffer
    call print_string

    jmp $               ; 无限循环

error:
    push ax             ; 保存错误代码
    mov si, error_msg
    call print_string
    
    ; 显示具体错误原因
    pop ax              ; 恢复错误代码
    call print_error

    jmp $               ; 无限循环

print_string:
    push ax
    mov ah, 0x0e        ; BIOS 电传打字机输出
.loop:
    lodsb               ; 加载SI指向的字节到AL,并递增SI
    test al, al         ; 检查是否到字符串结尾(0x00)
    jz .done            ; 如果是0,结束打印
    int 0x10            ; 否则,打印字符
    jmp .loop
.done:
    pop ax
    ret

print_error:
    push si
    mov si, unknown_error
    cmp ah, 0x01
    je .print
    mov si, invalid_command
    cmp ah, 0x04
    je .print
    mov si, reset_failed
    cmp ah, 0x05
    je .print
    mov si, disk_changed
    cmp ah, 0x06
    je .print
    mov si, dma_boundary
    cmp ah, 0x09
    je .print
    mov si, bad_sector
    cmp ah, 0x0A
    je .print
    mov si, bad_track
    cmp ah, 0x0B
    je .print
    mov si, media_type
    cmp ah, 0x0C
    je .print
    mov si, sector_not_found
    cmp ah, 0x10
    je .print
    mov si, general_failure
    cmp ah, 0x20
    je .print
    mov si, unknown_error
.print:
    call print_string
    pop si
    ret

success_msg db 'Read successful. Content: ', 0
error_msg db 'Error reading disk. Reason: ', 0
unknown_error db 'Unknown error', 0
invalid_command db 'Invalid command', 0
reset_failed db 'Disk reset failed', 0
disk_changed db 'Disk changed', 0
dma_boundary db 'DMA boundary error', 0
bad_sector db 'Bad sector', 0
bad_track db 'Bad track', 0
media_type db 'Unsupported media type', 0
sector_not_found db 'Sector not found', 0
general_failure db 'General failure', 0

buffer:

times 510-($-$$) db 0
dw 0xaa55

第2块扇区第1号扇区的数据,剩下的全部都设置为0x00

Data db 'Hi, I come from hard disk drive!'
times 510-($-$$) db 0x00

使用Nasm编译器编译代码,分别写入第1块和第二块扇区,数据如下。

通过VirtualBox来运行