簡體   English   中英

匯編nasm,計算實整數數組的和(浮點數)

[英]assembly nasm, compute sum of an array of real integers(floats)

這種邏輯對我來說很有意義,但是任何想法都會受到贊賞……

addarray:
    push ebx
    push ebp
    push edi
    push ecx
    push esi
    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

    fld     qword [ebx]                    ;The second input is now in a floating point register, specifically st0.
    pop     dword ebp 
    pop     dword ebp                      ;The first input is now on top of the system stack (the stack addressed by bytes)

    fadd    qword [ebx]                    ;The first input is added to the second input and the sum
                                           ;replaces the second input in st0

    add ebx,8
    inc edi

    cmp esi, edi
    jz  add_done
    jmp add_loop
add_done:
    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 [ebx]                    ;Copy contents of st0 to space currently on top of the system stack
    pop     ecx                            ;Copy 4 MSBs to ecx
    pop     edx                            ;Copy 4 LSBs to ecx
    call    writedouble                    ;Show the 8-byte value
    call    print_nl                       ;Newline

    pop esi
    pop ecx
    pop edi
    pop ebp
    pop ebx
    ret

首先,您將edi與0進行比較:

mov esi, 0      ;initialize accum to 0
...
inc edi
cmp esi, edi

基本思想是:

    fldz                       ;Load zero into ST0
    mov esi,<address_of_array>
    mov ecx,<number_of_entries>
.next:
    fadd dword [esi]           ;Add float (not double!) to ST0
    add esi,4                  ;esi = address of next float in array
    loop .next

為了提高准確性,您可能希望對數組進行排序和/或按最小到最大的順序進行添加。

  • 布倫丹

addarray:pusha mov edi,0;將計數器初始化為0 mov esi,0;將accuming初始化為0 mov ecx,0;將ecx和edx歸零mov edx,0

mov ebx, [ebp]  ;moves starting location of array1 into ebx
mov edi, [ebp+12]   ;move quantity into edi 
fld qword [ebx]

add_loop:添加ebx,8 fld qword [ebx];第二個輸入現在在浮點寄存器中,特別是st0。

fadd                 ;The first input is added to the second input and the sum
                     ;replaces the second input in st0
inc esi     ;increment counter

cmp edi, esi    ;compare to see if all values have been added
jz  add_done
jmp add_loop

add_done:調用print_nl mov eax,summessage;設置顯示一條消息,調用print_string;博士。 卡特圖書館

add ebx, 8        ;increment to not overwrite any values
    fstp    qword [ebx]       ;Copy contents of st0 to space currently on top of the system stack
mov ecx, [ebx]
mov edx, [ebx+4]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM