Windows 试图推动;变量";堆叠
我有以下代码:Windows 试图推动;变量";堆叠,windows,variables,assembly,stack,x86-64,Windows,Variables,Assembly,Stack,X86 64,我有以下代码: [bits 64] %define msg db "%i\n", 0xa, 0 %define var -4 mov r8, rsp mov [r8+(var)], WORD 0xFFFF push WORD [r8+(var)] ; not works ; if trying to push DWORD its shows error instruction not supported in 64 bit asm push DWORD 0xFFFF ; works call t
[bits 64]
%define msg db "%i\n", 0xa, 0
%define var -4
mov r8, rsp
mov [r8+(var)], WORD 0xFFFF
push WORD [r8+(var)] ; not works
; if trying to push DWORD its shows error instruction not supported in 64 bit asm
push DWORD 0xFFFF ; works
call tCtAKBWomJ
msg
tCtAKBWomJ:
call [rbx+3*8]
add rsp, 8
push 0
call [rbx]
呼叫[rbx+x*8]
是对asmloader api的调用
x=0,退出
x=3,printf
等等
我想将值移动到“variable”并将其推送到堆栈
编辑:
“可变偏移量”应为+值,而不是-
我应该用
推QWORD
而不是
PUSH DWORD [r8+(var)]
使用
因为堆栈上的所有字都是Q字。而不是
PUSH DWORD [r8+(var)]
使用
由于堆栈上推送的所有字都是Q字。NASM语法
推送DWORD 0xFFFF
是DWORD立即数的一种,在64位模式下组装时,符号扩展为Q字
IDK为什么NASM和YASM毫无预警地接受它;我认为他们不应该这样做,因为这是误导,正如你发现的那样
只有push strict dword 1
可以覆盖立即数的编码(而不是指令的操作数大小)。注意,它用于覆盖最短编码的正常选择(在这种情况下,即使数字可以在imm8中编码,也会强制使用imm32)<代码>推送dword 1不会禁止优化到推送imm8
,它只将操作数设置为dword
。除此之外,它在64位模式下将其设置为qword。超级混乱,可以说是破碎的
在64位模式下,push
的唯一合法操作数大小是64和16。
. 32位push
在64位模式下不可编码
这适用于使用内存和寄存器操作数的推送,而不仅仅是即时操作。这就是为什么推送dword[mem]
不可编码的原因;在这种情况下,NASM将其视为实际需要dword内存操作数
QWORD推式立即数可以使用8位或32位立即数,这两种符号都扩展到64位。立即数的宽度与操作数大小(存储到内存的宽度以及从RSP中减去的量)是分开的。再次查看链接问题。NASM语法
推送DWORD 0xFFFF
是一种DWORD立即数,在64位模式下组装时扩展为qword的符号
IDK为什么NASM和YASM毫无预警地接受它;我认为他们不应该这样做,因为这是误导,正如你发现的那样
只有push strict dword 1
可以覆盖立即数的编码(而不是指令的操作数大小)。注意,它用于覆盖最短编码的正常选择(在这种情况下,即使数字可以在imm8中编码,也会强制使用imm32)<代码>推送dword 1不会禁止优化到推送imm8
,它只将操作数设置为dword
。除此之外,它在64位模式下将其设置为qword。超级混乱,可以说是破碎的
在64位模式下,push
的唯一合法操作数大小是64和16。
. 32位push
在64位模式下不可编码
这适用于使用内存和寄存器操作数的推送,而不仅仅是即时操作。这就是为什么推送dword[mem]
不可编码的原因;在这种情况下,NASM将其视为实际需要dword内存操作数
QWORD推式立即数可以使用8位或32位立即数,这两种符号都扩展到64位。立即数的宽度与操作数大小(存储到内存的宽度以及从RSP中减去的量)是分开的。同样,请参见该链接问题。您不应该需要
位64
指令,因为它不会导致程序正常运行。相反,在运行汇编程序时,选择适当的标志来创建64位对象。也就是说,在64位模式下确实没有推送DWORD指令。请尝试按QWORD键。但是也就是说,您通常不会在64位模式下向堆栈上的函数传递参数,因此即使使用该模式,代码也可能无法正常工作。谢谢,push qword有帮助:)您永远不应该需要bits 64
指令,因为它不会导致程序正常运行。相反,在运行汇编程序时,选择适当的标志来创建64位对象。也就是说,在64位模式下确实没有推送DWORD指令。请尝试按QWORD键。但也就是说,您通常不会在64位模式下向堆栈上的函数传递参数,因此即使使用该模式,您的代码也可能无法正常工作。谢谢,push qword有帮助:)
PUSH QWORD [r8+(var)]