调用int 0x13中断后,自动跳转

发布于 2021-11-21 13:05:04 字数 2830 浏览 900 评论 0

环境如下:

ubuntu 13.10 amd_64

nasm 2.10.07

bochs 2.4.5

代码如下:

org 0x7c00

    jmp     entry
    nop

	BS_OEMName	DB 'ForrestY'	; OEM String, 必须 8 个字节
	BPB_BytsPerSec	DW 512		; 每扇区字节数
	BPB_SecPerClus	DB 1		; 每簇多少扇区
	BPB_RsvdSecCnt	DW 1		; Boot 记录占用多少扇区
	BPB_NumFATs	DB 2		; 共有多少 FAT 表
	BPB_RootEntCnt	DW 224		; 根目录文件数最大值
	BPB_TotSec16	DW 2880		; 逻辑扇区总数
	BPB_Media	DB 0xF0		; 媒体描述符
	BPB_FATSz16	DW 9		; 每FAT扇区数
	BPB_SecPerTrk	DW 18		; 每磁道扇区数
	BPB_NumHeads	DW 2		; 磁头数(面数)
	BPB_HiddSec	DD 0		; 隐藏扇区数
	BPB_TotSec32	DD 0		; wTotalSectorCount为0时这个值记录扇区数
	BS_DrvNum	DB 0		; 中断 13 的驱动器号
	BS_Reserved1	DB 0		; 未使用
	BS_BootSig	DB 29h		; 扩展引导标记 (29h)
	BS_VolID	DD 0		; 卷序列号
	BS_VolLab	DB 'OrangeS0.02'; 卷标, 必须 11 个字节
	BS_FileSysType	DB 'FAT12   '	; 文件系统类型, 必须 8个字节  

entry:
    mov     ax, 0
    mov     ss, ax
    mov     sp, 0x7c00
    mov     ds, ax
    mov     es, ax
   
read:
    mov     ah, 0x00
    mov     dl, 0x00
    int     0x13 ; bochs执行后跳转0x000fe3fe
    
    mov     ax, 0
    mov     es, ax
    mov     bx, 0x8200       ; es:bx 缓存地址
    mov     ch, 0       ; 柱面号
    mov     dh, 1       ; 磁头号
    mov     cl, 15     ; 第5位放入所读的起始扇区号,
    mov     ah, 0x02    ; 0x02 读盘
    mov     al, 2       ; 要读取的扇区数目
    mov     dl, 0x00    ; 驱动器号
    int     0x13
    jc      read
    
    times 	510-($-$$)	db	    0   ; 填充剩下的空间,使生成的二进制代码恰好为512字节
    dw 	    0xaa55				    ; 结束标志
代码中首次调用int 0x13后跳转的0x000fe3fe,是什么原因导致的,请教大神。


寄存器:

eax: 0x00000000 0
ecx: 0x00090000 589824
edx: 0x00000000 0
ebx: 0x00000000 0
esp: 0x00007bfa 31738
ebp: 0x00000000 0
esi: 0x000e46dc 935644
edi: 0x0000ffac 65452
eip: 0x0000e3fe
eflags 0x00000082: id vip vif ac vm rf nt IOPL=0 of df if tf SF zf af pf cf


es:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
	Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
cs:0xf000, dh=0x0000930f, dl=0x0000ffff, valid=1
	Data segment, base=0x000f0000, limit=0x0000ffff, Read/Write, Accessed
ss:0x0000, dh=0x00009300, dl=0x0000ffff, valid=7
	Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ds:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
	Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
fs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
	Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
gs:0x0000, dh=0x00009300, dl=0x0000ffff, valid=1
	Data segment, base=0x00000000, limit=0x0000ffff, Read/Write, Accessed
ldtr:0x0000, dh=0x00008200, dl=0x0000ffff, valid=1
tr:0x0000, dh=0x00008b00, dl=0x0000ffff, valid=1
gdtr:base=0x000fb6a7, limit=0x30
idtr:base=0x00000000, limit=0x3ff



如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文