Рекурсивная функция с двумя рекурсивными вызовами с NASM - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь реализовать функцию сортировки слиянием. Вот рабочий код на C ++. (Вспомогательная функция merge () довольно длинная и не связана с моим вопросом, поэтому я ее не включила).

void mergeSort(int arr[], int l, int r) { 
    if (l < r) { 
        int m = (l + r)/2; 

        mergeSort(arr, l, m); 
        mergeSort(arr, m+1, r); 

        merge(arr, l, m, r); 
    } 
} 

Вот мой код сборки для mergeSort.

mergeSort:
; rsi = left
; rdx = mid
; rcx = right

xor rax, rax     ; zero out the return register
mov rcx, rdx       ; set rxc to the right index in array, which is passed in through rdx

start:
xor rdx, rdx       ; zero out rdx, mid = (left + right) / 2
add rdx, rsi
add rdx, rcx
shr rdx, 1

sub rsp, 16
mov [rsp+8], rsi
mov [rsp], rcx
mov rcx, rdx    
cmp rsi, rcx
jl  start

mov rsi, [rsp+8]
mov rcx, [rsp]
mov rsi, rdx    
cmp rsi, rcx
jl  start

push r10
push r11
call merge
pop r11
pop r10
add rsp, 16


done:
ret

Я не уверен, что не так с этим, так как я думаю, что я правильно следую коду для слияния c ++

...