是否有一个符号代表GNU GAS汇编中的当前地址?

时间:2012-01-24 13:39:30

标签: assembly gnu gas memory-address

我很想知道是否有任何特殊的GAS语法可以像在NASM示例中那样实现相同的目标:

SECTION .data       

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

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

3 个答案:

答案 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 .