いくつかの C コードと、対応するアセンブリ コードが与えられました。これを使用して、 によって宣言された 2 つの定数の値を計算します#define
。私の質問は、行が何をするかです
leal 0(,%eax,8),%edx
行う?
この部分:
0(,%eax,8)
形式は次のとおりです。
base(offset, index, size)
として計算されます (オフセットとインデックスはレジスタである必要があります):
address = base + offset + (index × size)
あなたの場合、eax
8を掛けて移動するアドレスを保持します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