2011-03-17 64 views
0

这是一个扩展到我以前的帖子,这里是更新的代码, 到目前为止,它会输出中的最后一个数字我inputed到阵列中,所以它实际上没有求和值尚未NASM总和,装配

;*************************************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

这个帖子中没有问题。 – Mat 2011-03-17 23:21:43

+1

如果这是一个扩展名,你应该在原始问题中发布它。 – jtpereyda 2011-03-17 23:24:42

+0

问题是,如果有人可以添加一些见解,为什么它不是总结和打印出正确的总和值,截至目前它唯一的打印输出到数组中的最后一个值 – John 2011-03-17 23:25:46

回答

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