質問

私は十分にグーグルで検索しましたが、ブラケットが何であるかを理解できませんでした () 意味。また、いくつかの構文が表示されます movl 8(%ebp), %eax

誰かが私に良い参照を提案することができますか? Googleの上位20の結果を見つけることができませんでした。

役に立ちましたか?

解決

%eax 登録eaxです。 (%eax) アドレスがレジスタEAXに含まれているメモリの場所です。 8(%eax) アドレスがEAXプラス8の値であるメモリの場所です。

他のヒント

http://web.archive.org/web/20080215230650/http://sig9.com/articles/att-syntax UNIX(AT&T)ASM構文をすばやく紹介します。 byでグーグル at&t asm syntax.

投稿はVivekによる「AT&Tアセンブリ構文」です。http://web.archive.org/web/20080228052132/http://sig9.com/blog/vivek)、2003-09-01。 AT&Tについての主な情報があります:

たとえば、Intel-Syntaxの基本的なデータ移動命令の一般的な形式は、

mnemonic    destination, source

一方、AT&Tの場合、一般的な形式は

mnemonic    source, destination

(私はこの注文を覚えていますAT&T ASMを本物のUNIX ASMとして呼ぶので、それはそうです 1つと、データを右に流します。 Intelの構文はいくつかの誤ったMASMSドキュメントに基づいていましたが、これは明らかにUNIXの世界には適切ではありませんが、 とデータが左に流れます)

IA-32アーキテクチャのすべての登録名は、例えば「%」サインが付いている必要があります。 %al、%bx、%ds、%cr0など。

すべてのリテラル値は、「$」の記号で前に付けなければなりません。例えば、

mov $100,   %bx
mov $A, %al

最初の命令は、値100をレジスタAxに移動し、2番目の命令はASCII Aの数値値をALレジスタに移動します。

AT&T構文では、メモリは次の方法で参照されます。

segment-override:signed-offset(base,index,scale)

必要なアドレスに応じてその一部を省略できます。>%ES:100(%EAX、%EBX、2)

オフセットとスケールには「$」で付けられないでください。同等のnasm-syntaxを使用したいくつかの例は、物事をより明確にする必要があります。

GAS memory operand      NASM memory operand
------------------      -------------------

100                     [100]
%es:100                 [es:100]
(%eax)                  [eax]
(%eax,%ebx)             [eax+ebx]
(%ecx,%ebx,2)           [ecx+ebx*2]
(,%ebx,2)               [ebx*2]
-10(%eax)               [eax-10]
%ds:-10(%ebp)           [ds:ebp-10]
Example instructions,
mov %ax,    100
mov %eax,   -100(%eax)

オペランドサイズ。時には、特にリテラル値をメモリに移動する場合、移動のサイズまたはオペランドサイズを指定することが必要になります。たとえば、指示、

mov    $10,    100

値10がメモリオフセット100に移動することをスペックフィーのみが、転送サイズではありません。 NASMでは、これはキャストキーワードバイト/ワード/Dワードなどをオペランドのいずれかに追加することで行われます。 AT&T構文では、これは命令に接尾辞-B/W/L-を追加することによって行われます。例えば、

movb    $10,    %es:(%eax)

バイト値10をメモリの位置[EA:EAX]に移動しますが、

movl    $10,    %es:(%eax)

長い値(DWORD)10を同じ場所に移動します。

JMP、Call、Retなどは、プログラムのある部分から別の部分にコントロールを転送します。それらは、同じコードセグメント(近く)または異なるコードセグメント(FAR)への制御転送として分類できます。ブランチアドレス指定の可能なタイプは、相対オフセット(ラベル)、レジスタ、メモリオペランド、およびセグメントオフセットポインターです。

相対オフセットは、以下に示すように、ラベルを使用して指定されています。

label1:
    .
    .
  jmp   label1

レジスタまたはメモリオペランドを使用したブランチアドレス指定には、 '*'が付いている必要があります。 「ljmp」、 'lcall'などのように、「遠い」コントロールトランファーを指定するには、「l」をプレフィックスする必要があります。たとえば

GAS syntax        NASM syntax
==========        ===========

jmp   *100        jmp  near [100]
call  *100        call near [100]
jmp   *%eax       jmp  near eax
jmp   *%ecx       call near ecx
jmp   *(%eax)     jmp  near [eax]
call  *(%ebx)     call near [ebx]
ljmp  *100        jmp  far  [100]
lcall *100        call far  [100]
ljmp  *(%eax)     jmp  far  [eax]
lcall *(%ebx)     call far  [ebx]
ret               retn
lret              retf
lret $0x100       retf 0x100

セグメントオフセットポインターは、次の形式を使用して指定されています。

jmp    $segment, $offset

彼はまた、GNUを(ガス)ドキュメントとして推奨しています: http://web.archive.org/web/20080313132324/http://sourceware.org/binutils/docs-2.16/as/index.html

彼らはそうです 動く 指示、データをある場所から別の場所に移動する - これらの場合、メモリからレジスタへ:

register_eax = *(unsigned long *)register_eax;

あなたの他の例は次のようなものです:

register_eax = *(unsigned long *)(register_ebp + 8);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top