Forum: Mikrocontroller und Digitale Elektronik Wohin geht mein Sprung??


von Dennis I. (tsubasa)


Lesenswert?

Ich habe folgenden Programm Code:

  org  0
  ljmp  x1bfd    ; x0000   02 1b fd

        org     1bfd
x1bfd:  mov  r0,#7fh    ; 1bfd   78 7f
  clr  a    ; 1bff   e4
  mov  @r0,a    ; 1c00   f6
  djnz  r0,x????  ; 1c01   d8 fd
  mov  sp,#0a2h  ; 1c03   75 81 a2
  ljmp  x1c44    ; 1c06   02 1c 44

Nun Frage ich mich wohin der "djnz r0,#rel. Adresse" springt.
Ich nehm den PC und addiere den angegebenen Wert "fd" und komme auf 
"1d00".
Aber der Disassember sagt mir der Sprung geht nach "1c00"....

Ich möchte dem Disassembler gerne glauben, aber ich verstehe den Grund 
noch nicht. Entweder fehlt mir nen Denkanstoß oder meine Grippe legt 
mein Hirn momentan noch zu lahm um selber drauf zu kommen.

Wenn er auf "1c00" springt dann würde er ja alle Werte ab 7f abwörts mit 
00 überschreiben. So wie ich das verstehe. Aber dann wären ja auch der 
Startsprung überschrieben und würde beim nächsten Hochfahren nicht mehr 
funktionieren?!

Danke für die schnelle Hilfe...habt mir bisher schon sehr geholfen 
hier..

von Dieter Werner (Gast)


Lesenswert?

Der Disassembler hat recht, der Sprung geht nach 1c00.
Bei deiner Addition wird fd als positiver Wert 253 verwendet, der 
Disassembler versteht diesen Wert aber korrekt als -3 (2-er Komplement).

Das Löschen des Speicherbereichs betrifft nur das RAM, das gespeicherte 
Programm (im ROM oder Flash) wird davon nicht beeinflusst und 
funktioniert weiter einwandfrei.

von Karl heinz B. (kbucheg)


Lesenswert?

djnz benutzt 2-er Komplement.
fd ist eine negative Zahl!

    fd  =  1111 1101

           0000 0010   alle bits umdrehen
           0000 0011   und 1 addieren

                   3, also entspricht fd dezimal -3

nimm den pc (der schon auf 1c03 steht) und ziehe 3
davon ab, und du landest bei ....

von Dennis I. (tsubasa)


Lesenswert?

Klar...jetzt fällts mir wie Schuppen von den Augen....das 2er 
Komplement...
Ich hab die 1 am Ende nicht addiert und bin deswegen nie auf den Wert 
gekommen...

Ich sollte nicht mit fetter Grippe versuchen Assembler Programme zu 
verstehen...

Danke

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.