在 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
但是我的程序实际上并没有交换值而是崩溃了。 rdx
在 dl
中移动 [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
来保存一个字节)。 malloc
在 rdi
中接受它的第一个也是唯一的参数,在 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) 它包含的内存位置。
我想创建两个数组,因此我使用malloc
分配动态存储。
mov rdi, 10
call malloc
mov dl, [rax]
mov [rbx], dl ; <- right here is the problem
call malloc
但是我的程序实际上并没有交换值而是崩溃了。 rdx
在 dl
[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
来保存一个字节)。 malloc
在 rdi
中接受它的第一个也是唯一的参数,在 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) 它包含的内存位置。