【发布时间】:2013-07-06 08:05:42
【问题描述】:
在NASM 汇编器中,可以使用. 前缀声明本地标签。
- 那么,本地标签的地址(以及所有汇编程序中的标签)的地址是什么?是相对的还是绝对的,还是看用途?
我问是因为有些功能让我感到困惑。这是一个示例代码:
ORG 0x400000 ;origin of address for labels
start: ;address here should be 0x400000
..... ;some code here
.loop ;local label
..... ;some code here
jmp short .loop ;<------- address is not taken as absolute
jmp short start
如果我使用一些普通标签(如start)进行引用并将其与lea 指令一起使用,则地址计算为相对于原点的普通绝对地址。
- 但是如果我使用标签并将它与
short一起使用(如最后一行),会发生什么?跳转的偏移量是从绝对地址计算的吗?
我问这一切是因为我的代码中有本地标签(.LNXYZ,随机生成),并且我需要制作地址列表(来自该标签),其中包含包含绝对地址的 4 字节元素跳跃。这样的事情可能吗,还是我必须使用普通标签?有什么指令吗?
【问题讨论】:
-
您可能希望
bits 32在此顶部。对于 16 位代码,您的来源似乎有点高(这是 Nasm 默认生成的。jmp label使用相对寻址模式 - 发出的实际代码将是jmp distance_to_label。标签是否为“本地”无关紧要与否。对于绝对跳转,您必须执行mov eax, label然后jmp eax。您不需要编码short- 如果合适,Nasm 应该给您一个short跳转,并且near跳转,如果它不会。我不确定我是否得到关于“随机生成”标签的部分...... -
那么如果我想要 NASM 生成的 32 位绝对值列表,我该怎么办?
标签: assembly x86 nasm memory-address