Hallo, ich benötige in meinem Programm eine modulo-Operation und verwende dafür die Funktion "__udivmodqi4". typedef struct { uint8_t quot; /* Quotient */ uint8_t rem; /* Rest */ } udiv8_t; extern udiv8_t udiv8 (uint8_t, uint8_t) __asm__("__udivmodqi4"); ... udiv8_t daten; daten = udiv8(GlobalArray[i],16); ... Der berechnete Quotient und Rest stehen im Register r24,r25. Aber die Ergbnisse werden nicht in die Struktur "daten" geschrieben. Wieso nicht? In "daten" steht immer 0 und 1 drin (r30, r31). Ich benutze das AVRStudio 4.18. Kann mir da jemand bitte weiterhelfen, wieso das so ist? mfg
Kann ich nicht nachvollziehen bzw. bei mir stimmt es mit WinAVR-20071221. Vollständiges Beispiel (Ersatz der beiden undefinierten Variablen GlobalArray und i durch eine Konstante. Die Berechnung wird weiterhin zur Laufzeit vorgenommen)
1 | #include <avr/io.h> |
2 | |
3 | typedef struct |
4 | {
|
5 | uint8_t quot; /* Quotient */ |
6 | uint8_t rem; /* Rest */ |
7 | } udiv8_t; |
8 | |
9 | extern udiv8_t udiv8 (uint8_t, uint8_t) __asm__("__udivmodqi4"); |
10 | |
11 | int main(void) |
12 | {
|
13 | udiv8_t daten; |
14 | daten = udiv8(240,16); |
15 | asm volatile("nop"); // Breakpoint für Watch 'daten' |
16 | }
|
Relevanter Ausschnitt aus dem Disassemblat
1 | 14: daten = udiv8(240,16); |
2 | +00000037: LDI R22,0x10 Load immediate |
3 | +00000038: LDI R24,0xF0 Load immediate |
4 | +00000039: RCALL PC+0x000D Relative call subroutine |
5 | +0000003A: STD Y+2,R25 Store indirect with displacement |
6 | +0000003B: STD Y+1,R24 Store indirect with displacement |
7 | 15: asm volatile("nop"); // Breakpoint für Watch 'daten' |
8 | +0000003C: NOP No operation |
Für mich sieht das korrekt aus. Die beiden Zeilen mit STD speichern das Ergebnis in die Variable daten.
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.