Assembly 如何在NASM中推送64位整数?
我试图推送一个64位整数,但在组装NASM时,似乎希望将其视为DWORD而不是QWORD 我正在使用ASM创建外壳代码,我需要将64位DLL注入64位进程。第一个QWORD是旧的指令指针,第二个是包含DLL地址的地址,第三个是LoadLibrary的地址。占位符在运行时填写Assembly 如何在NASM中推送64位整数?,assembly,x86-64,nasm,Assembly,X86 64,Nasm,我试图推送一个64位整数,但在组装NASM时,似乎希望将其视为DWORD而不是QWORD 我正在使用ASM创建外壳代码,我需要将64位DLL注入64位进程。第一个QWORD是旧的指令指针,第二个是包含DLL地址的地址,第三个是LoadLibrary的地址。占位符在运行时填写 section .text global _start _start: BITS 64 PUSH QWORD 0xACEACEACACEACEAC PUSHFQ push rax PUSH QWORD 0xACEAC
section .text
global _start
_start:
BITS 64
PUSH QWORD 0xACEACEACACEACEAC
PUSHFQ
push rax
PUSH QWORD 0xACEACEACACEACEAC
MOV RAX, 0xACEACEACACEACEAC
CALL RAX
pop RAX
POPFQ
RETN
没有
push imm64
指令。作为解决方法,您可以执行以下操作之一:
mov-rax,0xacec;按rax键
push-qword[rel-foo]
push dword low32;mov dword[rsp+4],高32
或子rsp,8;mov dword[rsp],低32;mov dword[rsp+4],高32
是否可以使用两个推送命令,第一个推送下部32,第二个推送上部32。这似乎是唯一可行的解决方案。这与选择3没有太大区别,为什么不好?哦,是的,我没意识到。谢谢你的帮助。无论如何,似乎没有办法用32位操作数大小对
push
进行编码。(即使有寄存器源)。英特尔的insn ref手册说,您可以使用REX.W
,但它不适用于NASM/YASM/GNU as,也不适用于真正的CPU(通过将db 0x40
(REX.W=0)或db 0x48
(REX.W=1)粘贴在推送rdx
)。在Intel SnB上测试,同时使用GDB单步执行。此外,就整体性能和代码大小而言,方法1几乎肯定是最好的<代码>推送m32(2)在Intel和AMD上解码为2个UOP,加载可能在缓存中丢失。(假设4不可用。)相关:有关此的ALU指令版本,请参阅。