我想創建兩個陣列,因此我用它malloc來分配動態存盤。
mov rdi, 10
call malloc
mov dl, [rax]
mov [rbx], dl ; <- right here is the problem
call malloc
但是我的程式實際上并沒有交換值,而是崩潰了。rdx是0搬進[rax]來之后dl

我究竟做錯了什么?我在www中沒有找到任何東西
編輯:
我認為這將是等效的 C 代碼。不得不說我以前從未真正使用過 C。
void create_array(int n) {
int a[n];
int b[n];
}
uj5u.com熱心網友回復:
目前尚不完全清楚您要完成什么,但我猜您想要malloc兩個陣列,然后交換它們的第一個元素,根據您的偽 C 和注釋判斷。
正如人們在評論中指出的那樣,您rbx的地址從未設定為任何實際地址,因此0此時它包含垃圾(或)。寫入這樣的位置會導致崩潰,因為它會指向無效的記憶體。讓我解釋。
mov rdi, 10
call malloc
這是正確的(盡管您可以用來edi保存一個位元組)。malloc接受它的第一個也是唯一的引數rdi,并回傳rax一個指向分配記憶體的指標。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應該在任何東西被寫入(或讀取)它包含的記憶體位置之前指向有效記憶體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/482895.html
