简体   繁体   中英

nasm sum of real number array, assembly

this is an extension to my previous post, here is the updated code, so far it will ouput the last number I inputed into the array, so it's not actually summing values yet

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

I'm going to guess that having fldz inside the loop is probably at least part of your problem.

Your loop to add the numbers looks a bit...strange to me. I think I'd use something more like this [warning: I mostly use MASM, so I used its syntax here...]:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM