在汇编Intel x64时,为什么要在stdin周围放置方括号

时间:2016-09-03 19:47:55

标签: assembly x86 gdb dereference

今天正在通过从程序集调用 fgets 进行练习。 为了将FILE *传递给文件流,我写了&lt;!--</body>--&gt; &lt;/body&gt;

但为什么它应该放在方括号?因为我不需要指针的值只是指针本身。应该提一下,lea rdx,[stdin]也行不通。我记得,它会导致SIGSEGV被发送到程序。

据我所知,mov rdx, [stdin]指令的操作数中的方括号与C中的解除引用指针的含义相同。另外我知道libc在运行时动态链接到我的可执行文件,并映射到堆栈和程序虚拟内存堆之间的某处地址空间。

YASM,glibc,Linux x64。

1 个答案:

答案 0 :(得分:2)

FILE *stdin;是指针类型的全局变量。这意味着存储在静态位置的值是您想要的指针。由于我们要传递的是存储在标有stdin的位置的指针,因此我们需要从[stdin]加载而不是传递{{1}的地址}符号。

传递stdin(带stdin)的地址,如果它被声明为lea rdx, [rel stdin],并在C中用作FILE stdin,则会有效。

libc对fgets(buf, size, &stdin)的定义等同于此asm。

FILE *stdin;

section .data stdin: dq stdin_FILE_struct ; This is a pointer stored in memory section .bss ... stdin_FILE_struct: ;; TOTALLY MADE UP, it's not actually like this resq 1 ; something resd 1 ; something_else resb 4096 ; buffer 实际上可能在BSS中,它指向的数据很可能由glibc init函数动态分配。

stdin是一个不透明的指针。你不需要关心它指向的内容,只是它拥有指向实际stdin对象的指针,以及你需要传递给fgets的内容。