首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在组装英特尔x64为什么要在stdin周围放置方括号?

在组装英特尔x64为什么要在stdin周围放置方括号?
EN

Stack Overflow用户
提问于 2016-09-03 19:47:54
回答 1查看 515关注 0票数 0

今天是做练习,从大会调用fget。为了将文件*传递给文件流,我编写了mov rdx, [stdin]

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

正如我所理解的,mov指令操作数中的方括号与C中的取消引用指针相同。我还知道libc在运行时动态地链接到我的可执行文件,并映射到程序虚拟内存地址空间的堆栈和堆之间。

x64,Linux,Linux。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-09-03 19:58:22

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

如果将stdin的地址(与lea rdx, [rel stdin]一起传递)声明为FILE stdin,并在C中使用为fgets(buf, size, &stdin),则该地址将起作用。

libc对FILE *stdin;的定义相当于此asm。

代码语言:javascript
复制
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

stdin实际上可能在BSS中,它所指向的数据很可能是由glibc函数动态分配的。

stdin是一个不透明的指针。您不需要关心它指向什么,只需要它持有一个指向实际FILE对象的指针,这就是您需要传递给fget的内容。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39310748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档