【问题标题】:Trying to convert at&t to nasm试图将 at&t 转换为 nasm
【发布时间】:2012-11-01 23:21:32
【问题描述】:

我是 at&t 语法的新手。我用gcc -S test.c编译了一个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 的副本?

【问题讨论】:

  • 为了间接回答你的问题,为什么不用gcc output Intel syntax
  • 我有一个问题。照你说的做了。是的,看起来不错。 “mov edx, DWORD PTR [eax]”中的PTR是什么意思,因为它无处不在
  • 可以省略吗? @一种。韦伯

标签: assembly syntax x86 nasm


【解决方案1】:

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

完成

回答您的其他问题:

  1. 不,eax 包含[ebp-8] 处的局部变量的值。加载地址,可以使用lea eax, [ebp-8]
  2. 是的
  3. 如果eax 持有局部变量的地址,则使局部变量成为指向temp 的指针(参见第1 点)。

【讨论】:

  • 非常感谢 Jester :) mov dword [ebp-8], temp,这对我帮助很大
【解决方案2】:

要转换成正常的 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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-23
    • 1970-01-01
    • 2013-03-30
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    相关资源
    最近更新 更多