2

我是at&t语法新手。我用 .c 编译了一个 test.c 文件gcc -S test.c

test.s 文件的一部分:

 1. .file "test.c"
 2. .local temp
 3. .comm temp,8,4
 4. ...
 5. funtion1:
 6. blah
 7. blah
 8. blah
 9. movl $temp, -8(%ebp)

我知道-8(%ebp)是本地变量,但不确定是什么$temp意思

如何在 nasm 中做到这一点?

我在 .bss 部分有一个全局温度

我能说......么:

  1. mov eax, [ebp-8]; eax 是否包含 [ebp-8] 的内存地址?
  2. mov ebx, temp; ebx 是否包含 temp 的地址?
  3. mov [eax], ebx; 这是否意味着使局部变量指向 temp,或者它在局部变量中创建 temp 的副本?
4

2 回答 2

1

movl $temp, -8(%ebp)将您的地址写入temp局部变量中ebp-8 这可以在 nasm 中完成mov dword [ebp-8], temp

要回答您的其他问题:

  1. 不,eax包含局部变量 at 的值[ebp-8]。要加载地址,您可以使用lea eax, [ebp-8]
  2. 是的
  3. temp如果保存局部变量的地址,则使局部变量成为指向 的指针eax(参见第 1 点)。
于 2012-11-02T01:30:42.433 回答
0

要转换成普通的 x86 语法: 1. 删除寄存器前面的 %:movl $LC0, (%esp) => movl $LC0, (esp) 2. 删除常量前面的 $:movl $LC0 , (esp) => movl LC0, (esp) 3. 将 () 改为 []: movl LC0, (esp) => movl LC0, [esp] 4. 反转操作数的顺序:movl LC0, [esp] = > movl [esp], LC0 5. 将指令大小后缀转换为前缀:mov [esp], dword LC0。

我在这里找到了答案: http ://www.cplusplus.com/forum/lounge/88169/

于 2013-07-02T19:31:00.077 回答