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来运行
