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 ProzessorNur 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