Там больше, но это 9 пунктов. Кажется, достаточно для начала.

аюсь преобразовать мой код C в x86-64. Моя цель - перевернуть связанный список. Два передаваемых параметра - это заголовок ptr и смещение, чтобы получить адрес поля указателя (то есть указатель на следующий узел в списке).

Из того, что я понимаю, заголовок ptr передается через регистр rdi, а смещение передается через регистр rsi. Я продолжаю получать ошибку сегментации, когда она достигает строки "mov rcx, [rbx]". Ошибка сегментации исчезает, когда это просто «mov rcx, rbx» и следующая за ним строка изменяется с «mov [rbx], rdx» на «mov rbx, rdx». Тем не менее, я попал в бесконечный цикл, потому что он продолжает просто присваивать одни и те же значения снова и снова.

Когда я слежу за своим C-кодом, вся логика в x86-64 имеет для меня смысл, так что я на самом деле в тупике. Есть идеи? Я впервые использую 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

Ответы на вопрос(1)

Ваш ответ на вопрос