NASM добавить два массива вместе слот за слотом, в третий массив - PullRequest
1 голос
/ 08 апреля 2011

работает на 32-битной архитектуре, и я добавляю два массива вместе слот за слотом в третий массив, поэтому, если у меня есть 3,4,4 и 4,4,4 в массивах, третий массив должен содержать 7,8, 8 в конце функции

Мне удалось правильно передать массивы и количество элементов в функцию arleady, я знаю это, потому что я запустил тестовый код

Теперь я работаю над дополнительной частью, вот что у меня есть, логика имеет смысл для меня, но она все еще ошибается ... идеи?

;*************************************ADD ARRAY**********************************************
segment .bss
;
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 ecx, 0      ;zero out ecx and edx
    mov edx, 0

    mov ebx, [esp+48]   ;moves starting location of array1 into ebx
    mov edi, [ebp+40]   ;move quantity into edi 
    mov ebp, [esp+60]   ;move the starting location of array2 into ebp

    mov esi, [esi]  ;move starting locatino of array3 into esi

    ;mov    ecx, [ebp]
    ;mov    edx, [ebp+4]
    ;call   writedouble
    ;call   print_nl

add_loop:

    fld     qword [ebx]      ;The second input is now in a floating point register, specifically st0.
    fld qword [ebp]

    fadd                 ;The first input is added to the second input and the sum
                         ;replaces the second input in st0

    fstp    qword [ecx] ;copy top of stack onto ecx
    mov ecx,[ecx]
    mov edx,[edx+4] 

    mov [esi], ecx
    mov [esi+4], ecx
    add esi, 8      ;increment to the next loaction of esi

    add ebx,8       ;increment location of ebx to the next floating point value of array1
    ;add    ebp,8       ;increment location of ebp to the next floating point value of array2

    dec edi     ;increment counter

    cmp edi, 0      ;compare to see if all values have been added
    jz  add_done
    jmp add_loop
add_done:
    popa
    ret

1 Ответ

1 голос
/ 09 апреля 2011

Сегфо, вероятно, исходит от fstp qword [ecx].В начале addarray вы устанавливаете ecx равным 0, а затем пытаетесь сохранить значение по тому адресу, который система не разрешает.Как упомянул Брендан, вы можете напрямую сохранить значение в выходном массиве:

; This replaces five lines starting with your current fstp instruction
fstp qword [esi]

Далее, почему вы прокомментировали приращение ebp?С этим комментарием вы всегда добавите первый элемент второго массива к текущему элементу первого.

Наконец, вы можете сократить код, который определяет, нужен ли вам другой цикл с помощью двух инструкций.dec автоматически устанавливает нулевой флаг, если он приводит к 0, поэтому вам не нужна инструкция cmp, и вы можете указать, что он должен перейти к другому циклу, если он не равен нулю, но просто позвольте ему продолжить, если он:

dec edi ; decrement number of remaining elements
jnz add_loop
; If edi is zero, this will just continue into add_done

Отредактировано так, как Брендан предложил сохранить непосредственно в выходном массиве

...