4

私はオペレーティング システムの設計クラスを受講しており、C で書かれたマイクロカーネルを提供され、その上に構築しています。カーネルは 32 ビット マシンを念頭に置いて設計されているようで、私は Snow Leopard を実行しています。それでクラスの友達と私はそれを 64 ビットのアドレッシングにハックしようとしてきました。

最大の問題は、インライン アセンブリを使用して現在のスタック ポインターをディスパッチャーが使用する一時変数にコピーする 1 行のコードにあるようです。

#define SET_STACK(s) asm("movl temp,%esp");

%espは 32 ビット レジスタであるため、当然、コンパイラはエラーを吐き出します。

/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cckS2oq7.s:523:32-bit absolute addressing is not supported for x86-64
/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cckS2oq7.s:523:cannot do signed 4 byte relocation

%rspだから私はそれを64ビットスタックポインターレジスターに置き換えました(そして、私はちょうど%spうまくいくと思います.GASは適切なプレフィックスを置くのに十分スマートであることをここのどこかで読みました)。に置き換え%espた後%rsp、次のエラーが発生します。

/var/folders/0A/0AVWZC-5HhOg6twWZBlDgU+++TI/-Tmp-//cc8TLdjH.s:523:Incorrect register `%sp' used with `l' suffix

今、私はアセンブラの経験があまりないので、少し途方に暮れています。、およびに置き換えてみましmovlたが、何も機能しないようです。おそらくサイズが間違っているのではないかと思いますか?movmovqtemp

Temp はグローバル変数で、次のように宣言されています。

void* temp;   // temp pointer used in dispatcher

さまざまなデータ型のサイズを出力する簡単なプログラムを作成しましたが、x86-64 の void* のサイズは 8 バイトのように見えますが、これは正しいサイズであるはずですよね?

とにかく、明らかに、誰かがこの問題を解決してくれるとは思っていませんが、正しい方向に向けるヒントがあれば大歓迎です!

4

2 に答える 2

2

あなたが示した行は値をコピーし%espませtempSET_STACK. AT&T 構文はsrc, dest.

シンプルasm("mov temp, %rsp");にコンパイルする必要があります。

于 2010-06-24T04:10:39.053 に答える
1

64 ビットの移動には movq を使用する必要があります。

これは、私のプロジェクトの 1 つ (列車シミュレーターの一部) からの SSE 作業を行っているアセンブリのスニペットです。

asm(
        //mykda calculation
        //mov eax, dword ptr [train_traction_ptr]
        //movaps xmm0, xmmword ptr [eax] //train_traction[i] + forceFront
        "movq %0, %%rax\n\t"
        "movaps (%%rax), %%xmm0\n\t"

        //mov eax, dword ptr [local_fgrr_ptr]
        //movaps xmm1, xmmword ptr [rax]
        //addps xmm0, xmm1
        "movq %1, %%rax\n\t"
        "movaps (%%rax), %%xmm1\n\t"
        "addps %%xmm1, %%xmm0\n\t"

        ... );

コメントの後、さらに調べたところ、すべての 64 ビット OSX コードは位置に依存しない必要があることがわかりました。

テストするMacを持っていませんが、

asm ("movq temp(%rip),%rsp");

動作するはずです。そうでない場合は、アセンブラの temp に適切な PIC アドレッシングを使用する必要があります。

于 2010-06-24T05:09:34.297 に答える