Итак, у меня есть эта проблема, которую я должен решить, и я потратил часы, пытаясь найти лучший способ сделать это, 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
;---------------------------------------
cmp
изменит флагCF
, аmov
нет. - person MikeCAT   schedule 03.03.2016