繁体   English   中英

gnu内联汇编错误

[英]gnu inline assembly error

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

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

open.c:10: Error: suffix or operands invalid for les`` 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;
}
"les %%bx, dword ptr nombre \n\t"

你有一个字符串内的ptr nombre。 这可能不正确。 你肯定想在函数的参数中引用char * nombre吗?

在寄存器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;       
}

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM