簡體   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