我很好奇,是否有任何特殊的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/