2016-11-17 3 views
5

Gegeben ist das Montageprogramm der Intel 8086-Prozessor, der die Zahlen in der Matrix fügt:Was ist der grundlegende Unterschied zwischen der Adressierung von Array [di] und [Array + di] in Assembly?

.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 

obige Programm die Anzahl der Array addiert „Basis + Index“ Adressierungsmodus verwenden.

Die gleiche Operation kann durch so etwas wie ausgeführt von:

mov ax, array[di] 

Hier habe ich folgende Fragen:

  1. Was zwischen array[di] und [array+di]
  2. Welche Speicheradressierung Modus array[di] der Unterschied ist ?
  3. Welcher ist besser zu verwenden und warum?
+6

Es gibt keinen Unterschied, aber die Standard-Syntax ist '[array + di]'. Einige Assembler akzeptieren auch die andere Version. – Jester

+0

"3." ist stark meinungsbasiert, da Ihr Assembler diktiert, was Sie verwenden können ... Ich würde mit '[array + di]' gehen, weil A) IIRC das ist die offizielle Art, wie Intel-Syntax von Intel definiert wurde B) es ist kompatibel mit NASM - was scheint einer der ultimativen Assembler für x86 zu sein, dh. gepflegt, Multi Plattform, Multi Target und Open Source. Und sogar kostenlos. Diese Combo ist schwer zu schlagen. C) macht mehr Sinn für mich, ich bin es gewohnt, eher in Zeigern als in "Variablen" zu denken, das Konzept der Variablen wurde mir gezeigt, nachdem ich bereits Z80 Assembler kannte. – Ped7g

Antwort

6

Nach dem Buch The Art of Assembly Language, array[di] und [array + di] beide „indizierte addresing Modi“ sind, so ist keiner besser als die anderen, ist nur eine andere Syntax für die gleiche Sache. Der Abschnitt 4.6.2.3 Indexed Addressing Modes des Buches erläutert, dass das Wichtigste ist das Vorhandensein eines konstanten Wert und einem Index (oder Base) registrieren:

Die indizierten Adressierungsmoden verwenden, die folgende Syntax:

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

Die von diesen Adressierungsmodi erzeugten Offsets sind die Summe der Konstanten und des angegebenen Registers.

enter image description here

Sie si substituieren können oder di oben in der Figur, die die [Si + disp] und [di + disp] Adressierungsmodi zu erhalten.

wir „konstanten Wert“ auf die Variable array Aufruf weil Variablen Offsets im Datensegment sind (so dass sie konstante Werte), wie here erläutert:

Variable ist eine Speicherstelle. Für einen Programmierer ist es viel einfacher, einen Wert in einer Variablen namens "var1" als an der Adresse 5A73: 235B gehalten werden.

Es ist wichtig zu erwähnen, dass verschiedene Montierer andere Syntax für die gleichen Adressierungsarten verwenden können, beispielsweise MASM vs NASM oder NASM vs GAS.

Es gibt andere Adressierungsmodi, die die Größe (in Byte) und die Leistung (in Taktzyklen) der beteiligten Anweisungen ändern, wie in here zu lesen ist.Weiter ist Instruktion MOV und die Adressierungsmodi:

enter image description here enter image description here

+0

Das ist eine ebenso ausführliche wie ausgezeichnete Antwort. – zx485

+1

Sind diese Zykluszahlen für 8086? Ich bezweifle, dass das relevant ist, es sei denn, emu8086 ist tatsächlich ein zyklusgenauer Simulator (was ich sehr bezweifle). –

+3

Es ist nicht nur, dass sie beide "indizierte Adressierungsmodi" sind, sie sind buchstäblich der gleiche Adressierungsmodus. Es ist nur eine andere ASM-Syntax für denselben Maschinencode. Oh, ich habe Teil 2 der Frage verpasst, ja, ich schätze, all das Zeug, das erklärt, dass der Adressierungsmodus relevant ist. –

Verwandte Themen