问什么自编译和boch不一致?我想从软盘上读取内容,出现错误。
mycode:
Load_FAT:
and di, 0x0ffe0
add di, 0x1a # 起始簇号的偏移量26
mov cx, word ptr es:[di] # cx是起始簇号
push cx # 保存簇号, 因为Load_File用到. 空文件的簇号是0, 要处理 # TODO
mov ax, 0x00
mov es, ax
mov bx, 0x8000 # es:bx=>数据缓冲区
mov ax, word ptr [BPB_RsvdSecCnt] # 待读取的起始LBA扇区号
mov cx, word ptr [BPB_FATSz16] # 要读入的扇区个数
call Func_ReadSectors
objdump disas:
1e9: 83 e7 e0 and $0xffe0,%di
1ec: 83 c7 1a add $0x1a,%di
1ef: 26 8b 0d mov %es:(%di),%cx
1f2: 51 push %cx
1f3: b8 00 00 mov $0x0,%ax
1f6: 8e c0 mov %ax,%es
1f8: bb 00 80 mov $0x8000,%bx
1fb: a1 44 00 mov 0x44,%ax
1fe: 8b 0e 4c 00 mov 0x4c,%cx
202: e8 7c ff call 0x181
bochs disas:
# memory start from 0x10000
000101e9: ( ): and di, 0xffe0 ; 83e7e0
000101ec: ( ): add di, 0x001a ; 83c71a
000101ef: ( ): mov cx, word ptr es:[di] ; 268b0d
000101f2: ( ): push cx ; 51
000101f3: ( ): mov ax, 0x0000 ; b80000
000101f6: ( ): mov es, ax ; 8ec0
000101f8: ( ): mov bx, 0x8000 ; bb0080
000101fb: ( ): mov ax, word ptr ds:0x44 ; a14400
000101fe: ( ): mov cx, word ptr ds:0x0 ; 8b0e0000
00010202: ( ): add byte ptr ds:[bx+si], al ; 0000
00010204: ( ): add byte ptr ds:[si], cl ; 004c00
00010207: ( ): call .-132 ; e87cff
因为bochs运行mov cx, word ptr ds:0x0
,我得到了错误的结果。
看起来好像在该指令的末尾和下一条指令的开始处在地址00010200
处至少存储了4个字节的零。请注意,反汇编中的next指令为add byte ptr ds:[bx+si], al ; 0000
,它也与您的源代码或objdump不匹配。
在BOCHS中设置一个观察点,以查看哪些指令在执行之前覆盖了您的代码字节。
或者实际上结果是nothing从未写过,甚至没有写过扇区加载器,因为第一级引导加载器中存在偏移错误。 BOCHS将该内存初始化为00
。 (请参阅@MichaelPetch的注释;所有对他进行调试的功劳都归功于他。)
BTW,objdump
具有-Mintel
模式,因此您可以使其使用与BOCHS和源相同的语法。