2

いくつかの C コードと、対応するアセンブリ コードが与えられました。これを使用して、 によって宣言された 2 つの定数の値を計算します#define。私の質問は、行が何をするかです

leal 0(,%eax,8),%edx

行う?

4

2 に答える 2

4

この部分:

0(,%eax,8)

形式は次のとおりです。

base(offset, index, size)

として計算されます (オフセットとインデックスはレジスタである必要があります):

address = base + offset + (index × size)

あなたの場合、eax8を掛けて移動するアドレスを保持しますedx(これらの操作は、値ではなくアドレスに対して行われます)。たとえばeax = 0x11111111、インデックスである が 8 倍され、edxが保持される場合、0x88888888それが私が言えるすべてです。

それは実際の作業コードのようには見えません。通常、次のように配列で使用されます。

array_base_address( , index_of_element, sizeof_an_element)

例えば:

.data
    # array of 3 elements 2 bytes each
    array: .short 0x0000, 0x1111, 0x2222
.text
    .global _main
_main:

    # address of 0x0000
    movl    $0, %eax
    leal    array( , %eax, 2), %ebx

    # address of 0x1111
    movl    $1, %eax
    leal    array( , %eax, 2), %ebx

    # address of 0x2222
    movl    $2, %eax
    leal    array( , %eax, 2), %ebx

次のような構造でも使用できます。

struct_base_address(offset_to_sub_element, index_of_element, sizeof_an_element)

例えば:

.data
    struct:
        bytes: .byte  0, 1, 2, 3
        array: .int   0x00000000, 0x11111111, 0x22222222
.text
    .global _main
_main:

    # the offset to array
    movl    $4, %eax
    # the index of 0x22222222
    movl    $2, %ebx
    leal    struct(%eax, %ebx, 4), %edx
于 2013-10-17T22:26:18.550 に答える