我如何获得标签的地址?
我想在平面汇编程序中获取标签的地址,而无需添加额外的代码
示例:
label1: ;is at adress 0
db 1h,2h,3h,4h,5h ;some data
label2: ;is at adress 5 because label1 has 5 bytes of data
我可以将地址打印到控制台屏幕,但这会增加程序的大小并更改结果。
我知道只是使用标签,但我想要原始地址编号。
答案 0 :(得分:1)
快速解决方案:
我只是将所有符号放在汇编文件的最后,然后用十六进制编辑器查看它:
示例:
label1: ;example label (can be anywhere)
;...
;... My Programm
;...
;the end of the program
db 0h ;just some spacer
dw label1
答案 1 :(得分:0)
使用调试符号构建程序,因此目标文件中的符号表(元数据)包含所有标签的地址。
然后,您可以使用objdump -t
转储可执行文件的符号表,或执行相同操作的任何其他程序。
除符号表外,标签地址将嵌入到指令中的二进制文件中,例如在用于寻址模式,立即操作数或作为数据的绝对寻址模式中(例如.dd label2
)。正常跳转使用相对编码,因此您无法在跳转的指令编码中找到绝对符号地址。
TL:DR:可以反汇编二进制文件以查找绝对地址,但仅适用于那种使用的标签,因此符号表更方便。
如果您正在组装平面二进制文件(如引导扇区),则文件格式中没有符号表。因此,当您使用命令行选项执行此操作时,您依赖于为您提供FASM打印符号信息。我用Google搜索并发现there's a -s
option写了一个.fas
符号信息调试输出文件。