mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Verständnis - Address Code zu Assembler


Autor: Frank385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Community!

Ich finde leider nichts dazu, deshalb Frage ich.

Verstehe ich das richtig?

Gegeben ist ein Address Code, rauszufinde ist, was das Programm macht.

0000 E5 ->? mov A,dadr
0000 90 ->? mov DPTR,#k16
0000 F4 ->? cpl A
0000 F5 ->? mov dadr,A
0000 A0 ->? orl c,/badr
0000 02 ->? ljmp adr16
0000 00 ->? nop
0000 00 ->? nop

Verstehe ich das richtig dass ich einfach immer nur nach der Hex-Zahl in 
meiner Befehlsliste gucken muss und dann sehe was genau das Programm 
macht?
Oder ließt man den Code anders?
Denn ich hab da was verstaubtes im Hinterkopf, dass man auch in die 
Aufteilungsliste des Datenspeichers gucken muss?!

Vielen dank für die Aufklärung!

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Frank385 schrieb:
> Gegeben ist ein Address Code
Noch nie gehört. Was ist das?

Autor: Route 66 (route_66)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank385 schrieb:
> Gegeben ist ein Address Code,

Dann zeig mal!

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Im Prinzip kann man das so machen (nennt sich Disassembler)
Man muss natrlich aufpassen, Befehle bestehen i.a. aus mehr als einem 
Byte. Und viele CPUs benutzen je nach Befehlstyp unterschidlich lange.
Also muss man an einem Byte anfangen, was tatsächlich das erste Byte 
eines Befehls ist, das ergibt sich nicht automatisch aus beliebig 
herausgegriffenen Speicherfragmenten.
Dann gibts auch noch Datenenbereiche, deren Disassemblierung als code 
macht natürlich keinerlei Sinn :-)

Autor: Frank385 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Bitte. Ja ich bin halt Lernender :)

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann stimmen deine Adressen schon mal nicht :-)

Opcode E5 suchen und wieviele Byte dazugehören usw.

Autor: Frank385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
H.Joachim S. schrieb:
> Dann stimmen deine Adressen schon mal nicht :-)
>
> Opcode E5 suchen und wieviele Byte dazugehören usw.

Also Laut meiner Befehlsliste SAB 8051 stimmts.

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Deine abgetippselten Adressen sind aber alle 0 :-)
der erste Befehl lautet:
E5 90
Weil zum E5 noch ein Byte gehört.

Autor: Arduinoquäler (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Frank385 schrieb:
> Also Laut meiner Befehlsliste SAB 8051 stimmts.

Opcode alleine genüg nicht. Opcodes haben 0...n Operanden
die zu dieser einen Befehlszeile dazugehören. Die gilt es
herauszufinden:

H.Joachim S. schrieb (schon) im Beitrag #4729625:
> und wieviele Byte dazugehören usw.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Schau ins Instructionset, da sind alle Befehle beschrieben:
http://www.atmel.com/Images/doc0509.pdf

Autor: soul eye (souleye)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Frank385 schrieb:

> Verstehe ich das richtig dass ich einfach immer nur nach der Hex-Zahl in
> meiner Befehlsliste gucken muss und dann sehe was genau das Programm
> macht?

Grundsätzlich schon. Allerdings gibt es auch Befehle mit zwei oder mehr 
Bytes. In denen stehen dann Daten. D.h. Du musst in Deiner Tabelle 
nachsehen, wieviel Bytes zu dem aktuellen Befehl gehören, dann weisst Du 
ob das nächste Byte ein Parameter oder schon der nächste Befehl ist.

E5 90    ->? mov A,#090h
F4       ->? cpl A
F5 A0    ->? mov #0A0h,A
02 00 00 ->? ljmp 00000h

Autor: Frank385 (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Ahaaa jetzt leuchtet es. die Byteanzahl unterschlagen!
Danke!

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sieht aber nicht sehr sinnvoll aus - ist es überhaupt ein 8051?

Zuerst wird in den Akkumulator aus Adresse hex 90 geladen.

Dann bitweise complementiert,z.B wäre hex 90 = 1001 0000 binär, das 
Komplement ist also 0110 1111 = hex 6F

dann diese Zahl in Speicherzelle A0 abgelegt - eine 8-Bit-Adresse ist 
etwas spezielles, die oben genannte Tabelle sagt:
"This could be an Internal Data RAM location (0-127) or a SFR [i.e., I/O
port, control register, status register, etc. (128-255)]."

und schließlich erfolgt ein Sprung an Adresse 0000

die "#" in der Disassembly scheinen mir falsch, das wäre ein 
Absolutwert, keine Adresse

: Bearbeitet durch User
Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph K. schrieb:
> Das sieht aber nicht sehr sinnvoll aus

Doch.
0x90 und 0xA0 sind Portadressen.
mit dem '#' bin ich mir jetzt auch nicht sicher, müsste ich nachschauen.

Autor: Frank385 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
soul e. schrieb:
> Frank385 schrieb:
>
>> Verstehe ich das richtig dass ich einfach immer nur nach der Hex-Zahl in
>> meiner Befehlsliste gucken muss und dann sehe was genau das Programm
>> macht?
>
> Grundsätzlich schon. Allerdings gibt es auch Befehle mit zwei oder mehr
> Bytes. In denen stehen dann Daten. D.h. Du musst in Deiner Tabelle
> nachsehen, wieviel Bytes zu dem aktuellen Befehl gehören, dann weisst Du
> ob das nächste Byte ein Parameter oder schon der nächste Befehl ist.
>
> E5 90    ->? mov A,#090h
> F4       ->? cpl A
> F5 A0    ->? mov #0A0h,A
> 02 00 00 ->? ljmp 00000h

Noch zwei Frage habe ich.: 1.Ist es so das ich mov A,#090h nehmen muss 
oder direkt die Speicherstelle 90 aus der 90h liste ? also mov A,#90?
Oder direkt mov A,P1 ? Wegen der Funktion?

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mov A, 0x90
oder (sinnvoller, weil besser zu lesen und direkt zu verstehen)
mov A, P1

Autor: Frank385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
H.Joachim S. schrieb:
> mov A, 0x90
> oder (sinnvoller, weil besser zu lesen und direkt zu verstehen)
> mov A, P1

Aber ist es nicht so das 0x90 direkt die Speicherstelle anzeigt aber P1 
auch für alle anderen Stellen der 90H Zeile gild?

Autor: klick klack (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Einlesen P1
Komplement bilden
Ausgabe auf P2
und wieder von vorne

Es macht doch was.

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank385 schrieb:
> Aber ist es nicht so das 0x90 direkt die Speicherstelle anzeigt aber P1
> auch für alle anderen Stellen der 90H Zeile gild?

? Was meinst du damit?

0x90 ist die Adresse des gesamten Ports (P1), d.h. du liest alle 8bit 
des Ports nach A.
A Enthält also nach dem Befehl eine Kopie des zum Moment der Abfrage 
anliegenden Portzustands.

Autor: Frank385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
H.Joachim S. schrieb:
> Frank385 schrieb:
>> Aber ist es nicht so das 0x90 direkt die Speicherstelle anzeigt aber P1
>> auch für alle anderen Stellen der 90H Zeile gild?
>
> ? Was meinst du damit?
>
> 0x90 ist die Adresse des gesamten Ports (P1), d.h. du liest alle 8bit
> des Ports nach A.
> A Enthält also nach dem Befehl eine Kopie des zum Moment der Abfrage
> anliegenden Portzustands.

Ich danke dir. Dachte die kleinen Kästchen hätten Byte-Größe... peinlich 
^^

Autor: Peter Dannegger (peda)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Christoph K. schrieb:
> die "#" in der Disassembly scheinen mir falsch, das wäre ein
> Absolutwert, keine Adresse

So ist es.

Autor: Frank385 (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Danke Nochmal! Absolut überragendes Forum!

Autor: soul eye (souleye)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph K. schrieb:

> Zuerst wird in den Akkumulator aus Adresse hex 90 geladen.

Port P1 wird in den Akku übertragen.

> Dann bitweise complementiert,z.B wäre hex 90 = 1001 0000 binär, das
> Komplement ist also 0110 1111 = hex 6F

Richtig.

> dann diese Zahl in Speicherzelle A0 abgelegt

Das ist Port P2

> und schließlich erfolgt ein Sprung an Adresse 0000

...womit das Programm im Kreis läuft. D.h. es wird kontinuierlich Port 
P1 gelesen und das Komplement auf Port P2 ausgegeben. Für die Praxis 
sicherlich wenig sinnvoll, als Codebeispiel aber durchaus brauchbar.


> die "#" in der Disassembly scheinen mir falsch, das wäre ein
> Absolutwert, keine Adresse

Recht Du hast, das gehört da nicht hin. Ich hatte die fünf Zeilen im 
Kopf rückübersetzt und keinen Disassembler benutzt.

Autor: Frank385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi an alle, ich habe noch eine Rückfrage bzgl. des 02 LJMP,
die nachfolgenden zwei mit Nullen gefüllten Bytes, also:

0005 02 -> LJMP adr16
0006 00
0007 00

Ich vermute dass die einfach benötig werden da LJMP 3 Byte benötigt, 
kann mir aber nicht erklären was mit adr16 (address16) konkret gemeint 
ist.

Danke schonmal!

MFG

Autor: H.Joachim Seifert (crazyhorse)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
soul e. schrieb:
> 02 00 00 ->? ljmp 00000h

Geh ins Bett, es ist schon spät :-)

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Frank385 schrieb:
> kann mir aber nicht erklären was mit adr16 (address16) konkret gemeint
> ist.

Eine 16Bit grosse Addressangabe, denn um dich im 64kByte grossen 
Addressraum frei zu bewegen muss die Addressangabe 16 Bit breit sein.

Autor: Frank385 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heinz V. schrieb:
> Frank385 schrieb:
>> kann mir aber nicht erklären was mit adr16 (address16) konkret gemeint
>> ist.
>
> Eine 16Bit grosse Addressangabe, denn um dich im 64kByte grossen
> Addressraum frei zu bewegen muss die Addressangabe 16 Bit breit sein.

Das leutet ein. Herzlichen Dank!

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.