1

我想fputs(str, stdout);从大会打电话。

为什么我应该push dword [stdout]而不是 just push stdout

既然在 C 中我们不这样做fputs(str, *stdout),为什么我们需要stdout在汇编中取消引用?

完整代码:

extern fputs
extern stdout

section .data
    hw: db "Hello World!", 10, 0

section .text
    global main

main:
    enter 0,0

    push dword [stdout]
    ;push stdout
    push hw
    call fputs

    leave
    mov eax, 0
    ret
4

1 回答 1

6

您正在取消引用 asm label stdout,这相当于在 C 中。它是内存中存储&stdout的静态位置。FILE*

只有 C 数组类型的行为类似于 asm 标签,其中 C 中的名称是地址,而不是内容。

另请参阅为什么在 NASM 中我们必须使用方括号 ([ ]) 来移动到内存位置?


在 NASM 中,一个裸符号名称是静态地址。在 C 中,一个简单的名称就是 value

(真正的 C 数组除外,其中的裸名是第一个元素的地址。)


在 C 中,具有自动存储类的变量(即本地变量)也可以有名称,而不仅仅是静态的。在 asm 中,符号只能放在静态地址上。(C 中的自动存储通常是 x86 asm 中的寄存器,或堆栈空间,例如[ebp - 8],如果您需要溢出/重新加载。堆栈地址不是链接时间常量,因此不能有标签。您可以相对于 ESP 或EBP。)

具有动态存储的对象在 C 中不能有名称,只能由命名指针指向。

于 2019-04-03T13:30:49.863 回答