誰かが次の2つの違いを説明できますか? アドレッシング モードの背後にある概念を理解するのは少し難しいと思います
mov ax, [bx + di + 10]
mov ax, [bx + di] + 10
本当にありがとう!
誰かが次の2つの違いを説明できますか? アドレッシング モードの背後にある概念を理解するのは少し難しいと思います
mov ax, [bx + di + 10]
mov ax, [bx + di] + 10
本当にありがとう!
違いはありません!
デバッガーで確認できます...
mov ax, [bx + di + 10]
mov ax, [bx + di] + 10
コンパイラはボート命令を次のようにコンパイルします: 8B443B0A
したがって、ax はアドレスから 16 ビット値をロードする必要があります: bx + di + 10
この MASM32 というラベルを付けましたが、どちらの命令も x86 に対して正当ではありません。16 ビット プログラミングを行っている場合を除き、その場合はそのことを明確にする必要があります。
mov ax, [bx+di+10]
16 ビット アドレッシングを使用するため、x86 では使用できません。ただし、以下は許可されます。
mov ax, [ebx+edi+10]
つまり、ebx の値を取得し、それを edi の値に加算し、その値に 10 を加算します。次に、最終値をポインターとして扱います。そのword
アドレスが指す (2 バイト) を取得し、その値を ax に割り当てます。
mov ax, [bx+di]+10
同様に正当ではありません (16 ビット アドレス指定)。あなたがするなら:
mov ax, [ebx+edi]+10
mov
の後に追加の入力が許可されていないため、これも許可されていません[ebx+edi]
bx = 10、di=10と仮定します。
ケース1の場合
mov ax, [30]
メモリ位置30の値がAXレジスタにコピーされます
ケース2の場合
mov ax, [20]+10
メモリ位置20の値、たとえばXに10hを追加するとX+10h
、AXレジスタにコピーされます。