Ascii zeichen und die ALU

hallo leute,

ich mache wahrscheinlich irgendwo ein denkfehler, aber komme nicht darauf… es geht um folgendes:

  • daten werden ja üblicherweise im ascii code auf einem datenträger gespeichert.
  • die zahl 123 würde also aus 3 ascii zeichen bestehen und im dualsystem folgendermassen aussehen: 00110001 00110010 00110011
  • die zahl 55 wären 2 ascii zeichen und würden folgendermassen codiert: 00110101 00110101
  • die ALU ist ja zuständig für die rechenoperationen eines computers und funktioniert logischerweise im dualsystem. je breiter die alu (je mehr bits), desto schneller und mächtiger etc.

nun, so weit ist mir noch alles klar, ABER: wenn die ALU die dezimalzahl 123 mit der dezimalzahl 55 zusammenzählen soll, verarbeitet sie nun 00110001 00110010 00110011 + 00110101 00110101 oder macht sie ganz einfach direkt 1111011 + 110111 daraus??? - ich nehme natürlich letzeres an, aber welcher teil des computers konvertiert eine 00110001 00110010 00110011 in 1111011 und das gleiche für die 55??

danke für eine antwort oder irgend ein input! …

hallo leute,

ich mache wahrscheinlich irgendwo ein denkfehler, aber komme
nicht darauf… es geht um folgendes:

  • daten werden ja üblicherweise im ascii code auf einem
    datenträger gespeichert.

Da liegt auch schon der Denkfehler. Daten werden zunächst mal als 1 und 0 auf den Datenträger gespeichert. Das Betriebssystem bzw. der Kernel erstellt daraus dann eine menschenlesbare Repräsentation. Da der PC eine Von-Neumann Architektur im Gegensatz zur Havard Architektur besitzt, sind eben Daten und Programme nicht getrennt gespeichert. Also liegen beide kompiliert in Binäform vor.

Hallo Fragewurm,

ich mache wahrscheinlich irgendwo ein denkfehler, aber komme
nicht darauf… es geht um folgendes:

  • daten werden ja üblicherweise im ascii code auf einem
    datenträger gespeichert.

Hier ist schon dein erster Denkfehler.
Die Daten werden auch direkt Binär in unterschiedlichen Formaten gespeichert. Also 1 zu 1 so wie sie im Arbeitsspeicher stehen.

  • die zahl 123 würde also aus 3 ascii zeichen bestehen und im
    dualsystem folgendermassen aussehen: 00110001 00110010
    00110011

Wenn der Programmierer diesen Weg gewählt hat: JA.

  • die zahl 55 wären 2 ascii zeichen und würden folgendermassen
    codiert: 00110101 00110101

Auch OK

  • die ALU ist ja zuständig für die rechenoperationen eines
    computers und funktioniert logischerweise im dualsystem. je
    breiter die alu (je mehr bits), desto schneller und mächtiger
    etc.

JAIN, aber siehe weiter unten.

nun, so weit ist mir noch alles klar, ABER: wenn die ALU die
dezimalzahl 123 mit der dezimalzahl 55 zusammenzählen soll,
verarbeitet sie nun 00110001 00110010 00110011 + 00110101
00110101 oder macht sie ganz einfach direkt 1111011 + 110111
daraus??? -

Es gibt technisch zwei Möglichkeiten das ganze zu Rechnen

  1. Binär
    Kennst du ja schon

  2. BCD
    http://de.wikipedia.org/wiki/Binary_Coded_Decimal

Bei der Wandlung von ASCII in BCD müssen nur die oberen 4 Bits auf 0 gesetzt werde. Das geht z.B. mit einer UND-Operation mit der Konstanten 00001111.
Dann Gibt es noch das Packed BCD. Hierbei werden immer zwei BCD Ziffern in 8 Bits gepackt.

Je nach CPU ist die ALU so aufgebaut, dass sie direkt mit BCD rechnen kann oder es gibt Operation, welcher z.B. nach einer binären Addition das Resultat korrigiert.
Die 80x86 verwenden das letztere Verfahren und kennen dazu zusätzliche Befehle:
http://www.i8086.de/asm/8086-88-asm-aaa.html
http://www.i8086.de/asm/8086-88-asm-daa.html

Achja,die meisten FPUs können auch mit BCD rechnen …

ich nehme natürlich letzeres an, aber welcher teil
des computers konvertiert eine 00110001 00110010 00110011 in
1111011 und das gleiche für die 55??

Dazu gibt es keine Hardware, sondern ein Programm.

Hier ein Beispiel in C:

unsigned int binary;
char \*ascii = "123";

unsigned int Ascii2int(char \*s)
{
 static unsigned int result = 0;

 while (\*s)
 {
 result \*= 10;
 result += \*s & 0x0F;
 s++;
 }
 return result;
}

Aufruf:

binary =Ascii2int(ascii);

MfG Peter(TOO)

Guten Tag,

besten dank für diese antwort - soweit nun wieder alles klar. habe hier noch ein schönes beispiel gefunden :wink:

http://users.telenet.be/kim1-6502/6502/proman.html#e212

mfg WengWeng

Hallo WengWeng,

besten dank für diese antwort - soweit nun wieder alles klar.
habe hier noch ein schönes beispiel gefunden :wink:

http://users.telenet.be/kim1-6502/6502/proman.html#e212

Der 6502 ist eine CPU welche direkt BCD rechnen kann.

MfG Peter(TOO)
P.S. Das von dir verlinkte Handbuch, habe ich noch als Original.

Nachtrag
Hallo WengWeng,

Dies ist noch eine der ersten Ausgaben.
http://users.telenet.be/kim1-6502/6502/pm-apndx.html#f

Hier sieht man übrigens, dass die Erweiterung zur 16-Bit CPU schon bei der Entwicklung eingeplant war.

In den späteren Dokumentationen wurden dann die gestrichelten Teile weggelassen und durch die Geschichte von MOS kam es dann gar nicht mehr zu einer 16-Bit Version :frowning:

MfG Peter(TOO)

das müssen sie auf alle fälle aufbewahren - hat ja mittlerweile mehr als nur kultstatus! ich habe nun ein kim-1 nachbau bestellt, mal sehen wie ich damit zurecht komme :wink:

mfg WengWeng

Hallo WengWeng,

das müssen sie auf alle fälle aufbewahren - hat ja
mittlerweile mehr als nur kultstatus! ich habe nun ein kim-1
nachbau bestellt, mal sehen wie ich damit zurecht komme :wink:

Ich hab noch zwei Originale :wink:

MfG Peter(TOO)