8086 assembly, wie der Zugriff auf array-Elementen innerhalb von Schleifen
Ok, um die Dinge so einfach wie möglich sagen, ich habe eine grundlegende Schleife, die ich verwenden möchten, um zu ändern, einige Elemente in einem array mit der Bezeichnung a. In der folgenden Beispiel-code habe ich versucht, den Austausch aller Elemente von a mit 1, aber das funktioniert nicht wirklich.
assume cs:code ,ds:data
data segment
a db 1,2,3,4
i db 0
data ends
code segment
start:
mov ax,data
mov ds,ax
lea si,a
the_loop:
mov cl,i
cmp cl,4
jae the_end
mov ds:si[i],1 ; this is the part that i don't really understand since
inc i ; i'm expecting i=0 and ds:si[i] equiv to ds:si[0] which
loop the_loop ; is apparently not the case here since i actually receives the
; the value 1
the_end:
mov ax,4c00h
int 21h
code ends
end start
Ich bin mir bewusst, dass ich einfach tun dies durch eine änderung der element gespeichert in al
nach der lodsb
Unterricht, und nur speichern, dass. Aber ich würde gerne wissen, ob es möglich ist, etwas zu tun, was ich versucht habe oben.
Du musst angemeldet sein, um einen Kommentar abzugeben.
In x86 assembly, die Sie nicht verwenden können, ein Wert gespeichert, der Speicher Adresse Speicher-indirekt.
Müssen Sie Lesen
i
in einige register, die verwendet werden können für die Adressierung des Speichers, und verwenden, statt. Sie können prüfen wollen Wikipedia für 8086-Speicher Adressierungsarten.So, ersetzen
mit (segment
ds
ist hier überflüssig, da es die Standardeinstellung vonsi
,bx
undbx+si
zu):Gibt es andere Probleme mit Ihrem code zu. Die gesamte Schleife kann vereinfacht werden, und fixiert auf diese Weise:
Oder, wenn Sie wollen speichern 1 byte und verwenden
loop
Unterricht.Beachten Sie, dass im 16-bit Modus
loop
Instruktion dekrementiertcx
und springt zu label, wenncx
ist nicht null nach dem Dekrementieren. Jedoch im 32-bit-Modusloop
verringertecx
- und in 64-bit mode (x86-64) es verringertrcx
.mov bx,[i]
ist nicht zu montieren oder gut arbeiten, wenni
ist ein byte. Sie bekam es richtig mitmovzx
. Aber es kann wichtig sein zu wissen, dass dies ein 80386+ Anleitung.Ich nehme an, dass dein code gar nicht ausgeführt durch den assembler, da
ist keine gültige Adresse-Modus.
Etwas wie
statt (MASM verwendet, um die syntax überprüfen).
Den
DS:
Präfix ist unnötig für[si]
da dies die Standardeinstellung ist.Siehe auch Die 80x86-Adressierungsarten.