Masm Assembly 8086 Übertragsflag zwischen Datenwortaddition

So habe ich dieses Problem, das ich lösen soll, und ich habe Stunden damit verbracht, herauszufinden, wie dies am besten funktioniert. Google hat mir nicht viel geholfen.

Das Problem besteht darin, eine Unterroutine zu erstellen, die eine Liste von Wörtern enthält, die Sie dann mit einer anderen Liste hinzufügen, die zur Ausgabe wird. Es ist im Grunde eine Methode, mit großen Zahlen zu arbeiten.

Mein Code funktioniert gut für Carry Flagsinnerhal words, aber für Carry-Flag von einem vollständigen Wort zum anderen funktioniert es nicht. Das erste 16-Bit-Wort (0005 im nachstehenden Beispiel) ist ein Flag, das meiner Unterroutine mitteilt, wie viele Wörter es gibt.

Zum Beispiel mit der folgenden Eingabe:

//si     0005 0000 EEEE DDDD CCCC BBBB
//di     0005 0000 1111 2222 3333 4445

wenn die erwartete Ausgabe ist:

0005 0001 0000 0000 0000 0000

Mein Code erzeugt:

0005 0000 FFFF FFFF FFFF 0000 

Ich glaube, ich verstehe, warum dies zum größten Teil geschieht, bin mir aber nicht sicher, wie ich dieses Problem am besten lösen kann. Ich benötige eine kostengünstige Methode, um eine 1 zwischen verschiedenen Datenblöcken zu übertragen.

;---------------------------------------
; ADD Subroutine
;---------------------------------------
    .data

    bxx dw 0000h                        ;
    cxx dw 0000h                        ;

    .code
;---------------------------------------
addx:                                   ;
    mov bxx, bx                         ;save incoming register
    mov cxx, cx                         ;save incoming register
    mov bx, si                          ;move n to bl - acts as a cursor
loopAdd:                                ;loop point
    mov cx, [si+bx]                     ;move word at point si+bx into register cx
    ADC [di+bx], cx                     ;add with carry  
    sub bx, 0002h;                      ;decrement cursor by a full word
    cmp bx, 0000h                       ;bx == 0?
    jg loopAdd                          ;no? jump to loop point
end:                                    ;
    mov bx, bxx                         ;return register to original state
    mov cx, cxx                         ;return register to original state
    ret                                 ;return
;---------------------------------------

Antworten auf die Frage(6)

Ihre Antwort auf die Frage