Assembler 8 Bit Hexadezimal in BCD Code?

1 Antwort

Ich weiß wie man BCD Zahlen addiert usw,

Dann weißt Du auch, dass man zum Ergebnis 6 addieren muss, wenn die Summe über 9 liegt oder ein Übertrag stattfand. Letzteres wird Dir fürs erste Nibble durch das Auxiliary-Flag angezeigt, fürs zweite durch das Carry-Flag. Du brauchst diese Flags, denn sonst weißt Du nicht, ob z.B. das Ergebnis 2 durch 1+1 oder 9+9 zustande kam.

Schematisch läuft das also so ab:

Wenn (AX & 0x0f)>0x09 ODER CH≠0:
    AX += 0x06
    Wenn Carry-Flag:
        CL = 1
Wenn (AX & 0xf0)>0x90 ODER CL≠0:
    AX += 0x60

Die Reihenfolge ist hier wichtig, weil die Korrektur des ersten Nibbles das zweite noch um 1 erhöhen kann. Das könnte einen Überlauf im zweiten Nibble erzeugen, der nicht in CL vermerkt ist. Mein Ansatz, CL in diesem Fall zu setzen, ist sicher nicht die eleganteste Lösung. Aber es gibt bei dieser Aufgabe wohl sowieso keinen Schönheits- oder Effizienzbonus.

Das dritte Nibble brauchst Du nicht angucken, denn das kann bei der Addition zweier zweistelliger BCDs nur 0 oder 1 sein (99+99=198).