我很想知道是否有任何特殊的GAS语法可以像在NASM示例中那样实现相同的目标:
SECTION .data
msg: db "Hello World",10,0 ; the 0-terminated string.
len: equ $-msg ; "$" means current address.
特别是我对代表当前地址的符号$
感兴趣。
答案 0 :(得分:20)
摘自info as
(GNU Binutils 2.21.90):
5.4 The Special Dot Symbol
==========================
The special symbol `.' refers to the current address that `as' is
assembling into. Thus, the expression `melvin: .long .' defines
`melvin' to contain its own address. Assigning a value to `.' is
treated the same as a `.org' directive. Thus, the expression `.=.+4'
is the same as saying `.space 4'.
答案 1 :(得分:5)
天然气和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指令。
答案 2 :(得分:3)
.
最小显式示例:
x: .long .
mov x, %eax
mov $x, %ebx
/* eax == ebx */
字符串长度的常用组合:
s: .ascii "abcd"
s_len = . - s
mov $s_len, %eax
/* eax == 4 */
Is there a difference between equals sign assignment "x = 1" and ".equ x, 1" or ".set x, 1" in GNU Gas assembly? 解释了 s_len =
语法
无限循环:
jmp .