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

use*_*443 3 x86 assembly nasm memory-address

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
Run Code Online (Sandbox Code Playgroud)

如果我使用一些普通标签(如start)进行引用,并将其与lea指令一起使用,则地址将被视为相对于原点的普通绝对地址。

  1. 但是,如果我带上标签并与之一起使用short(如最后一行所示),会发生什么情况?是否从绝对地址计算出跳转的偏移量?

我之所以这么问,是因为我的代码中有本地标签(.LNXYZ,是随机生成的),并且需要列出地址列表(从这些标签中),该地址列表将包含4字节的元素,其中包含用于跳转的绝对地址。这样有可能吗,还是我必须使用普通标签?有任何指令吗?

小智 5

NASM用户手册

3.9本地标签

NASM对以句点开头的符号给予特殊对待。以单个句点开头的标签被视为本地标签,这意味着它与先前的非本地标签相关联。因此,例如:

label1  ; some code 

.loop 
    ; some more code 

    jne     .loop 
    ret 

label2  ; some code 

.loop 
    ; some more code 

    jne     .loop 
    ret 
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,每条JNE指令跳到紧接其前的那一行,因为.loop的两个定义由于各自与先前的非本地标签相关联而保持分离。

这种本地标签处理形式是从旧的Amiga汇编程序DevPac借用的;但是,NASM更进一步,它允许从代码的其他部分访问本地标签。这是通过根据先前的非本地标签定义本地标签来实现的:上面的.loop的第一个定义实际上是定义了一个称为label1.loop的符号,第二个定义了一个称为label2.loop的符号。因此,如果您确实需要,可以写

label3  ; some more code 
        ; and some more 

        jmp label1.loop
Run Code Online (Sandbox Code Playgroud)