use*_*443 3 x86 assembly nasm memory-address
在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
Run Code Online (Sandbox Code Playgroud)
如果我使用一些普通标签(如start)进行引用,并将其与lea指令一起使用,则地址将被视为相对于原点的普通绝对地址。
short(如最后一行所示),会发生什么情况?是否从绝对地址计算出跳转的偏移量?我之所以这么问,是因为我的代码中有本地标签(.LNXYZ,是随机生成的),并且需要列出地址列表(从这些标签中),该地址列表将包含4字节的元素,其中包含用于跳转的绝对地址。这样有可能吗,还是我必须使用普通标签?有任何指令吗?
小智 5
从NASM用户手册:
3.9本地标签
NASM对以句点开头的符号给予特殊对待。以单个句点开头的标签被视为本地标签,这意味着它与先前的非本地标签相关联。因此,例如:
Run Code Online (Sandbox Code Playgroud)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更进一步,它允许从代码的其他部分访问本地标签。这是通过根据先前的非本地标签定义本地标签来实现的:上面的.loop的第一个定义实际上是定义了一个称为label1.loop的符号,第二个定义了一个称为label2.loop的符号。因此,如果您确实需要,可以写
Run Code Online (Sandbox Code Playgroud)label3 ; some more code ; and some more jmp label1.loop