4

ラベルのアドレスを取得しようとしています-サンプルコードは次のとおりです。

int main() {
    asm {
        mov ax,1
        mov bx,ax
    }
  _labelname:
    asm {
        mov ax, OFFSET _labelname
    }

    return 0;
}

このコードをコンパイルすると、次のエラーが返されます。 "Undefined symbol _labelname" asmブロックでラベルを定義すると、 jmp_labelnameも使用できなくなります。

私はこれを見つけて動作しません、これのために、実際には方法はありません。これは、アドレス指定ではなく、単にジャンプすることを意味します。そして、これはまったく役に立ちません。助言がありますか?

4

2 に答える 2

0

方法を見つけましたが、Cラベルを使用することはできません。これは、asmラベルである必要があります。

int main(void)
{
    asm {
        mov ax,1
        mov bx,ax
    }

    asm { _labelname: }

    asm {
        mov ax, OFFSET _labelname
        jmp cs:_labelname
    }

    return 0;
}
于 2011-12-04T15:18:51.783 に答える
0

通常、どの言語にもルートがありますが、これらのことは常に文書化されているとは限らないため、1 日か 2 日ほどいじる必要があります。

フレーバーの HLL でグローバル メモリ op 空間を宣言します。DIM LABELNAME1(0)

次に、アドレスを eax に入れる asm 構文を検索します

mov eax, ^LABELNAME(0)
mov eax, dword [_lablename]
mov eax, ^_lablename
etc etc etc

次にそれをasmにポップします

pop [^Google のどこにも見つかりませんが、特定の HLL で機能するものです

push eax
pop [^LABELNAME1(0)]

これで、HLL と asm はいつでも互いにチャットできます

したがって、それを理解する価値は十分にあります


Undefined symbol _labelname

おそらく、プログラムの最初に宣言する必要があります

._labelname
mov dword [_lablename], 0

後で asm によってラベルとして使用されます

私が言ったように、あなたの特定の HLL のフレーバーをいじり、それを熟考する必要があり、グローバルが最もうまくいくようです

また、asm 動的変数を格納し、オペコードを実行するために別のメモリ ゾーンを宣言する方法を理解する必要があります。そうしないと、asm の速度の利点が失われるキャッシュの上書きが発生します。

これらの asm 領域を分離せずに作成した小さなルーチンは、実行に 20 時間かかりました。分離で1時間かかりました


mov ax, OFFSET _labelname

これは 16 ビットのものです (DOS など、間抜けなメモリ ルールを使用)。HLL で 32 ビットのものを使用していませんか?

すべてが 1 つのセグメントで発生している場合を除き_labelnamedx:axなどを見つけるためにダブル メモリ オペランドが必要になります。前述のように、20 年遅すぎます。

jmp cs:_labelname

同じセグメントで動作しますが、より大きなプログラムの場合、cs 部分は特定のセグメントのオーバーライドとファー ジャンプ/リターンである必要があります

さらに、動的な asm 変数が asm コード セグメントに組み込まれている場合、asm の速度を最大化するための基本的なルールが破られています。

于 2013-06-22T08:38:19.053 に答える