2

この行は私にはあまり明確ではありません(私はアセンブリに非常に慣れていません):

movsbl 0xffffffff(%edx,%ebx,1),%eax

私は理解してmovmovsblますが、私にとっては新しいものです。foo私の代わりにを使用するより簡単な例では、これである0xffffffff(%edx,%ebx,1)と理解しています(これが正しいかどうかはまったくわかりませんが、関連するトピックを検索しただけです)。

eax = foo&0x800000ff;

アセンブリの行で-1()を参照したことはありませんが、正確にどこから0xffffffff情報が入力されていますか?%eaxに保存されているものは何ですか:

[%edx + %ebx -1]
4

2 に答える 2

6
movsbl <%x, %y, 1>, %z

つまり、最初のオペランド (x) によってアドレス指定されたメモリ位置から 1 バイトを読み取り、そのバイトを 32 ビットに拡張し、結果をレジスタ (z) に格納します。

<%x, %y, 1> は、x と y の値を加算して形成されるメモリ アドレスです。1 は y に適用される乗数です。

于 2013-02-19T05:23:40.007 に答える
1

C で書くと、次のような行になります。

#include <stdlib.h>

int loadByte(char *base, size_t index)
{
    return (int)base[index - 1];
}

これをコンパイルすると (UN*X、64 ビット x86 の場合)、次のオブジェクト コードが生成されます。

セクション .text の分解:

0000000000000000 :
   0: 0f be 44 37 ff movsbl 0xffffffffffffffff(%rdi,%rsi,1),%eax
   5: c3 retq

前に述べたように、movsb1 バイトを移動 (ロード) し、それを ... に符号拡張することを意味します (つまり、がありmovsbw、 word / 、 long /movsblおよびquad /movsbqへの変換用です)。shortintlong long

アセンブリは 32​​ ビット用ですが (アドレス指定に使用されるレジスタが 32 ビットであるため)、それ以外の意味は同じです。

于 2013-02-19T09:49:30.573 に答える