5

配列に数値を追加する Intel 8086 プロセッサのアセンブリ プログラムを次に示します。

.model small
.stack 100h

.data
    array dw 1,2,3,1,2
    sum   dw ?,", is the sum!$"

.code
main proc
    mov ax,@data
    mov ds,ax

    mov di,0

    repeat:
    mov ax,[array+di]
    add sum,ax
    add di,2           ; Increment di with 2 since array is of 2 bytes

    cmp di,9
    jbe repeat         ; jump if di<=9

    add sum,30h        ; Convert to ASCII
    mov ah,09h
    mov dx,offset sum  ; Printing sum
    int 21h

    mov ax,4c00h
    int 21h
main endp
end  main

上記のプログラムは、「ベース + インデックス」アドレッシング モードを使用して配列の数を追加します。

同じ操作は、次のようなもので実行できます。

mov ax, array[di]

ここで次の質問があります。

  1. array[di]とはどう違いますか[array+di]
  2. メモリアドレッシングモードはどれarray[di]ですか?
  3. どちらを使用するのが良いですか、またその理由は何ですか?
4

1 に答える 1

6

The Art of Assembly Languageによると、array[di][array + di]はどちらも「インデックス付きアドレス指定モード」であるため、どちらも優れているわけではなく、同じことの構文が異なるだけです。本のセクション4.6.2.3 Indexed Addressing Modesでは、重要なことは定数値とインデックス (またはベース) レジスタの存在であると説明しています。

インデックス付きアドレッシング モードでは、次の構文を使用します。

            mov     al, disp[bx]
            mov     al, disp[bp]
            mov     al, disp[si]
            mov     al, disp[di]

これらのアドレッシング モードによって生成されるオフセットは、定数と指定されたレジスタの合計です。

ここに画像の説明を入力

[si+disp] および [di+disp] アドレッシング モードを取得するには、上の図のsiまたはdiを置き換えることができます。

ここでarray説明されているように、変数はデータセグメントのオフセットであるため(定数値であるため)、変数に「定数値」を呼び出しています。

変数はメモリの場所です。プログラマにとっては、アドレス 5A73:235B よりも「var1」という名前の変数に値を保持する方がはるかに簡単です。

アセンブラが異なれば、同じアドレス指定モードに対して異なる構文を使用する場合があることに注意してください。たとえば、MASM と NASM、またはNASM と GASなどです。

関連する命令のサイズ (バイト単位) とパフォーマンス (クロック サイクル単位) を変更する他のアドレッシング モードがあり、ここで読むことができます。次は、命令MOVとアドレッシング モードです。

ここに画像の説明を入力 ここに画像の説明を入力

于 2016-11-17T17:59:12.540 に答える