我试图将我的C代码转换为x86-64。我的目标是扭转链接列表。传入的两个参数是头部ptr和偏移量以获取指针字段的地址(即指向列表中下一个节点的指针)。将C代码转换为x86-64程序集
据我所知,头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
是否有这样一个看似无用的练习的好理由? –
有很好的工具:C编译器。他们中的许多人可以选择发送汇编代码,而那些不能与反汇编人员配对的选项。 –
很高兴有人同意这是一个无用的练习。我需要完成一个班级任务,但过去几天我一直陷入困境。 – Ryan