2013-12-16 67 views
1

如何在堆棧上放置64位長地址? 我有這個目前:在堆棧上放置64位地址

//setup the stack 
push rbp; 
mov rbp, rsp; 
sub rsp, 80; //80 bytes for stack, 9 args of 64 bits + 64 bits for the function address 

mov qword [rbp - 72], 0xfefefefe12345678; // <--- won't work 
call [rbp - 72]; 

//Restore stack 
mov rsp, rbp; 
pop rbp; 
ret 80; // <---- Is this correct? 

而且,是ret正確的嗎?

回答

3

使用64位立即數的唯一方法是將其移入寄存器。所以,你可以這樣做:

mov rax, 0xfefefefe12345678 
mov qword [rbp - 72], rax 

如果你真的不能碰任何寄存器,可以保存/恢復寄存器周圍的舉動

push rax 
mov rax, 0xfefefefe12345678 
mov qword [rbp - 72], rax 
pop rax 

,或者你可以把它變成兩個動作

mov dword [rbp - 72], 0x12345678 
mov dword [rbp - 68], 0xfefefefe 
+0

謝謝先生,第二個選項就是我正在尋找:) – alexandernst

+0

順便說一句,那麼我的電話會如何工作?將'''調用[rbp - 72]'''讀取4或8個字節? – alexandernst

+1

「調用」指令將始終讀取64位模式下的8字節地址。 'call immed'只使用32位立即數,因此只能調用當前位置+/- 2GB內的目標。 –

1

有一個推立即命令,但它不能採取64位立即操作。使用一個寄存器:

mov rax, 0xfefefefe12345678 
push rax 

至於ret 80,不,它是不正確的。 行被mov rsp, rbp行撤銷。使用ret參數的唯一原因是在callee-clears-stack調用約定中刪除函數參數。

+0

但是,爲了推動工作,我必須在推送地址之前推九次,對吧?我不想這樣做(或者我被迫?)。好的,我會解決這個問題:) – alexandernst

+0

你想做什麼?如果你想在該地址打電話,爲什麼推?做'mov rax,0xaddress/call rax'。 –

+0

我需要寄存器,所以我需要使用堆棧中的一些內存。嗯......但也許我可以嘗試使用rax,因爲這不會被使用 – alexandernst