NASM中本地标签的地址是什么?

时间:2013-07-06 08:05:43

标签: assembly x86 nasm memory-address

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

  1. 那么,本地标签的地址是什么(通常是所有汇编程序中的标签)?它是相对的还是绝对的,还是取决于使用?
  2. 我问,因为有些功能让我很困惑。这是一个示例代码:

    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一起使用(如最后一行所示),会发生什么?跳转的偏移是从绝对地址计算的吗?
    2. 我问这一切是因为我的代码中有本地标签(.LNXYZ,随机生成),我需要制作具有4字节元素的地址列表(来自那些标签)包含跳转的绝对地址。这样的事情可能,或者我必须使用普通标签?是否有任何指示?

2 个答案:

答案 0 :(得分:5)

来自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借来的   汇编程序DevPac;然而,NASM更进一步,允许   从代码的其他部分访问本地标签。这是实现的   通过根据先前的非本地标准定义本地标签   label:上面.loop的第一个定义实际上是定义一个符号   名为label1.loop,第二个定义了一个名为   label2.loop。所以,如果你真的需要,你可以写

label3  ; some more code 
        ; and some more 

        jmp label1.loop

答案 1 :(得分:1)

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: