Assembly 如何在NASM中推送64位整数?

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

我试图推送一个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 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指令版本,请参阅。