gnu内联汇编错误

时间:2012-12-02 03:23:08

标签: c gcc assembly gnu inline-assembly

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

open.c:10: Error: junk ptr nombre'表达后'

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

这是我的档案:

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;
}

3 个答案:

答案 0 :(得分:1)

"les %%bx, dword ptr nombre \n\t"

你在字符串中有ptr nombre。这可能不正确。你当然想在函数的参数中引用char * nombre吗?

答案 1 :(得分:1)

在寄存器ES和BX中写入名为nombre的32位指针的正确方法是将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;       
}

答案 2 :(得分:0)

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

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

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