[英]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.