Convertendo código C em assembly x86-64

Estou tentando converter meu código C para x86-64. Meu objetivo é reverter uma lista vinculada. Os dois parâmetros passados são o cabeçalho ptr e o deslocamento para obter o endereço do campo do ponteiro (ou seja, o ponteiro para o próximo nó na lista).

Pelo que entendi, o head ptr é passado através do registro rdi e o deslocamento é passado através do registro rsi. Eu continuo recebendo uma falha de segmentação quando atinge a linha "mov rcx, [rbx]". A falha de segmentação desaparece quando é apenas "mov rcx, rbx" e a linha a seguir é alterada de "mov [rbx], rdx" para "mov rbx, rdx". No entanto, acabo em um loop infinito, porque ele simplesmente atribui os mesmos valores repetidamente.

Quando estou acompanhando meu código C, toda a lógica do x86-64 faz sentido para mim, então estou realmente parado. Alguma ideia? Esta é a minha primeira vez usando x86-64.

.intel_syntax noprefix
.text
.global reverse_asm_64

reverse_asm_64:
push rbx
push r12

mov rax, 0x0
#headptr
mov rbx, rax
#nextptr
mov rcx, rax
#new_headptr
mov rdx, rax
#head
mov rax, [rdi]

#checks if head is null
cmp rax, 0
je null_ret

#move offset into a register
mov r12, rsi
add rax, r12
#add offset to rax to get the next ptr
mov rbx, rax

while_start:

#checks that next ptr isn't null
cmp rbx, 0x0
je while_done

#setting the next ptr
mov rcx, [rbx]

# *headptr = new_headptr
mov [rbx], rdx

#new_headptr = headptr
mov rdx, rbx

#sets headptr to nextptr
mov rbx, rcx

jmp while_start

while_done:
mov rax, rdx
sub rax, rsi

null_ret:
pop r12
pop rbx
ret

questionAnswers(1)

yourAnswerToTheQuestion