如果连 BIOS 调用都不想用,可以在单步中断中直接修改内存来记录触发次数:
; 极简版:单步中断只递增一个内存计数器 ORG 0x7C00 BITS 16 start: CLI MOV AX, 0x0000 MOV DS, AX MOV SS, AX MOV SP, 0x7C00 ; 设置中断向量 MOV WORD [0x0004], step_handler MOV WORD [0x0006], 0x0000 ; 清零计数器 MOV WORD [counter], 0 ; 开启单步模式 PUSHF POP AX OR AX, 0x0100 PUSH AX POPF ; 执行几条指令(每条都会触发中断,递增 counter) MOV AX, 0xAAAA MOV BX, 0xBBBB ADD AX, BX XOR AX, BX ; 关闭单步模式 PUSHF POP AX AND AX, 0xFEFF PUSH AX POPF HLT step_handler: INC WORD [counter] ; 记录触发次数 IRET counter DW 0 times 510 - ($ - $$) DB 0 DW 0xAA55编译与运行(以 Bochs 为例)
# 1. 保存代码为 single_step.asm # 2. 使用 NASM 编译 nasm -f bin single_step.asm -o single_step.bin # 3. 创建软盘镜像(可选) dd if=/dev/zero of=floppy.img bs=512 count=2880 dd if=single_step.bin of=floppy.img conv=notrunc # 4. 在 Bochs 中运行(或 QEMU) qemu-system-x86_64 -fda floppy.img