我很好奇,是否有任何特殊的GAS语法可以达到与NASM示例相同的效果:

SECTION .data

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


尤其是我对表示当前地址的符号$感兴趣。

最佳答案

在这里,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指令别无选择。

关于assembly - GNU GAS程序集中是否有代表当前地址的符号?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8987767/

10-12 16:00