Итак, у меня есть эта проблема, которую я должен решить, и я потратил часы, пытаясь найти лучший способ сделать это, Google не очень помог.
Проблема заключается в создании подпрограммы, которой присваивается список слов, которые вы затем добавляете с другим списком, который становится выходом. В основном это метод работы с большими числами.
Мой код отлично подходит для флагов переноса внутри, но для флага переноса из одного полного слова в другое он не работает. Первое 16-битное слово (0005 в примере ниже) является флагом, используемым для указания моей подпрограмме, сколько слов есть.
Например, учитывая следующий ввод,
//si     0005 0000 EEEE DDDD CCCC BBBB
//di     0005 0000 1111 2222 3333 4445
когда ожидаемый результат:
0005 0001 0000 0000 0000 0000
Мой код производит:
0005 0000 FFFF FFFF FFFF 0000 
Полагаю, я понимаю, почему это происходит по большей части, но я не уверен в том, как наилучшим образом решить эту проблему. Мне нужен недорогой метод переноса 1 между различными кусками данных.
;---------------------------------------
; 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
;---------------------------------------
