Итак, у меня есть эта проблема, которую я должен решить, и я потратил часы, пытаясь найти лучший способ сделать это, 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
;---------------------------------------