【问题标题】:What is the address of local labels in NASM?NASM 中本地标签的地址是什么?
【发布时间】:2013-07-06 08:05:42
【问题描述】:

NASM 汇编器中,可以使用. 前缀声明本地标签。

  1. 那么,本地标签的地址(以及所有汇编程序中的标签)的地址是什么?是相对的还是绝对的,还是看用途?

我问是因为有些功能让我感到困惑。这是一个示例代码:

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 指令一起使用,则地址计算为相对于原点的普通绝对地址。

  1. 但是如果我使用标签并将它与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


【解决方案1】:

来自NASM user manual

3.9 本地标签

NASM 对以句点开头的符号进行特殊处理。一种 以单个句点开头的标签被视为本地标签, 这意味着它与之前的非本地标签相关联。 所以,例如:

label1  ; some code 

.loop 
    ; some more code 

    jne     .loop 
    ret 

label2  ; some code 

.loop 
    ; some more code 

    jne     .loop 
    ret 

在上面的代码片段中,每条 JNE 指令都会跳转到它之前的行,因为 .loop 的两个定义 由于每个都与前一个相关联,因此它们保持分开 非本地标签。

这种本地标签处理形式是从旧的 Amiga 借来的 汇编程序开发包;然而,NASM 更进一步,允许 从代码的其他部分访问本地标签。这是实现的 通过根据先前的非本地定义一个本地标签 label:上面.loop的第一个定义其实就是定义一个符号 称为label1.loop,第二个定义了一个符号,称为 标签2.loop。所以,如果你真的需要,你可以写

label3  ; some more code 
        ; and some more 

        jmp label1.loop

【讨论】:

  • 在我问这个的时候,我没有足够的关于汇编的信息,所以我的问题不准确。实际上,我在问如何获取标签的绝对地址。这就是我可以通过在需要地址的地方使用标签名称来做的事情,NASM 将为我管理其他所有事情。我现在想删除我的问题,所以如果你能删除你的答案,我会这样做。
  • 如果要获取标签的有效地址,使用汇编指令LEA,返回内存(标签)的有效地址并保存在注册表中LEA
  • 或者我只是使用符号名称。别担心(:)),我现在明白了,这就是为什么我认为不再需要这个问题了。
  • 此答案(和问题)很有帮助,不应删除。
【解决方案2】:

NASM 中本地标签的地址与标签不是本地标签的地址完全相同。

唯一改变的是标签的名称被附加到前一个非本地标签。

小例子:

outside_label:

    ; This should be not done in practice,
    ; but shows how it works under the hood.
    jmp outside_label.inside_label
    ; This is not reached.
.inside_label:

    ; This is what you should do in practice.
    ; Labels also get appended when used as arguments.
    jmp .inside_label2
    ; This is not reached.
.inside_label2:

【讨论】:

    猜你喜欢
    • 2015-10-21
    • 1970-01-01
    • 2021-11-30
    • 2011-12-11
    • 2014-08-19
    • 1970-01-01
    • 2016-12-23
    • 2011-09-19
    • 2017-12-22
    相关资源
    最近更新 更多