C 中 fgetc() 函数的行为

Behavior of fgetc() function in C

我正在寻找一种在 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() call, seg 故障。如果我在我的函数里明明写fgetc(0);,也会出现segmentation fault。我不明白 fgetc() 函数如何区分 stdin 和普通的 0

如何使用此(或非常相似的模式)阅读 stdin?或者,如果全部错误,我应该怎么做才能在 x64 程序集中打开文件?关于它的工作原理,肯定有一些我没有得到的东西,将不胜感激。

(对于那些想知道这一切有什么意义的人:它能够在不移动文件指针的情况下读取下一个字符,所以有一个 peekchar 函数设置 PORT.p如果未设置,那么 p 可以保留该值直到被读取)

这在使用 C 编译时有效,但由于 == 运算符的错误使用而无法使用汇编代码。

因为 C 编译器只定义了字符串 "stdin" 一次,所以字符串指针相等,这使得它看起来有效,但是当从汇编代码调用它时,指针改变了,条件不能被满足。

strcmp() 替换 == 解决了问题