如何在双字阵列中放置大小为qword和更大的值?

时间:2015-10-04 18:04:34

标签: arrays assembly masm 32-bit dword

我正在尝试制作一个带2个数字的程序,例如:
num1 = 123
num2 = 24
程序正在对num1中的数字求和,在本例中,总和为6,程序需要打印多少次我需要添加90,数字的总和将等于num2。登记/> 在此示例中,我们需要添加90两次因为:1239090 - > 1 + 2 + 3 + 9 + 0 + 9 + 0 = 24

现在,我添加90的方式是取num1,乘以100并加90:
123 * 100 = 12300 --------> 12300 + 90 = 12390(第一次)

我的问题是当输入如下:
num1 = 123
num2 = 42

现在,num1支持到最后= 123 90 90 90 90 这比dword大小更大!

现在我认为我需要一个dword数组,所以如果结果大于dword大小,它会将结果的其余部分放在数组的下一个dword单元格中。 但是我不知道该怎么做,我试图通过将EBX指向数组的offset来放置结果,然后将[EBX]值放入.386 .MODEL Flat, STDCALL option casemap:none SomeFunc proto :DWORD MulBy100 proto :DWORD include \masm32\include\windows.inc include \masm32\include\msvcrt.inc includelib \masm32\lib\msvcrt.lib .data var dd 30 dup (0) ;The array to put the result count dd 0 ;count how many 90 to add SumHash dd 0 SumDigits dd 0 fmt2 db '%d',0 .code ReturnHashCode proc Number:DWORD mov SumHash,0 Lop: mov eax,Number mov ebx,10 xor edx,edx div ebx add SumHash,edx ;num%10 add to SumHash (123-->3) mov Number,eax ;num/10 go to Number (123-->12) cmp Number,0 ;check if there is no more digits to add ja Lop ret ReturnHashCode endp MulBy100 proc thevar:DWORD mov ecx,99 ;adding 100 times the number to itself = number*100 mov ebx,thevar ;point to the var dword array mov eax,[ebx] ;eax hold the num1 that we input (123 for example) MulLoop: add [ebx],eax ;adding the number to itself 100 times loop MulLoop ret MulBy100 endp start: INVOKE crt_scanf,offset fmt2,offset var ;in this example = 123 invoke crt_scanf,offset fmt2,offset SumDigits ;in this example = 24 countNop: invoke ReturnHashCode,var ;return sum of digits to SumHash variable mov eax,SumDigits ;in this example = 24 cmp eax,SumHash je End_countNop push offset var ;send the pointer to the var array dword size that suppost to hold the value (1239090....90) call MulBy100 ;multiply by 100 add var,90 ;add 90 inc count ;add to count 1 because we add 90 jmp countNop End_countNop: invoke crt_printf,offset fmt2, count ;printing how many times we added 90 end start ,但是什么是碰巧的是它只是压缩数组的第一个dword单元格中的值。

那么如何在dword数组中放置比DWORD大小更大的值?
我的代码是:

n

感谢帮助者!

1 个答案:

答案 0 :(得分:1)

当数字变得太大时,您需要级联指令。在这里,您可以使用adc指令。我将显示64位结果:

MulBy100 proc thevar:DWORD
  mov  ecx, 99        ;adding 99 times the number to itself = number*100
  mov  ebx, thevar    ;point to the var dword array
  mov  eax, [ebx]     ;edx:eax hold the num1 that we input (123 for example)
  mov  edx, [ebx+4]
 MulLoop:
  add  [ebx], eax     ;adding the number to itself 99 times
  adc  [ebx+4], edx
  loop MulLoop
 ret
MulBy100 endp

请注意写下正确的评论。您只需添加 99 次以乘以100.

通过使用额外的寄存器,您可以轻松转换此代码以支持128位结果。