基于32位汇编编写64位汇编

时间:2017-10-21 19:34:21

标签: assembly linked-list x86-64

我正在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内部都从一个操作改变)然后当我尝试取消引用时值,我没有得到下一个指针,只是一个分段错误。

0 个答案:

没有答案