2012-12-02 55 views
0

我想写内联汇编在C文件中,我也得到2个错误:expression`GNU内嵌汇编错误

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

open.c:10: Error: junk PTR农布雷”这是我的文件:

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

回答

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;  
} 
1
"les %%bx, dword ptr nombre \n\t" 

你有一个字符串中PTR农布雷。这可能是不正确的。当然你想引用函数参数中的char * nombre?

0

GCC是32位编译器。这也意味着,你应该尽可能地去掉es:bx类型的指针算术,并移动到平坦的32位寻址(其中cs = ds = es = 0,每个段的限制为0xffffffff)。

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

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

+0

这是一个称为OSO的小操作系统的小内核,我正在编写,它使用fat12文件系统和16位CPU架构等旧技术。 int22h是在我的内核中完成的,我已经有了一个中断例程。 –