2

ARM を使用すると、次のようなメモリ ロケーションにアクセスできます。

LDR r0, [r1, #4]!

つまり、r1 が指す値を 4 バイトのオフセットでロードし、! これは、この命令の後に r1 の値を新しい値 (つまり +4) で更新することを意味します。

x86 (可能であれば AT&T 構文) に同等のものはありますか? 例えば:

movl 4(%ebx), %eax

これにより、%ebx が指す値が 4 バイトのオフセットで %eax にロードされます。ロード後に %ebx の値を更新するにはどうすればよいですか?

ありがとう。

4

1 に答える 1

4

あなたが探している命令は、LODSD「文字列から DWORD をロードする」という意味だと思います。ただし、レジスタを選択することはできません。ポインタは にESIあり、宛先レジスタはEAXです。

バイト、ワード、またはダブルワードがメモリ位置から AL、AX、または EAX レジスタに転送された後、EFLAGS レジスタの DF フラグの設定に従って、(E)SI レジスタが自動的にインクリメントまたはデクリメントされます。(DF フラグが 0 の場合、(E)SI レジスタはインクリメントされます。DF フラグが 1 の場合、ESI レジスタはデクリメントされます。) (E)SI レジスタは、バイト操作で 1 ずつインクリメントまたはデクリメントされます。ワード演算の場合は 2、ダブルワード演算の場合は 4 です。

申し訳ありませんが、今、頭の中に Intex 構文が根付いています。フラットな 32 ビット保護モードを想定すると、次のようになります。

mov   esi, _source_data_       ; ESI points to source data
cld                            ; Clear the direction flag
                               ; (ESI will increment)
lodsd                          ; Essentially   mov eax, [ds:esi]
                               ;               add esi, 4
于 2013-07-02T23:34:54.257 に答える