Overflow bei Multiplikation per inline asm abfangen

Mips

Member
Hallo zusammen!

Da ich einen Algorithmus programmiere, der verzweigt, wenn bei der Multiplikation von 2 uint32_t Zahlen ein Overflow eintritt, wollte ich dies möglichst effizient programmieren.
Daher habe ich mich fuer asm entschieden, damit ich die Prozessorflags benutzen kann.

Zum Testen habe ich ein kleines Programm geschrieben, dass einfach 2 Zahlen multipliziert (i,j) und wenn ein Overflow auftritt, re auf 1 setzt..

Hier nun mein Code:
Code:
#include <stdio.h>


int main(void) {
        unsigned int i = 0xfffffff1;
//      unsigned int i = 0x01;
        unsigned int j = 0x0A;
        volatile unsigned int re = 0;
        __asm__("leal (%2,%0), %0\n"
              "jno ende\n"
              "movl $1, %1\n"
              "ende:\n"
                            :"=r" (j), "=r" (re)
                            :"r" (i), "r" (re), "r" (j)
                            :"0");

        printf("%u %u\n",j, re);

        return(0);

}

Komischerweise gibt das Programm für re immer 0 aus, obwohl ein Overflow eintritt. Nun weiss ich nicht, ob mein asm Code einen Fehler beinhaltet oder ich etwas bei dem "inlining" flasch gemacht habe.

Getestet habe ich es auf FreeBSD und Linux mit gcc.

Würde mich über jeglich Tipss freuen.

Bis denn dann,
Mips
 
Wo ist die Multiplikation? lea ist eine Addition. Darüber hinaus verändert lea niemals die Statusanzeige. Wenn du desweiteren prüfen willst, ob bei einer vorzeichenlosen Operation ein Überlauf auftrat, dann musst du das Carry Flag, nicht das Overflow Flag testen. Wenn es wirklich auf Geschwindigkeit ankommt (was ich bezweifle), dann solltest du auch bedingte Sprünge meiden und stattdessen Setcc verwenden. Wofür soll das volatile gut sein? Die Spezifikation der Ein/Ausgabe des Assemblerblocks ist auch falsch. Du gibst fünf Operanden an, verwendest aber nur drei im Assembler. Selbe Ursprungsvariable bei Ein/Ausgabe bedeuetet nicht, dass das selbe Register zugeteilt wird.
Schreib den Test besser in C. Dass das Ergebnis einer vorzeichenlosen 32bitx32bit Multiplikation nicht in ein 32bit Ziel passt, lässt sich einfach hinschreiben und ein heutiger Übersetzer macht da auch ordentlichen Kode draus (Ich vermute mul, test %edx, %edx, setne)
 
Zurück
Oben