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!
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 :-)
Dann stimmen deine Adressen schon mal nicht :-) Opcode E5 suchen und wieviele Byte dazugehören usw.
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.
Deine abgetippselten Adressen sind aber alle 0 :-) der erste Befehl lautet: E5 90 Weil zum E5 noch ein Byte gehört.
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.
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
Ahaaa jetzt leuchtet es. die Byteanzahl unterschlagen! Danke!
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
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.
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?
mov A, 0x90 oder (sinnvoller, weil besser zu lesen und direkt zu verstehen) mov A, P1
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?
Einlesen P1 Komplement bilden Ausgabe auf P2 und wieder von vorne Es macht doch was.
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.
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 ^^
Christoph K. schrieb: > die "#" in der Disassembly scheinen mir falsch, das wäre ein > Absolutwert, keine Adresse So ist es.
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.
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.

