Problem mit Modulo-Funktion "__udivmodqi4"

Gast #1989287
Lesenswert?

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
Persönliche Seite #1989360
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren