如何在裸机上获取平面二进制代码地址?

how to get flat binary code address on bare metal?

我有一个汇编文件的源代码,我想在将它转换为二进制文件后对其进行反汇编,以便我可以在正确的位置设置断点。

我尝试使用 objdump 和以下命令(我使用的是 ORG 语句,这就是我使用 --adjust-vma 的原因)

objdump -Mintel,i386 -b binary --adjust-vma=0x0500 -D foo.o -m i386 | less

这在某种程度上有效,但它混淆了指令,例如在我的源代码中我有

    pop bx
    inc bx  ; bx is used in the internal copy_sector_byte loop
    cmp cx, 512
    jne .copy_sector_byte  
    pop bx 

但它被翻译成

 5a9:   5b                      pop    ebx
 5aa:   43                      inc    ebx
 5ab:   81 f9 00 02 75 e7       cmp    ecx,0xe7750200
 5b1:   5b                      pop    ebx

注意 75 e7jne 指令的二进制代码。

我可以告诉 objectdump 以某种方式(或使用其他程序)使用我拥有的源文件吗?你有什么建议?

我是装配新手。谢谢

你可以得到NASM在汇编时做一个“列表”:nasm -l foo.lst foo.asm(使用默认的平面二进制输出模式,默认输出文件名foo)。或者,如果您只想即时查看列表,请使用 nasm -l /dev/stdout foo.asm | less 将列表写入标准输出。

但不幸的是,输出不遵守 org 指令,它仍然相对于图像基础:

     1                                  org 0x7c00
     2                                  
     3 00000000 31C0                    xor ax,ax
     4 00000002 8ED8                    mov ds, ax
     5                                  
     6 00000004 686869                  push "hi"
     7 00000007 C706[0D00]7879          mov word [var], 'xy'
     8                                  
     9 0000000D 68656C6C6F              var: db "hello"

或@MichaelPetch 在评论中建议:

Personally I would be generating an ELF version of the kernel file and a binary version. The ELF version can contain the debug information while the binary version will be what is executed.

I'd stop using binary as the output type of a linker script. Just have it generate ELF executable and then convert the ELF executable to a binary file with objcopy. The binary file runs on the remote machine, the ELF file is used in the debugger.

The ELF file can be used by the debugger for symbolic information which is the easiest thing to debug with.

I will say that GDB and QEMU are tricky to debug 16-bit real mode code with since GDB has no real understanding of segment:offset addressing in real mode.

BOCHS 有一个内置的调试器理解分段,并且有内置的命令来解析 IDT 和 GDT只是转储原始字节。

Michael 过去曾推荐使用 BOCHS 来调试切换到受保护 and/or 长模式的引导加载程序。