Assembly 64位模式不支持32位推送和弹出指令

Assembly 64位模式不支持32位推送和弹出指令,assembly,nasm,x86-64,Assembly,Nasm,X86 64,NASM返回错误,如:“64位模式下不支持指令” (或对于YASM,操作数1的大小无效 主题说明为pop ecx和push ecx 我可以使用什么来代替它们,或者是否有其他方法来解决此问题?一般的想法是,您通常会推送和弹出完整寄存器,即64位模式下的64位寄存器push的默认操作数大小为64位,32位操作数大小不可用。(是的,除非您专门使用16位推送,但32位不可用) 不能在64位模式下推送32位寄存器;相反,您可以推送并弹出包含所需32位值的整个64位寄存器,因此这是push rax,而不是p

NASM返回错误,如:“64位模式下不支持指令”
(或对于YASM,
操作数1的大小无效

主题说明为
pop ecx
push ecx

我可以使用什么来代替它们,或者是否有其他方法来解决此问题?

一般的想法是,您通常会推送和弹出完整寄存器,即64位模式下的64位寄存器
push
的默认操作数大小为64位,32位操作数大小不可用。(是的,除非您专门使用16位推送,但32位不可用)

不能在64位模式下推送32位寄存器;相反,您可以推送并弹出包含所需32位值的整个64位寄存器,因此这是
push rax
,而不是
push eax
。内存引用也是如此-您可以
推送qword ptr[rax]
,但不能
推送dword ptr[rax]

但是:即使在64位模式下,您仍然可以推送:

  • 8位或32位直接符号扩展到64位;这通常由汇编器作为优化自动处理(如果您执行
    push 1
    ,它将使用最紧凑的编码对其进行编码,即
    6A01
    ,即使用imm8操作数)。不管汇编程序选择的立即数的宽度是多少,它都是

  • fs
    gs
    段寄存器,但不包括
    cs
    ds
    es
    ss
    寄存器(在64位模式下不重要,只能使用而不能使用
    push
    读取,释放这些push/pop操作码以备将来使用)

    例外情况是,段寄存器要么是零扩展寄存器,要么是在堆栈上按16位移动(即堆栈上的其他48位保持不变);这其实不是什么大问题,因为
    pop fs
    pop gs
    只是丢弃这些额外的位

您可以使用
push low32
/
mov dword[rsp+4],high32来模拟
push imm64
。或者使用
mov r64、imm64
/
push r64
mov
to register(而非memory)是唯一一条可以执行64位立即数的x86-64指令


使用16位操作数大小(a
66h
前缀),您可以执行16位推送,将RSP调整2而不是8。但通常不要这样做,因为它会使堆栈错位,直到您执行16位pop或以其他方式纠正它

  • 16位寄存器(
    push ax
    )和内存引用(
    push word ptr[rax]
  • 8位符号扩展或16位立即<代码>推送word 123


8位寄存器不能在任何模式下推送(作为更宽寄存器的一部分除外),32位推送/弹出在64位模式下不可用。

除了可以推送r/m16和r/m64但不能推送r/m32之外,还可以推送imm8、imm16和imm32但不能推送imm64这一事实也很奇怪。你不能推CS、DS、ES或SS,但你可以推FS和GS。我觉得这很不一致。@RudyVelthuis:这很不一致,尽管在这种疯狂中有一些方法。无法推送imm64与指令集的其余部分大致一致-据我所知,唯一接受imm64的指令是
mov r64,imm64
(实际上,在英特尔手册的整个指令集描述中,它是唯一与imm64匹配的指令)。除了fs和gs之外的段寄存器不再在64位模式下使用,因此它们不能被推送也就不足为奇了。我理解“疯狂背后的方法”。但有时它会变得相当混乱。尤其是您可以推送/弹出16位而不是32位的项目。@RudyVelthuis,您不能在x64中推送eax的原因是x64中推送r64的编码与x86中推送r32的编码相同。也就是说,
push reg
表示
push native\u register\u size
。否则,需要扩展指令集。天知道x64已经有足够多的指令了。16/8位的推送已经存在,所以它们被保留为遗留版本。@Johan:当我查看带有操作码的指令表时,我理解了这一点。但是无论是什么原因,它都变得越来越令人困惑。显示你的代码,否则问题将无效<代码>寻求调试帮助的问题(“为什么此代码不工作?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现这些问题所需的最短代码。没有明确问题陈述的问题对其他读者没有用处