我正在寻找一种在 Linux 上的 x86-64 程序集中管理文件打开和关闭的简单方法。我认为最简单的方法是编写一个 c 文件,其中包含我可以调用而不必担心稳定性的函数。所以我写了这个函数:
struct PORT open_port(char *filename, int mode) {
struct PORT port;
port.p = 0;
if (mode) {
if (filename == "stdout")
port.f = stdout;
else
port.f = fopen(filename, "wb+");
} else {
if (filename == "stdin")
port.f = stdin;
else
port.f = fopen(filename, "rb");
}
return port;
}
然后我像这样读取端口:
char readchar(struct PORT *port)
{
char r;
if ((*port).p)
r = (*port).p;
else
r = fgetc((*port).f);
(*port).p = 0;
return r;
}
其中 PORT.p
是一个包含当前位置字符的字符,PORT.f
是一个文件指针。然后,我通过将参数放入 %rdi
和 %rsi
来在我的汇编代码中调用这些函数。
当我读取普通文件时,一切都按预期工作,但 stdin
支持不起作用。我知道 stdin
应该是值 0
并且当我调试我的代码时,我可以看到保存文件指针的值确实是 0
,但是当代码到达 fgetc()
调用时,它会出现错误。如果我在我的函数中明明写 fgetc(0);
,也会出现段错误。我不明白 fgetc()
函数如何区分 stdin
和普通 0
。
如何使用这个(或非常相似的模式)读取 stdin
?或者,如果全部错误,我应该怎么做才能在 x64 程序集中打开文件?关于它的工作原理,肯定有一些我没有得到的东西,将不胜感激。
(对于那些想知道这一切有何意义的人:无需[表面上]移动文件指针就能够读取下一个字符,因此有一个设置 PORT.p< 的 peekchar 函数
如果未设置,则 p
可以保留该值直到被读取)
最佳答案
这在使用 C 编译时有效,但由于错误使用了 ==
运算符而无法使用汇编代码。
由于 C 编译器只定义了字符串 "stdin"
一次,字符串指针相等,这使得它看起来有效,但是当从汇编代码调用它时,指针改变了,条件无法满足。
用 strcmp()
替换 ==
解决了它
关于c - C 中 fgetc() 函数的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36660359/