我想知道是否有特殊的GAS语法可以实现与NASM示例相同的功能:
SECTION .data
msg: db "Hello World",10,0 ; the 0-terminated string.
len: equ $-msg ; "$" means current address.
特别是我对符号 $
表示当前地址感兴趣。
我想知道是否有特殊的GAS语法可以实现与NASM示例相同的功能:
SECTION .data
msg: db "Hello World",10,0 ; the 0-terminated string.
len: equ $-msg ; "$" means current address.
特别是我对符号 $
表示当前地址感兴趣。
摘自 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
len equ $ - symbol
) 的 GAS 版本,它可以让汇编程序自动计算某个元素的长度。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指令的替代方案。
.
的样例用法
最简明显例子:
x: .long .
mov x, %eax
mov $x, %ebx
/* eax == ebx */
字符串长度的常见组合:
s: .ascii "abcd"
s_len = . - s
mov $s_len, %eax
/* eax == 4 */
s_len =
是在 GNU Gas 汇编中,等号赋值 "x = 1" 和 ".equ x, 1" 或 ".set x,1" 之间的语法解释。
例如,在一个最小可运行的 x86 Linux freestanding 示例中可以具体使用它。
无限循环:
jmp .
.
(或许?)与NASM中的$
几乎完全相同,并且对于这个例子可以使用。 - Peter Cordes