mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler variablen, var+x


Autor: Peter93 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Peter93 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Peter93 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also ist es so richtig: var dw 0,0FFFh,0FFh

var 0 = 0
var+2=0FFFh
var+4=0FFh

?

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter93 schrieb:
> var dw 0,0FFFh,0FFh

00 00 0f ff 00 ff
0. 1. 2. 3. 4. 5.  Byte

0000 0fff 00ff
0.   1.   2.       Word

Autor: c-hater (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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...

Autor: A. K. (prx)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Heinz V. schrieb:
>> var dw 0,0FFFh,0FFh
>
> 00 00 0f ff 00 ff
> 0. 1. 2. 3. 4. 5.  Byte

Nö. So nicht.

00 00 ff 0f ff 00

: Bearbeitet durch User
Autor: Peter93 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja stimmt little Endian <> big Endian

Autor: Peter93 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heinz V. schrieb:
> ja stimmt little Endian <> big Endian

somit also auch in dem anderen Beispiel: FF00h

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
Autor: Peter93 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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...

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter93 schrieb:
> add ax, 6[cx]
>
> Wofür steht diese 6 und was macht sie genau?

steht da wirklich 6 oder steht da b?

Autor: Peter93 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da steht wirklich eine 6, kenne das normal nur mit feld[si+bx] , deshalb 
wundere ich mich gerade

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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!

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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]?

Autor: A. K. (prx)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

: Bearbeitet durch User
Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. ;-)

: Bearbeitet durch User

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.