在 x86 中交换地址后程序崩溃

program crash after swapping addresses in x86

我想创建两个数组,因此我使用malloc分配动态存储。

    mov rdi, 10
    call malloc
    mov dl, [rax]
    mov [rbx], dl ; <- right here is the problem
    call malloc

但是我的程序实际上并没有交换值而是崩溃了。 rdxdl

中移动 [rax] 之后是 0

我做错了什么?我在 www

没找到任何东西

编辑:

我认为这将是等效的 C 代码。不得不说我以前从未真正使用过C。

void create_array(int n) {
    int a[n];
    int b[n];
}

目前还不完全清楚你想要完成什么,但我猜你想要 malloc 两个数组然后交换它们的第一个元素,根据你的伪 C 和评论来判断。

正如人们在评论中指出的那样,您的 rbx 从未设置为任何实际地址,因此此时它包含垃圾(或 0)。写入这样的位置会导致崩溃,因为它会指向无效的内存。让我解释一下。

mov rdi, 10
call malloc

这是正确的(尽管您可以使用 edi 来保存一个字节)。 mallocrdi 中接受它的第一个也是唯一的参数,在 rax 中 returns 一个指向已分配内存的指针。 rax 此时唯一指向有效内存的东西。

mov dl, [rax]

您现在正在将分配的内存中的第一个字节读入 dl。这也是有效的。无效的是下一条指令。

mov [rbx], dl

如前所述,您似乎从未将 rbx 设置为任何内容。它指向内存中某个随机的、几乎肯定无效的位置(或指向任何地方)。我认为你打算做的是这样的。

mov edi, 10
call malloc
mov rbx, rax ; First array in rbx

mov edi, 10
call malloc ; Second array in rax

mov dl, [rax] ; Load byte from second array
mov [rbx], dl ; Store that byte to first array

这个例子实际上并没有做任何交换(我会把它留给你作为练习),但它说明 rbx 应该在写入(或读取)任何内容之前指向有效内存from) 它包含的内存位置。