Flat Assembler:如何获取标签的地址?

Flat Assembler: How do I get the address of an label?

如何获取标签的地址?

我想在不添加额外代码的情况下获取平面汇编程序中标签的地址

示例:

label1:  ;is at adress 0
db 1h,2h,3h,4h,5h  ;some data

label2: is at address 5 because label1 has 5 bytes of data

我可以将地址打印到控制台屏幕,但这会增加程序的大小并更改结果。

我知道只使用标签,但我想要原始地址号码。

使用调试符号构建程序,因此目标文件中的符号 table(元数据)包含所有标签的地址。

然后你可以使用objdump -t转储executable的符号table,或者任何其他做同样事情的程序。


除了符号table之外,标签地址将以二进制形式嵌入到指令中,例如在绝对寻址模式中用于寻址模式、立即操作数或作为数据(例如 .dd label2)。普通跳转使用相对编码,所以在跳转的指令编码中是找不到绝对符号地址的。

TL:DR:反汇编二进制文件以查找绝对地址是可能的,但仅适用于以这种方式使用的标签,因此符号 table 更方便。


如果您正在组装平面二进制文件(如引导扇区),则文件格式中没有符号 table。因此,当您使用命令行选项执行此操作时,您依赖于 FASM 为您打印符号信息。我用谷歌搜索,发现 there's a -s option 写了一个 .fas symbol-info 调试输出文件。

快速解决方案:

我只是将所有符号放在汇编文件的最后,然后用十六进制编辑器查看它:

示例:

label1: ;example label (can be anywhere)
;...
;... My Programm
;...

;the end of the program
db 0h ;just some spacer
dw label1