2013-12-16 73 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