今天正在通过从程序集调用 fgets 进行练习。
为了将FILE *传递给文件流,我写了<!--</body>--> </body>
。
但为什么它应该放在方括号?因为我不需要指针的值只是指针本身。应该提一下,lea rdx,[stdin]也行不通。我记得,它会导致SIGSEGV被发送到程序。
据我所知,mov rdx, [stdin]
指令的操作数中的方括号与C中的解除引用指针的含义相同。另外我知道libc在运行时动态链接到我的可执行文件,并映射到堆栈和程序虚拟内存堆之间的某处地址空间。
YASM,glibc,Linux x64。
答案 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的内容。