Assembly 在堆栈上放置64位地址

Assembly 在堆栈上放置64位地址,assembly,linux-kernel,x86-64,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 stac

如何在堆栈上放置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是否正确?

有一个push immediate命令,但它不能接受64位立即操作。使用寄存器:

mov rax, 0xfefefefe12345678
push rax

至于ret 80,不,这是不对的。子rsp,80线由mov rsp,rbp线撤销。将参数与ret一起使用的唯一原因是删除被调用方中的函数参数以清除堆栈调用约定。

有一个push immediate命令,但它不能接受64位立即操作。使用寄存器:

mov rax, 0xfefefefe12345678
push rax

至于ret 80,不,这是不对的。子rsp,80线由mov rsp,rbp线撤销。将参数与ret一起使用的唯一原因是删除被调用方中的函数参数以清除堆栈调用约定。

使用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

使用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

但是为了推动工作,我必须在实际推动地址之前推动9次,对吗?我不想那样做,还是我是被迫的?。好的,我来修。雷特:你想做什么?如果你想打那个地址的电话,为什么要推?domov-rax,0xaddress/call-rax。我需要寄存器,所以我需要使用堆栈中的一些内存。六羟甲基三聚氰胺六甲醚。。。但也许我可以尝试使用rax,因为这不应该被使用。我只是想,不能使用%rax。事实上,我根本无法接触任何寄存器,因此我不得不使用堆栈。根据英特尔的文档,push不支持64位立即数值,尽管它没有指定如果给它一个64位操作数大小前缀会发生什么。文档中唯一支持64位立即数的指令是mov reg,IMMEDBU,但要使推送工作正常,在实际推送地址之前,我必须推送9次,对吗?我不想那样做,还是我是被迫的?。好的,我来修。雷特:你想做什么?如果你想打那个地址的电话,为什么要推?domov-rax,0xaddress/call-rax。我需要寄存器,所以我需要使用堆栈中的一些内存。六羟甲基三聚氰胺六甲醚。。。但也许我可以尝试使用rax,因为这不应该被使用。我只是想,不能使用%rax。事实上,我根本无法接触任何寄存器,因此我不得不使用堆栈。根据英特尔的文档,push不支持64位立即数值,尽管它没有指定如果给它一个64位操作数大小前缀会发生什么。文档中唯一支持64位即时的指令是mov reg,immedThank you sir,第二个选项正是我想要的:顺便问一下,我的呼叫如何工作?call[rbp-72]将读取4字节还是8字节?call指令将始终在64位模式下读取8字节地址。呼叫immed仅使用32位立即数,因此只能呼叫当前位置+/-2GB范围内的目标。谢谢您,先生,第二个选项正是我所寻找的:顺便说一句,那么我的呼叫将如何工作?call[rbp-72]将读取4字节还是8字节?call指令将始终在64位模式下读取8字节地址。调用immed仅使用32位立即数,因此只能调用当前位置+/-2GB范围内的目标。