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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.