2016-11-17 12 views
5

は、配列内の数字を追加してインテル8086プロセッサのアセンブリプログラムである:アセンブリの[di]と[array + di]のアドレス指定の基本的な違いは何ですか?考える

.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. どちらが使いやすく、なぜですか?
+6

違いはありませんが、標準的な構文は '[配列+ディ]'です。一部のアセンブラは、他のバージョンも受け入れます。 – Jester

+0

"3"あなたのアセンブラがあなたが使えるものを指示するように、私は '' [array + di] 'に行きます。なぜなら、IIRCはインテルの構文がインテルの構文でどのように定義されているのかという公式な方法です。 x86のための究極のアセンブラのように見えます。マルチプラットフォーム、マルチターゲット、オープンソースを提供します。さらにコストもかからない。そのコンボを打つのは難しい。私はZ80アセンブラを知っていたのですが、変数の概念は私には分かりました。 – Ped7g

答えて

6

ブックThe Art of Assembly Languagearray[di]によると[array + di]は、両方の「インデックス付きaddresingモード」ですので、どれも他よりも良いではない、同じもののためだけに別の構文です。本書のセクション4.6.2.3 Indexed Addressing Modesを登録重要なことは、一定の値とインデックス(またはベース)の存在であることを説明しています

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

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

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

enter image description here

あなたは、[SI + DISP]とアドレッシングモード[ジ+ DISP]を得るために、上記の図にSI又はを置換してもよいです。

変数は、データセグメント内のオフセットである(それらは一定値である)ので、hereを説明したように我々は、変数arrayに「一定値」を呼び出している:

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

別のアセンブラは、例えば、同じアドレッシング・モードのためにMASM vs NASM、またはNASM vs GASを異なる構文を使用することができることに言及することは重要です。

関連する命令のサイズ(バイト単位)と性能(クロックサイクル単位)を変更するその他のアドレッシングモードがあります。これはhereです。次の命令MOVとアドレッシングモードである:

enter image description hereenter image description here

+0

それは優れた答えと同じくらい冗長です。 – zx485

+1

これらのサイクルカウントは8086ですか? emu8086が実際にサイクル精度のシミュレータ(私が疑うところが多い)でない限り、それは関連しているとは思えません。 –

+3

とにかく、どちらも「インデックス付きアドレッシングモード」であるだけでなく、文字通り同じアドレッシングモードです。これは、同じマシンコードに対して異なるasm構文です。ああ、私は質問のpart2を見逃しました。ええ、私は、アドレッシングモードが適切であることを説明するこのすべてのものを推測します。 –

関連する問題