Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/rust/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 试图推动;变量";堆叠_Windows_Variables_Assembly_Stack_X86 64 - Fatal编程技术网

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)]