Guten Abend,
ich habe eine kurze Frage:
wenn ich eine Varbiale habe:
var dw 0,0FFFh,0FFh
mov ax,var dann steht im ax ja 0h
mov ax,var+2 dann steht im ax 0FFh
was passiert aber, wenn ich schreibe:
mov ax,var+4 ? var+4 ist ja nicht mehr definiert
Danke für eure Antworten
Peter93 schrieb:> wenn ich eine Varbiale habe:> var dw 0,0FFFh,0FFh>> mov ax,var dann steht im ax ja 0h> mov ax,var+2 dann steht im ax 0FFh>> was passiert aber, wenn ich schreibe:>> mov ax,var+4 ? var+4 ist ja nicht mehr definiert
Du lädst praktisch einen Zufallswert in AX
wenn 'var' sich am Ende deines Programms befindet gibt es möglicherweise
unter Windows eine memory_page_read_exception denn dein Programm
versucht (lesend) auf eine Speicherseite zuzugreifen für die es nicht
zugelassen ist.
Peter93 schrieb:> mov ax,var dann steht im ax ja 0h
Ja.
> mov ax,var+2 dann steht im ax 0FFh
Nö.
> was passiert aber, wenn ich schreibe:>> mov ax,var+4 ? var+4 ist ja nicht mehr definiert
Doch, ist es.
c-hater schrieb:>> mov ax,var+2 dann steht im ax 0FFh>> Nö.>>> was passiert aber, wenn ich schreibe:>>>> mov ax,var+4 ? var+4 ist ja nicht mehr definiert>> Doch, ist es.
wie ist es denn richtig?
klar mit var+2 landest Du beim nächsten Word nicht beim Übernächsten.
LODSW, STOSW, SCASW inkrementieren (E)SI und (E)DX um 2, aber die 2 in
den Pseudoopcodes wird vom Assembler als 2 = +zwei Bites 'weiter'
interpretiert.
Peter93 schrieb:> wie ist es denn richtig?
Lies' einfach die verfickte "instruction set reference" von Intel. Die
erklärt ausführlich und in jedem Detail, was jede einzelne Instruktion
tut...
Verwirrung kann höchstens noch durch abweichende Notationen anderer
Assembler (im Vergleich zu Intels eigenem) auftreten.
Je näher an C die Dinger sind, desto abstruser wird deren Notation, bis
sie dann mit C selber (als de-facto-Macroassembler) endgültig die
ultimative Verwirrung gestiftet wird...
Peter93 schrieb:>>> mov ax,var+2 dann steht im ax 0FFh
Die Addresse var+2 wird bei z.B. MASM oder A86/A386 während des
Assemblierens berechnet, sie wird nicht von der CPU zur Programmlaufzeit
berechnet.
Heinz V. schrieb:> Die Addresse var+2 wird bei z.B. MASM oder A86/A386 während des> Assemblierens berechnet, sie wird nicht von der CPU zur Programmlaufzeit> berechnet.
Genauso ist es.
Im Prinzip ist es immer die gleiche Instruktion, nämlich "lade
16Bit-Register mit dem Inhalt zweier aufeinander folgender Bytes im
Speicher, beginnend mit Adresse XYZ". Und XYZ wird halt schon zur
Assemblierzeit vom Assembler berechnet, weil der schon alles darüber
weiss: Basisadresse (also "var") und Offset, also das, was nach dem
"var+" steht.
Die Addressierungsart (man nennt sie "direkt") und die Unterstützung zu
deren Verwendung mit Entwurfszeit-Offsets findet man praktisch in fast
jedem Assembler fast jeder Architektur. Nur ganz früher(tm), als
Assembler mangels genug Speicher zur Assemblierzeit noch nicht selber
mathematische Ausdrücke interpretieren und berechnen konnten, da musste
man selbst Hand anlegen und tatsächlich jede Speicheradresse selbst
ausrechnen. Ging aber irgendwie auch damit, funktionierende Programme zu
schreiben...
okay ich denke ich habe es Verstanden! Kannst du mir zur Kontrolle
sagen, ob dies richtig ist:
var dw 0, 0FFFh, 0FFh, 255, 377o
0 1 2 3 4 Word
00 00 , 0F FF , 00 FF , 00 FF , 00 FF
0 1 2 3 4 5 6 7 8 9 Byte
also wäre bei mov ax, var+7 00FF im ax register?
c-hater schrieb:> Die Addressierungsart (man nennt sie "direkt") und die Unterstützung zu> deren Verwendung mit Entwurfszeit-Offsets findet man praktisch in fast> jedem Assembler fast jeder Architektur.
Nö. Bei RISC Architekturen mit fester Befehlslänge findet man eine
direkte Adressierung üblicherweise nicht.
Nicht einmal alle Architekturen mit variabler Befehlslänge unterstützen
eine direkte Datenadressierung - IBMs Mainframes nicht, aber
beispielsweise auch nicht die 8-Bitter 1802 und SC/MP.
A. K. schrieb:> Nö. Bei RISC Architekturen mit fester Befehlslänge findet man eine> direkte Adressierung üblicherweise nicht.
Oops...
AVR8 ist RISC, jedenfalls nach Aussage von Atmel. Gibt es dort direkte
Adressierung? Natürlich. "lds" und "sts".
Allerdings ist es nicht "reines" RISC nach deiner Definition (die ganz
offensichtlich irgendwie von der aller anderen doch etwas abweicht).
Nicht jedes Befehlswort hat beim AVR8 die gleiche Länge.
Aber wir brauche uns da auch überhaupt nicht drüber zu streiten. Ich
habe natürlich in weiser Voraussicht überall ein "fast" in meine
Aussagen eingebaut. Ich bin ja nicht blöd.
Aber natürlich: wenn man sich die Relevanz von Systemen ohne direkte
Adressierung anschaut (die jemals erreichte oder gar erst die heutige),
dann ist meine Aussage doch mehr als berechtigt. Findest du nicht auch?
c-hater schrieb:> Aber natürlich: wenn man sich die Relevanz von Systemen ohne direkte> Adressierung anschaut (die jemals erreichte oder gar erst die heutige),> dann ist meine Aussage doch mehr als berechtigt. Findest du nicht auch?
Nachsatz:
Natürlich seien hier die System einbezogen, die tatsächlich keine echte
direkte Addressierung kennen, sondern ausschließlich direkte
Adressierung mit Offset. Mit Offset 0 ist das ja dann auch nur direkte
Adressierung.
Aber klar: hier tut sich dann wieder das Minenfeld der
Pseudoinstruktionen auf...
Peter93 schrieb:> Ich habe noch eine kurze Frage, für die ich nicht extra einen Thread> aufmachen möchte!> add ax, 6[cx]>> Wofür steht diese 6 und was macht sie genau?
Ach wieder bloß ein Adressoffset. Hier allerdings der Offset einer
indirekten Adressierung.
Also: Adresse ist der Inhalt von cx, dann wird nochmal 6 draufgezählt,
um die tatsächlich anzusprechende Speicheradresse zu ermitteln.
Lies' endlich diese verfickte instruction set reference!
c-hater schrieb:> Also: Adresse ist der Inhalt von cx, dann wird nochmal 6 draufgezählt,> um die tatsächlich anzusprechende Speicheradresse zu ermitteln.
wäre das denn identisch mit add ax, [cx+6]?
c-hater schrieb:> Allerdings ist es nicht "reines" RISC nach deiner Definition (die ganz> offensichtlich irgendwie von der aller anderen doch etwas abweicht).ARM hat in allen 3 Varianten (klassisch, Thumb, 64bit) keine direkte
Adressierung. PowerPC nicht, MIPS nicht, Alpha nicht, 88000 nicht, 29000
nicht, ...
Mir fällt als RISC mit direkter Adressierung nur AVR ein.
> Aber natürlich: wenn man sich die Relevanz von Systemen ohne direkte> Adressierung anschaut (die jemals erreichte oder gar erst die heutige),> dann ist meine Aussage doch mehr als berechtigt. Findest du nicht auch?
Nö, finde ich nicht. Auch weil in der Programmierung jenseits kleiner
Mikrocontroller die Häufigkeit direkter Adressierung von Daten weitaus
geringer ist als Adressierung relativ zu einem Register. Statisch
adressierte Skalare sind weit seltener als relativ adressierte Daten
aller Art.
Ok, wer Programmiersprachen jenseits Assembler hasst, der hasst
natürlich auch solche Programmiertechnik und legt grossen Wert auf
direkte Adressierung. ;-)
PS: Bei 64-Bit x86 wurde die direkte Adressierung durch PC-relative
Adressierung effektiv abgelöst, auch wenn es die direkte Adressierung
noch gibt.
PPS: Auch 8051 kann nur sehr wenig Daten direkt adressieren.
c-hater schrieb:> Lies' endlich diese verfickte instruction set reference!
Das sind bei x86 Stand 2015 rund 2000 Seiten. Plus weiterer 1600 Seiten,
wenn man nicht nur Anwendungen programmiert. ;-)