我很想知道是否有任何特殊的 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
这是NASM ( len equ $ - symbol
)中使用的相同习语的 GAS 版本,用于让汇编程序为您计算某物的长度。
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 指令的替代方案。
的示例用法.
最小的显式示例:
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 独立示例中。
无限循环:
jmp .