V
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