【发布时间】:2016-03-03 07:08:42
【问题描述】:
所以我有这个我应该解决的问题,我花了几个小时试图找出最好的方法来解决这个问题,谷歌并没有提供太多帮助。
问题是创建一个子例程,它给出一个单词列表,然后添加另一个列表作为输出。它基本上是一种处理大量数字的方法。
我的代码对于携带标志 within 单词工作正常,但对于从一个完整单词到另一个单词的携带标志,它不起作用。第一个 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不会。
标签: assembly masm word carryflag