如何在堆栈上放置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
是否正确?
答案 0 :(得分: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
答案 1 :(得分:1)
有一个push-immediate命令,但它不能立即执行64位操作。使用注册:
mov rax, 0xfefefefe12345678
push rax
至于80号,不,它不对。 sub rsp, 80
行撤消mov rsp, rbp
行。使用ret
参数的唯一原因是删除callee-clears-stack调用约定中的函数参数。