Hallo, ich habe da ein Problem in C was ich will in x86 mov ebx,124 mov eax,6 mov [ebx],eax in Arm asm ? ldr r0,#124 ldr r1,6 str r1,[r0] jetzt in C volatile unsigned int *base; // beide global volatile unsigned int c; Codefragment base = (unsigned int*) 0; c = 6; base[31] = c; Compiler ist Arm gcc Meine Frage ist ob das C Stück das macht was ich will schreibe 6 in Adresse 124? Gruss Heinz
heinz schrieb: > Meine Frage ist ob das C Stück das macht was ich will > schreibe 6 in Adresse 124? 6 als Byte? Warum nimmst du dann nicht einfach einen unsigned char Pointer? Dann brauchst du da auch nicht groß rumrechnen, basierend auf der sizeof eines int?
1 | unsigned char* Ptr = (unsigned char*)124; |
2 | |
3 | *Ptr = 6; |
Karl Heinz schrieb: > 6 als Byte? Ich vermute, er will tatsächlich ein int32_t abspeichern, weil er bei x86 die Extended-Register verwendet.
1 | *(int32_t*)31= 6; |
Markus Weber schrieb: > Karl Heinz schrieb: >> 6 als Byte? > > Ich vermute, er will tatsächlich ein int32_t abspeichern, weil er bei > x86 die Extended-Register verwendet. Kann sein. Da kenn ich die x86 zu wenig > >
1 | > *(int32_t*)31= 6; |
2 | >
|
Selbst dann würde ich das so schreiben
1 | unsigned char* Ptr = (unsigned char*)124; |
2 | |
3 | *(int32_t*)Ptr = 6; |
die 124 als tatsächliche Adresse wären mir zu wichtig, als dass ich sie der implizten Division durch 4, durch Angabe von 31, opfern würde. Da sehe ich im Cast das kleinere Übel, zumal man den ja auch mittels Makro noch verstecken kann.
Die 6 war nur irgendwas, abspeichern möchte ich 32Bit. Frage ist ob C und asm äquivalent sind. Ich bin auf ARM absoluter Anfänger. Jetzt versuch ich ein Beispiel nachzuvollziehen mit einem Aufruf von einer Routine in asm asm PUT32: str r1,[r0] bx lr C PUT32(124,6); ersetzt durch base[31] = 6; der Dump sieht für mich (wie gesagt Anfänger) korrekt aus. Aber die Programmfunktion ist hinüber
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.