组装ADC(加进位)
Assembly ADC (add with carry)
mov eax, ptr_to_num1 ; little endian
mov ebx, ptr_to_num2 ; little endian
xor ecx, ecx
xor edx, edx
clc
bytes_addition:
mov dl, byte [eax+ecx] ; byte from shortest
adc dl, byte [ebx+ecx]
mov byte [eax+ecx], dl
inc ecx
cmp ecx, 4 ; counter,
jl bytes_addition
考虑
EAX:4F2252FF(大端)
EBX:00DFFC00(大端)
这个相加的结果是错误的:50024fff (big endian)。它应该是 50024eff。看起来进位标志受到了影响,但为什么?
cmp
影响进位,这就是它用于无符号比较的方式。
您可以在 -4 开始 ecx
,然后使用 jnz bytes_addition
。你已经有 inc
了,它会在 ecx
变为零时设置零标志,并且不会影响进位。
当然这个偏移量是要补偿的,要么在循环前eax
加4,要么在寻址时加4的偏移量。
mov eax, ptr_to_num1 ; little endian
mov ebx, ptr_to_num2 ; little endian
xor ecx, ecx
xor edx, edx
clc
bytes_addition:
mov dl, byte [eax+ecx] ; byte from shortest
adc dl, byte [ebx+ecx]
mov byte [eax+ecx], dl
inc ecx
cmp ecx, 4 ; counter,
jl bytes_addition
考虑
EAX:4F2252FF(大端)
EBX:00DFFC00(大端)
这个相加的结果是错误的:50024fff (big endian)。它应该是 50024eff。看起来进位标志受到了影响,但为什么?
cmp
影响进位,这就是它用于无符号比较的方式。
您可以在 -4 开始 ecx
,然后使用 jnz bytes_addition
。你已经有 inc
了,它会在 ecx
变为零时设置零标志,并且不会影响进位。
当然这个偏移量是要补偿的,要么在循环前eax
加4,要么在寻址时加4的偏移量。