这是我上一篇文章的扩展,这是更新的代码, 到目前为止,它将输出我输入数组的最后一个数字,所以它实际上并没有对值进行求和
;*************************************ADD ARRAY**********************************************
segment .bss
sum resq 1
segment .data
summessage db "The Sum is: ", 0
segment .text
extern readdouble,print_string, read_int, writedouble, print_nl, print_int
global addarray
addarray:
pusha
mov edi, 0 ;initialize counter to 0
mov esi, 0 ;initialize accum to 0
;mov ecx, 0 ;zero out ecx and edx
;mov edx, 0
mov ebx, [ebp] ;moves starting location of array1 into ebx
mov edi, [ebp+12] ;moves array size
add_loop:
mov ecx, [ebx] ;mov higher order
mov edx, [ebx+4] ;mov lower order
push ecx
push edx
fldz
fld qword [esp] ;The second input is now in a floating point register, specifically st0.
pop dword ecx
pop dword edx ;The first input is now on top of the system stack (the stack addressed by bytes)
fadd qword [esp] ;The first input is added to the second input and the sum
;replaces the second input in st0
add ebx,8
inc esi
cmp edi, esi
jz add_done
jmp add_loop
add_done:
call print_nl
mov eax, summessage ;Setup to display a message
call print_string ;Dr. Carter's library
push dword 0 ;Make space on sytem stack for the sum value
push dword 0 ;Ditto
fst qword [esp] ;Copy contents of st0 to space currently on top of the system stack
pop edx ;Copy 4 MSBs to ecx
pop ecx ;Copy 4 LSBs to ecx
call writedouble ;Show the 8-byte value
call print_nl ;Newline
popa
ret
答案 0 :(得分:1)
我猜测循环中有fldz
可能至少是你问题的一部分。
你添加数字的循环看起来有点......对我来说很奇怪。我想我会使用更像这样的东西[警告:我主要使用MASM,所以我在这里使用了它的语法...]:
add_array proc
mov esi, [ebp]
mov ecx, [ebp+12] ; I'm assuming these are the right offsets
fldz
add_loop:
fadd qword ptr [esi]
add esi, 8
dec ecx
jnz add_loop
fstp result
ret
add_array endp