在堆栈上放置64位地址

时间:2013-12-16 20:51:22

标签: assembly linux-kernel x86-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是否正确?

2 个答案:

答案 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调用约定中的函数参数。

相关问题