17

我很想知道是否有任何特殊的 GAS 语法可以实现与 NASM 示例中相同的功能:

SECTION .data       

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

特别是我对$代表当前地址的符号感兴趣。

4

3 回答 3

27

摘自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 版本,用于让汇编程序为您计算某物的长度。

于 2012-07-07T12:35:30.860 回答
7

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 指令的替代方案。


于 2012-01-24T13:52:54.903 回答
5

的示例用法.

最小的显式示例:

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 .
于 2015-10-16T08:09:03.013 回答