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


von Frank385 (Gast)


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!

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von Route_66 H. (route_66)


Lesenswert?

Frank385 schrieb:
> Gegeben ist ein Address Code,

Dann zeig mal!

von H.Joachim S. (crazyhorse)


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 :-)

von Frank385 (Gast)


Angehängte Dateien:

Lesenswert?

Bitte. Ja ich bin halt Lernender :)

von H.Joachim S. (crazyhorse)


Lesenswert?

Dann stimmen deine Adressen schon mal nicht :-)

Opcode E5 suchen und wieviele Byte dazugehören usw.

von Frank385 (Gast)


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.

von H.Joachim S. (crazyhorse)


Lesenswert?

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

von Arduinoquäler (Gast)


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.

von Peter D. (peda)


Lesenswert?

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

von Soul E. (Gast)


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

von Frank385 (Gast)


Lesenswert?

Ahaaa jetzt leuchtet es. die Byteanzahl unterschlagen!
Danke!

von Christoph db1uq K. (christoph_kessler)


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
von H.Joachim S. (crazyhorse)


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.

von Frank385 (Gast)


Angehängte Dateien:

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?

von H.Joachim S. (crazyhorse)


Lesenswert?

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

von Frank385 (Gast)


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?

von klick klack (Gast)


Lesenswert?

Einlesen P1
Komplement bilden
Ausgabe auf P2
und wieder von vorne

Es macht doch was.

von H.Joachim S. (crazyhorse)


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.

von Frank385 (Gast)


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 
^^

von Peter D. (peda)


Lesenswert?

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

So ist es.

von Frank385 (Gast)


Lesenswert?

Danke Nochmal! Absolut überragendes Forum!

von Soul E. (Gast)


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.

von Frank385 (Gast)


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

von H.Joachim S. (crazyhorse)


Lesenswert?

soul e. schrieb:
> 02 00 00 ->? ljmp 00000h

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

von Heinz V. (heinz_v)


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.

von Frank385 (Gast)


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!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.