0

我正在尝试在 C 文件中编写内联汇编,但出现 2 个错误:

open.c:10: Error: junkptr nombre'在表达式后`

open.c:10: Error: suffix or operands invalid for莱斯'`

这是我的文件:

int open(char * nombre, unsigned char modo)
{
  int retval;
  int nrllamada = 6;
  asm("mov $8,%%ah \n\t"
      "les %%bx, dword ptr nombre \n\t"
      "int $0x22 \n\t"
      "mov %%eax,%0 \n\t"
      : "=r"(retval)
      : "a"(modo)
  );
  return retval;
}
4

3 回答 3

1

将名为 nombre 的 32 位指针写入寄存器 ES 和 BX 的正确方法是将 C 变量 nombre 连接到寄存器 ECX,将 ECX 的低 16 位移动到寄存器 BX,将 ECX 寄存器旋转 16 位,使低 16 位变为到同一寄存器的高 16 位,反之亦然,最后将 ECX 的低 16 位移动到 ES。

int open(char * nombre, unsigned char modo)
{
  int retval;
  // numero servicio 6
  // nombre del fichero a abrir (ES:BX) y modo (AL) de apertura
  asm("mov $6,%%ah \n\t"
      "mov %%cx,%%bx \n\t"
      "rol $16,%%ecx \n\t"
      "mov %%cx,%%es \n\t"
      "int $0x22 \n\t"
      "mov %%eax,%0 \n\t"
      : "=r"(retval)
      : "a"(modo), "c"(nombre)
  );
  return retval;       
}
于 2012-12-02T17:59:43.390 回答
1
"les %%bx, dword ptr nombre \n\t"

您在字符串中有 ptr nombre 。那可能是不正确的。您确定要在函数的参数中引用 char* 名词吗?

于 2012-12-02T04:03:31.440 回答
0

GCC 是 32 位编译器。这也意味着,您最有可能尝试摆脱es:bx类型指针算法并转向平面 32 位寻址(其中 cs=ds=es=0 的基数,每个段限制为 0xffffffff)。

在受保护模式的用户空间中访问状态寄存器很可能会出现访问冲突异常。

另外,什么是操作系统,允许 int 22h 以及它期望 es:bx 输入的位置?在 MS-DOS 中不应该调用它,因为它只是用作静态变量来恢复其他中断向量。

于 2012-12-02T19:04:46.737 回答