Assembly 如何在64位进程上将两个DWORD正确组合成一个QWORD?

Assembly 如何在64位进程上将两个DWORD正确组合成一个QWORD?,assembly,memory,x86-64,Assembly,Memory,X86 64,所以我有以下几点 0000024E9689000A | 68 FF 7F 00 00 | push 7FFF | 0000024E9689000F | 68 45 B2 8C DF | push FFFFFFFFDF8CB245 | 0000024E96890014 | 58 | pop rax

所以我有以下几点

0000024E9689000A | 68 FF 7F 00 00           | push 7FFF                               |
0000024E9689000F | 68 45 B2 8C DF           | push FFFFFFFFDF8CB245                   |
0000024E96890014 | 58                       | pop rax                                 |
0000024E96890015 | 50                       | push rax                                |
0000024E96890016 | C3                       | ret                
我想组合两个DWORD,首先推高一个,然后推低一个,然后弹出到rax中,如果我理解正确的话,它应该将堆栈上的这两个DWORD组合成一个QWORD

进程是64位的,我做错了什么

您想要这个:

mov rax, upperHalf
mov rdx, lowerHalf
shl rax, 32
or rax, rdx?

对于常数,像普通人一样使用10字节。与任何其他指令不同,存在一种具有64位立即数的mov形式


MOV RAX,0x7FFFDF8CB245组装得很好。

这与C++有什么关系?你不能在64位中推。你正在显示一些代码,但是你没有指出你看到的代码的具体结果,也没有你期望的结果。所以很难回答这个问题…我错了吗?你可以用shl和or来回答。在你的例子中,这些值是常量,所以显而易见的解决方案是简单地将组合常量加载到rax中。请更改您的问题,以显示您实际想要做的事情。如果它们是常量,则为mov rax,imm64。否则,如果它们已经在单独的寄存器中进行了零扩展,那么是的。或者,请参阅mov不允许64位直接,只允许32位直接,即符号扩展到64位。另一种方法是将该立即数存储在某个位置,并通过mov rax加载它,qword[myImmediate]No有64位立即数,这与mov r/m64、sign_extended_imm32或任何其他x86-64指令不同。AT&T语法称之为movabs。它是5字节MOVr32的REX.W=1版本,imm32。