Guten Abend zusammen, Ich stehe momentan vor dieser Frage: An welcher Stelle kommen die ersten eigenen Befehle? Ich habe mir ein paar disassemblierte Programme angeguckt und komme zu diesem Schluss: bis 25 kommen die Sprungadresse für Interrupts. Danach kommt der std. handler wenn keine definiert wurden und ab 38 dann die eigenen Funktionen. Ich frage mich das da ich im Code an stellen springen will für welche ich im Code selber nicht weiß welches Sprunglabel ich braucht, z.b. so was: (irgendwas in eax, am einfachsten z.b.: Movl $0x40, %eax) jmp *%eax Wenn das nicht geht muss ich mir was anderes überlegen... Vielen Dank! Edit: Handelt sich um AVRs.
Das klingt nach einem Hammer-Nagel Problem. Erzähl vlt. erstmal was du dir erhoffst aus dem wilden Rumgespringe
Check mal im Datenblatt "Deines" AVR die Abschnitte zu Bootloader und Fusebits und reset vector . MfG,
Du solltest in Ruhe das Datenblatt von dem AVR lesen den Du benutzen möchtest. Ausserdem wäre es für Dich ratsam, dass Du dich erst einmal grundsätzlich mit der Assemblerprogrammierung vertraut machst. Disassemblierter Code bringt Dich nicht weiter. Bei Atmel gibt es jede Menge Doku zu dem Thema. Entsprechende Bücher findet man auch. Hier wird mit Dir wohl niemand einen Kurs in Assembler machen.
Lt. http://www.atmel.com/images/atmel-2513-8-bit-avr-microntroller-atmega162_datasheet.pdf ist beim atmege 162 der erste flash nach der RESET/IRQ-Tabelle 0x38 (s.59). MfG,
Fer T. schrieb: > Ich stehe momentan vor dieser Frage: An welcher Stelle kommen die ersten > eigenen Befehle? Das steht Dir völlig frei. Allerdings sollte man die Vektortabelle reservieren, falls man Interrupts benutzen will. Fer T. schrieb: > bis 25 kommen die Sprungadresse für Interrupts. Es mag MCs geben, wo das stimmt, aber es gilt nicht für alle. Fer T. schrieb: > Danach kommt der std. handler Der darf auch überall stehen oder ganz entfallen. In Assembler habe ich ihn entfallen lassen, da unnötig. Benutzte Interrupts haben ihren Handler, unbenutzte werden einfach nicht enabled. Und in C interessiert das alles eh keinen, darum kümmert sich der Compiler automatisch und man sollte ihm tunlichst nicht ins Handwerk pfuschen, das gibt Ärger.
Fer T. schrieb: > Ich frage mich das da ich im Code an stellen springen will für welche > ich im Code selber nicht weiß welches Sprunglabel ich braucht, z.b. so > was: > > (irgendwas in eax, am einfachsten z.b.: Movl $0x40, %eax) > jmp *%eax > > Wenn das nicht geht muss ich mir was anderes überlegen... Summa Summarum: Überleg dir was anderes. Das was da an deiner Beschreibung des Vorhabens so durchsickert, klingt alles mehr als abenteuerlich. Das stinkt förmlich nach Pfusch.
Hi Was du willst, ist vermutlich der IJMP, der über das Z-Register adressiert wird. Dazu brauchst du eine Basisadresse, die du in das Registerpaar ZL und ZH legst, einen Offset zuaddierst und dann den IJMP ausführst. z.B.
1 | LDI ZL, Low(p(Sprungtabelle)) ; Basisadresse Sprungtabelle |
2 | LDI ZH, Low(p(Sprungtabelle)) |
3 | LDS r16, Prg_Nr ; Variable mit Programmnummer |
4 | LSL r16 ; mit 2 multiplizieren |
5 | ADD ZL, r16 ; Ergebnis zur Adresse Addieren |
6 | CLR r16 ; |
7 | ADC ZH, r16 ; Carryflag addieren |
8 | IJMP ; Sprung zur berechneten Adresse |
9 | |
10 | |
11 | Sprungtabelle: |
12 | RJMP Prg1 |
13 | RJMP Prg2 |
14 | RJMP Prg3 |
15 | RJMP Prg4 |
16 | |
17 | Prg1: |
Ich denke, das meinst du. Gruß oldmax Mod: Fixed formatting tags
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.