在GNU GAS汇编中,是否有代表当前地址的符号?

19

我想知道是否有特殊的GAS语法可以实现与NASM示例相同的功能:

SECTION .data       

    msg:    db "Hello World",10,0  ; the 0-terminated string.
    len:    equ $-msg              ; "$" means current address.

特别是我对符号 $ 表示当前地址感兴趣。

3个回答

29

摘自 info as (GNU Binutils 2.21.90)或在线GAS手册中:https://sourceware.org/binutils/docs/as/Dot.html

5.4 特殊点符号

特殊符号.指的是as正在汇编的当前地址。 因此,表达式melvin: .long .定义了melvin包含其自身的地址。

将一个值赋给..org指令相同。因此,表达式.=.+4等同于.space 4

msg:    .ascii "Hello World!\n"       # not zero-terminated, use .asciz for that
msglen = . - msg                      # A .equ directive would be equivalent

这是一个针对编译器汇编语言 NASM 中所使用的 习语(len equ $ - symbol) 的 GAS 版本,它可以让汇编程序自动计算某个元素的长度。

7
这里有一个关于gas和NASM的有用比较:http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html 特别是看一下这部分,我认为它回答了你的问题:
清单2还介绍了位置计数器的概念(第6行)。 NASM提供了一个特殊的变量($和$$变量)来操作位置计数器。在GAS中,没有办法操作位置计数器,您必须使用标签来计算下一个存储位置(数据、指令等)。 例如,要计算字符串的长度,在NASM中可以使用以下习惯用语:
prompt_str db 'Enter your name: '
STR_SIZE equ $ - prompt_str     ; $ is the location counter

$$ 表示当前的位置计数器的值,将标签(所有变量名都是标签)的值从此位置计数器减去得到声明该标签和当前位置之间存在的字节数。equ指令用于将变量STR_SIZE的值设置为其后的表达式的值。在GAS中的类似说法如下:

prompt_str:
     .ascii "Enter Your Name: "

pstr_end:
     .set STR_SIZE, pstr_end - prompt_str

结束标签(pstr_end)给出了下一个位置的地址,减去起始标签地址就得到了大小。还要注意使用.set来将变量STR_SIZE的值初始化为逗号后面的表达式。相应的.equ也可以使用。在NASM中没有GAS的set指令的替代方案。



在GAS中,.(或许?)与NASM中的$几乎完全相同,并且对于这个例子可以使用。 - Peter Cordes

5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接