Forum: Mikrocontroller und Digitale Elektronik arm asm nach C ist das korrekt


von heinz (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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;

von Markus W. (Firma: guloshop.de) (m-w)


Lesenswert?

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;

von Karl H. (kbuchegg)


Lesenswert?

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.

von heinz (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.