0

インラインアセンブリをCファイルに書き込もうとすると、2つのエラーが発生します。

open.c:10: Error: junk式の後のptrnombre'`

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

これは私のファイルです:

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

3 に答える 3

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

文字列内にptrnombreがあります。それはおそらく正しくありません。確かに、関数の引数でchar * nombreを参照したいですか?

于 2012-12-02T04:03:31.440 に答える
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;       
}
于 2012-12-02T17:59:43.390 に答える
0

GCCは32ビットコンパイラです。これは、型ポインタ演算を取り除き、es:bxフラット32ビットアドレス指定(cs = ds = es = 0のベースで各セグメント制限が0xffffffff)に移行することを試みる可能性が最も高いことも意味します。

プロテクトモードのユーザースペースでステータスレジスタにアクセスすると、アクセス違反の例外が発生する可能性が非常に高くなります。

また、int 22hが許可され、es:bx入力を期待するOSは何ですか?MS-DOSでは、他の割り込みベクタを復元するための静的変数として使用されるだけなので、呼び出さないでください。

于 2012-12-02T19:04:46.737 に答える