Multiplikation mit Assembler
-
Was soll das Programm machen, wenn das Carryflag nicht gesetzt ist?
-
Das clc entfernt ja das Carryflag welches durch die vorhergehende zweite Multiplikation gekommen ist. Durch die nachfolgende Addition kann ja auch kein Carrykommen und wenn ich das vorhergesetzte nicht wegmache, dann wär ja eins da obwohl die addition gar kein carry liefert. Mein hauptproblem ist eigentlich, warum mir das Programm trotz dem NICHT gesetzen carryflag dx+1 rechnet!
-
Guck mal genau hin. Was tut es denn, wenn das Carryflag nicht gesetzt ist?
-
Welches carry meinst dud enn jetzt? das nach der multiplikation oder das nach der addition?
-
Ich versteh das nicht. Das Programm rennt mir grundsätzlich in dx,1 rein, obwohl ich ja mit jc überprüfe ob ein carry da ist oder nicht. Und er rennt auch rein wenn definitiv kein carry da ist...
Kannst du mir genau erklären was da faul ist?
-
Das Sprungziel von JC ist der erste Befehl, der gleich nach JC kommt. Somit ist JC wirkungslos.
Besser wäre vielleicht:
add AX,BX ;JC Carry1 JNC NoCarry1 ; soll add DX,1 überspringen wenn kein Carry add DX,1 NoCarry1: (...)
-
Das ist doch auch nicht richtig. Ich will doch dx,1 nur wenn das Carry gesetzt ist...
-
Oder auch nicht dx,1 wenn das Carry nicht gesetzt ist.
JNC -> Jump if Not Carry
-
Du meinst also, da ich mit clc das carry abgeschaltet überspringt er mit jnc den Befehle add dx,1?
D.h. wenn ich das carry mit clc nicht weggemacht hätte, dann hätte er den Befehl add dx,1 mit jc übersprungen?
-
(...) add AX,BX JC Carry1 Carry1: add DX,1 (...)
^^ So steht es in Deinem Code:
-> Wenn Carry gesetzt ist, soll das Programm mit dem ersten Befehl hinter Label Carry1 weitermachen.
-> Wenn Carry nicht gesetzt ist, soll das Programm mit dem ersten Befehl hinter JC weitermachen.
Aber der erste Befehl in beiden Fällen ist "add DX,1".