1-Bit-ALU

Hallo,

ich habe die Aufgabe eine 1-Bit-ALU zu entwerfen. Dazu ist mir eine Tabelle mit Befehlen gegeben.

Da steht u. a.:

ADD Add ohne Carry ADD S,D D+S-\>D
ADC Add mit Carry ADC S,D D+S+C-\>D

D(rain) ist Ziel, S(ource) ist Quelle

Der erste Befehl ist eine „ganz normale“ Addition zweier Dualzahlen (in Carry-Ripple), oder?
Jetzt irritiert mich aber der zweite Befehl. Bedeutet der, dass man den Übertrag aus dem Statusflag (Carry-Bit) mit addiert? Macht sowas überhaupt Sinn? Wenn das stimmt, wundert mich warum man nicht c_0 o. ä. schreibt…

Wäre für jede Hilfe dankbar!
Mac

Hallo MacMenace,

ADD Add ohne Carry ADD S,D D+S->D
ADC Add mit Carry ADC S,D D+S+C->D

D(rain) ist Ziel, S(ource) ist Quelle

Der erste Befehl ist eine „ganz normale“ Addition zweier
Dualzahlen (in Carry-Ripple), oder?

Beim Befehl „ADD“ soll die Summe „D + S“ berechnet und nach D geschrieben werden (zuzüglich des Carry-Bits dieser Operation, vermute ich, auch wenn diese Forderung nicht explizit da steht). Diese Spezifikation sit doch eindeutig, oder?

Jetzt irritiert mich aber der zweite Befehl. Bedeutet der,
dass man den Übertrag aus dem Statusflag (Carry-Bit) mit
addiert?

So ist es. Schließlich willst Du ja mit Deiner 1-Bit ALU auch 8-Bit-Zahlen (oder 16-Bit-Zahlen oder allgemein n-Bit-Zahlen) addieren können. Zur Addition zweiter 8-Bit-Zahlen schreibst Du dann

ADD s0, d0
ADC s1, d1
ADC s2, d2
ADC s3, d3
ADC s4, d4
ADC s5, d5
ADC s6, d6
ADC s7, d7

Beachte: Der erste Additionsbefehl ist ein „ADD“, aber alle nachfolgenden sind „ADC“! Genauso machst Du das auch, wenn Du mit einer 8-Bit-ALU zwei 16[32]-Bit-Zahlen addieren willst; dann brauchst Du einmal „ADD“ (es ist _immer nur einmal_ ADD!) und danach einmal[dreimal] „ADC“.

Auf den ADD-Befehl könnte man theoretisch verzichten. Dann müßte man allerdings vor jeder Benutzung einer „Additionskaskade“ das Carry-Flag löschen (z. B. mit einem Befehl „CLC“ für „clear carry“):

CLC
ADC s0, d0
ADC s1, d1
ADC s2, d2
ADC s3, d3
ADC s4, d4
ADC s5, d5
ADC s6, d6
ADC s7, d7

Das ginge vom Prinzip her problemlos. Man müßte allerdings das "CLC " auch jedesmal voransetzen, wenn man nur 1-Bit-Zahlen mit einer 1-Bit-ALU (oder 8-Bit-Zahlen mit einer 8-Bit-ALU, oder 16-Bit-Zahlen mit einer 16-Bit-ALU) addieren will:

CLC
ADC S, D

Würde man das „CLC“ weglassen, würde „ADC“ gnadenlos das Carry-Bit berücksichtigen, das vor ner halben Minute irgendwo gesetzt worden ist --> Fehler. Da man nun sehr häufig mit einer 8-Bit-ALU 8-Bit-Zahlen addieren will und weniger oft 16- oder 32-Bit-Zahlen, wäre es recht umständlich, vor jedem popeligen „Einzel“ -ADC immer „CLC“ schreiben zu müssen, und es würde das Programm außerdem auch verlangsamen (ADC + CLC = zwei Instructions, ADD = nur eine Instr.). Deshalb hat das „ADD“ schon seine Berechtigung; es macht die Sache einfacher: 1. Bei Einzeladditionen wird ADD verwendet, 2. bei Kaskaden ist der erste Befehl ADD und alle folgenden ADC. 3. Nix weiter :wink:.

Macht sowas überhaupt Sinn? Wenn das stimmt, wundert

mich warum man nicht c_0 o. ä. schreibt…

Das verstehe ich jetzt nicht. Was soll „c_0“ sein?

Mit freundlichem Gruß
Martin

Danke für deine Hilfe Martin!