我正在64位程序集x86中为分配实现链表反转。现在,节点是一个包含三个元素的结构。第一个元素是int和char的联合。第二个元素是指向下一个节点的指针。第三个元素是一个int,它包含一个随机值进行测试。
我们在C中有一个反向函数,它接受reverse_list并分别将头指针和偏移传递给rdi和rsi。 偏移量是下一个节点指针与节点开头的偏移量(我认为它基于联合的大小为4)。
所以就像
reverse_list(head, offset);
然后弹出
.intel_syntax noprefix
.text
.global reverse_list
reverse_list:
push rbx
mov rax, 0x0
mov rbx, rax
mov rcx, rax
mov rdx, rax
mov rax, [rdi]
cmp rax, 0
je null_ret
add rax, rsi
mov rbx, rax
while_start:
#while (headptr)
cmp rbx, 0x0
je while_done
#nextptr = (void *) (*((unsigned long *) headptr));
mov rcx, [rbx]
# *(unsigned long *) headptr = (unsigned long) new_headptr;
mov [rbx], rdx
#new_headptr = headptr
mov rdx, rbx
#headptr = nextptr
mov rbx, rcx
jmp while_start
while_done:
mov rax, rdx
sub rax, rsi
null_ret:
pop rbx
ret
我的问题是为什么当我向rax添加偏移量(rsi)时,它也会将偏移量添加到内存中的值(例如,地址和int内部都从一个操作改变)然后当我尝试取消引用时值,我没有得到下一个指针,只是一个分段错误。