2011-12-04 7 views
4

のアドレスを取得するにはどのように私は、ラベルのアドレスを取得しようとしている - ここではいくつかのサンプルコードは次のとおりです。このコードのインラインアセンブリ - ラベル

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

    return 0; 
} 

コンパイルがこのエラーを返します。 :私はASMブロックのラベルを定義する場合は、「未定義のシンボル_labelname」 、私も、私はthisを発見し、実際に、thisのために、何のように動作しません

JMPの_labelnameを使用することはできません。 Thisは、ジャンプするだけで、アドレッシングはしません。そしてthisは一切役に立たない。助言がありますか?

+0

実際の '_asm'ブロック内にラベルを設定しようとしましたか? – Cyclonecode

+4

あまりにも遅れて20年尋ねた。コンパイラを更新してください。 –

+0

@Kristerはい、asmブロックで定義しようとしました。それでも動作しません。 – Mikael

答えて

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; 
} 
+0

投票はなぜですか? OPはそれを望んでいた、OPはそれを得た。 –

+0

Turbo C 3.0ではうまく動作しない可能性があるため、おそらくdownvotedされています。私はちょうどそれを試みた。 –

+0

Turbo C++ 1.01 + TASMで動作しました。コンパイラはTASMを介してコンパイルに切り替えました。 3.0は 'tcc.exe -v -y -B lab.c'(-vと-yはデバッグ情報用ですので、結果の.EXEをTDで調べることができます)のようなものをアセンブラ経由でコンパイルする-Bオプションが必要です。簡単にEXE)。 –

0

は、任意の言語でルートが通常ありますが、あなたはおよそfaffする必要がありますこれらのことが常に文書化されているとは限らないため、1日か2日は避けてください。

HLLのフレーバーに大域メモリ領域を宣言します。 DIM LABELNAME1(0)

すると、その後は、Googleのpop [^どこにも見つけることができませんASM

でそれをポップ、それが一定で動作するものだ

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

EAXに住所を置くのasm構文を検索HLLS

push eax 
pop [^LABELNAME1(0)] 

あなたが

を好きなときに今すぐあなたのHLL及びASMがお互いにチャットすることができます

だから、Probblyプログラム

._labelname 
mov dword [_lablename], 0 

とラベル

としてASMによって後で使用の非常に開始時に宣言する必要があり


Undefined symbol _labelname 

を考え出す価値は十分です私が言うように、あなたはHLLのあなたの特定の味のためにそれを混乱させてしまいます。そして、グローバルは一番うまくいくようです。

あなたはまた、ASM動的変数を格納し、オペコードを実行するための独立したメモリゾーンを宣言する方法を理解する必要がありますか、ASM

私が書いた小さなルーチンの速度の利点を損なうであろうキャッシュ上書き取得しますこれらの区域を分けることなく、走るのに20時間かかった。分離で、それはこれが16ビットのものである、(間抜けメモリ規則にDOSなどは、)あなたはHLLと32ビットのものをやっていない


mov ax, OFFSET _labelname 

1時間かかりました?同じセグメントに20年手遅れ

jmp cs:_labelname 

作品を、それがすべて一つのセグメントに起こっていない限り

あなたが_labelnamedx:axなどを見つけるために、二重のメモリオペランドが必要になりますし、前述のように、あなたはしているが、より大きいプログラムの場合、csの部分は特定のセグメントの上書きとfar jump/returnになる必要があります

さらに、動的asm変数をasmコードセグメントに追加すると、asm速度を最大化する基本ルールが壊れています

関連する問題