Там больше, но это 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