2012-12-02 158 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是在我的內核中完成的,我已經有了一箇中斷例程。 –