Ausgabe von Zahlen mit MMIX



  • Hi,
    kann mir mal jemand den Befehl für die Ausgabe von Zahlen sagen?

    Also Strings kann ich schon ausgeben, aber Zahlen?



  • zahl in string umwandeln und ausgeben, anders geht's net.

    rapso->greets();



  • Juuhuu, genau was ich befürchtet hab, Joe 😢



  • Tja, wie sagt man da so schön ... shit happens



  • Hi!

    Unter www.programmersheabven.com (oder so ähnlich) gibt es eine Library zum umwandeln von Fließkommazahlen in Strings. Guck da mal.

    MfG
    Jemand in der Schule.



  • Du meinst sicher das: http://www.programmersheaven.com/zone5/cat18/14450.htm

    Kann ich auch nur empfehlen.



  • Wollte er nicht MMIX und keinen x86-Code? 🙂
    MMIX ist AFAIK ein Prozessor, der etwas anders funktioniert (mehr register, andere befehle und so). Der ist von Knuth entworfen worden, von dem der TeX gemacht hat.
    Aber IMHO gibts den nur als Emulator.

    zu deinem Problem:
    Solange es Ganzzahlen und keine Fließkommawerte sind, ist das Ausgeben doch recht einfach (tipp: nimm modulo 10).



  • Original erstellt von cd9000:
    MMIX ist AFAIK ein Prozessor

    Nur ein theoretischer Prozessor, es gibt keine wirkliche Implementierung eines Prozessors, der MMIX Bytecode nutzt.



  • Original erstellt von FireYourGuns:
    Hi,
    kann mir mal jemand den Befehl für die Ausgabe von Zahlen sagen?
    Also Strings kann ich schon ausgeben, aber Zahlen?

    zufällig auf meiner plate gefunden. aus ner übungsaufgabe an der fh-münchen.

    DrZahl  IS  0
    LsZahl  IS  1
        LOC Data_Segment
        GREG    @
    -----------------------------------------------------------------------
    * AB HIER können eigene Daten ergänzt werden
    p   IS  $1
    quot    IS      $2
    rest    IS      $3
    teiler  IS      $4
    test    IS      $5
    t1      IS      $6
    t2      IS      $7
    t3      IS      $8
    t4      IS      $9
    t5      IS      $10
    t6      IS      $11
    t7      IS      $12
    t8      IS      $13
    m30     IS      $14
    leer    BYTE " ",0         
    * ENDE eigene Daten
        LOC 0
        JMP IO  Einsprung für {\tt TRIP}: Verzweigung nach IO
        LOC #100
    -----------------------------------------------------------------------
    * AB HIER kann das eigene Programm eingesetzt werden
    
    Main    TRIP    LsZahl,p,0
    
    * if(p<4) {cout<<p<<' ';return;}
        CMP test,p,4
        PBP test,1F
        TRIP    DrZahl,p,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        JMP 8F
    
    * while(p%2==0){p/=2;cout<<2<<' ';}
    1H  SET teiler,2
        JMP 2F
    1H  TRIP    DrZahl,teiler,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,teiler
        GET rest,rR
        BZ  rest,1B
    
    * while(p%3==0){p/=3;cout<<3<<' ';}
        SET teiler,3
        JMP 2F
    1H  TRIP    DrZahl,teiler,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,teiler
        GET rest,rR
        BZ  rest,1B
    
    * while(p%5==0){p/=5;cout<<5<<' ';}
        SET teiler,5
        JMP 2F
    1H  TRIP    DrZahl,teiler,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,teiler
        GET rest,rR
        BZ  rest,1B
    
    * int table[]={7-30,11-30,13-30,17-30,19-30,23-30,29-30,31-30};
    * alter code, jetzt int t1 bis t8
        SET m30,0
        SUB m30,m30,30
        ADD t1,m30,7
        ADD t2,m30,11
        ADD t3,m30,13
        ADD t4,m30,17
        ADD t5,m30,19
        ADD t6,m30,23
        ADD t7,m30,29
        ADD t8,m30,31
    
    * t1+=30;while(p%t1==0){p/=t1;cout<<t1<<' ';}
    3H  ADD     t1,t1,30
        JMP 2F
    1H  TRIP    DrZahl,t1,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,t1
        GET rest,rR
        BZ  rest,1B
    * if(t1*t1>p) return;
        MUL test,t1,t1
        CMP test,test,p
        BP  test,9F
    
    * t2+=30;while(p%t2==0){p/=t2;cout<<t2<<' ';}
        ADD     t2,t2,30
        JMP 2F
    1H  TRIP    DrZahl,t2,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,t2
        GET rest,rR
        BZ  rest,1B
    * if(t2*t2>p) return;
        MUL test,t2,t2
        CMP test,test,p
        BP  test,9F
    
    * t3+=30;while(p%t3==0){p/=t3;cout<<t3<<' ';}
        ADD     t3,t3,30
        JMP 2F
    1H  TRIP    DrZahl,t3,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,t3
        GET rest,rR
        BZ  rest,1B
    * if(t3*t3>p) return;
        MUL test,t3,t3
        CMP test,test,p
        BP  test,9F
    
    * t4+=30;while(p%t4==0){p/=t4;cout<<t4<<' ';}
        ADD     t4,t4,30
        JMP 2F
    1H  TRIP    DrZahl,t4,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,t4
        GET rest,rR
        BZ  rest,1B
    * if(t4*t4>p) return;
        MUL test,t4,t4
        CMP test,test,p
        BP  test,9F
    
    * t5+=30;while(p%t5==0){p/=t5;cout<<t5<<' ';}
        ADD     t5,t5,30
        JMP 2F
    1H  TRIP    DrZahl,t5,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,t5
        GET rest,rR
        BZ  rest,1B
    * if(t5*t5>p) return;
        MUL test,t5,t5
        CMP test,test,p
        BP  test,9F
    
    * t6+=30;while(p%t6==0){p/=t6;cout<<t6<<' ';}
        ADD     t6,t6,30
        JMP 2F
    1H  TRIP    DrZahl,t6,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,t6
        GET rest,rR
        BZ  rest,1B
    * if(t6*t6>p) return;
        MUL test,t6,t6
        CMP test,test,p
        BP  test,9F
    
    * t7+=30;while(p%t7==0){p/=t7;cout<<t7<<' ';}
        ADD     t7,t7,30
        JMP 2F
    1H  TRIP    DrZahl,t7,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,t7
        GET rest,rR
        BZ  rest,1B
    * if(t7*t7>p) return;
        MUL test,t7,t7
        CMP test,test,p
        BP  test,9F
    
    * t8+=30;while(p%t8==0){p/=t8;cout<<t8<<' ';}
        ADD     t8,t8,30
        JMP 2F
    1H  TRIP    DrZahl,t8,0
        LDA     $255,leer       
        TRAP    0,Fputs,StdOut
        SET p,quot
    2H  DIV quot,p,t8
        GET rest,rR
        BZ  rest,1B
    * if(t8*t8>p) return;
        MUL test,t8,t8
        CMP test,test,p
        BP  test,9F
    
        JMP 3B
    
    9H  CMP test,p,1
        BZ  test,8F
        TRIP    DrZahl,p,0
    8H  SWYM
    
    * ENDE des eigenen Programms.
    -----------------------------------------------------------------------
    * Ausgeben
        PREFIX  Rahmen:
    r   GREG    0       Rest
    Zahl    GREG    0       zu behandelnde Zahl
    Stellen IS  23              max. 23 Stellen
    BUFFER  OCTA    0
        LOC (BUFFER+Stellen+4)&-4
    Arg OCTA    BUFFER,Stellen
    
    :IO GET $255,:rX X der {\tt TRIP}-instruction extrahieren
        SETML   r,1
        AND r,r,$255
        BNZ r,LsZahl
    
        GETA    $255,BUFFER+Stellen+1   positioniern
        GET Zahl,:rY
        PBNN    Zahl,2F     
        NEG Zahl,Zahl   2-Kompl. berechnen
    2H  SUB $255,$255,1 Zahl ohne VZ ausgeben
        DIVU    Zahl,Zahl,10
        GET r,:rR
        INCL    r,'0'
        STBU    r,$255,0
        PBNZ    Zahl,2B
        GET Zahl,:rY
        PBNN    Zahl,3F
        SUB $255,$255,1 neg. VZ schreiben
        SETL    r,'-'
        STBU    r,$255,0
    3H  TRAP    0,:Fputs,:StdOut
        RESUME  0          
    
    * Einlesen
    Count   GREG    0       Bytes im Eingabepuffer z"ahlen
    Str GREG    0       Adr. Eingegebener String
    Vorz    GREG    0       Vorzeichen
    Num IS  $255        eing. dez.-Zahl
    LsZahl  GETA    $255,Arg        Lesen
        TRAP    0,:Fgets,:StdIn
        GETA    Str,BUFFER
        SET Count,0         Vorbelegen
        SET Num,0
        LDB Zahl,Str,Count      Vorzeichen prüfen
        CMP Vorz,Zahl,'-'
        PBNZ    Vorz,1F
        INCL    Count,1
    1H  LDB Zahl,Str,Count
        CMP r,Zahl,'0'      Hier kann die Basis 
        BN  r,2F            verändert werden
        CMP r,Zahl,'9'
        BP  r,2F
        MUL Num,Num,10      Mult. mit Basis
        SUB Zahl,Zahl,'0'   
        ADD Num,Num,Zahl
        INCL    Count,1
        JMP 1B
    2H  PBNZ    Vorz,3F
        NEG Num,Num
    3H  SETML   Vorz,#2100  gelesenen Wert bereit stellen:
        INCL    Vorz,#FF00  {\tt ADDI} {\bf \$0,\$255,\$0} nach Vorz
        GET Zahl,:rX  Zahl$\leftarrow$Zielregister
        SET Count,#FF00
        AND Zahl,Zahl,Count  
        SL  Zahl,Zahl,8  Als 1. Operand in {\tt ADDI} einbauen
        OR  Vorz,Vorz,Zahl  
        PUT :rX,Vorz
        RESUME  0
    

Anmelden zum Antworten