实数数组,汇编的总和

时间:2011-03-17 23:19:45

标签: assembly 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

1 个答案:

答案 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
相关问题