Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.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
Assembly 汇编代码指令;pushq";无法将64位的内容推入堆栈?_Assembly_Gcc_Stack_X86 64 - Fatal编程技术网

Assembly 汇编代码指令;pushq";无法将64位的内容推入堆栈?

Assembly 汇编代码指令;pushq";无法将64位的内容推入堆栈?,assembly,gcc,stack,x86-64,Assembly,Gcc,Stack,X86 64,我正在学习Linux x64上的汇编代码。我写了这样的东西: pushq 0x1234567890123456 #It didn't work. pushq 0x12345678 #It worked. 我使用gcc-c来编译代码,第一行是error witherror:operation type与'push'不匹配。但pushq意味着将64位的数据推入堆栈,十六进制数正好是64位 那么,为什么会发生此错误?push没有在堆栈上推送64位立即数的表单。您可以在堆栈上推送一个

我正在学习Linux x64上的汇编代码。我写了这样的东西:

pushq 0x1234567890123456 #It didn't work. 
pushq 0x12345678         #It worked.
我使用gcc-c来编译代码,第一行是error with
error:operation type与'push'
不匹配。但pushq意味着将64位的数据推入堆栈,十六进制数正好是64位


那么,为什么会发生此错误?

push没有在堆栈上推送64位立即数的表单。您可以在堆栈上推送一个32位值,并对其进行符号扩展。如果在堆栈上按0xFFFFFF,则64位值0xFFFFFFFFFFFF放置在堆栈上如果在堆栈上按0x1,则64位值0x1放置在堆栈上。如果要推送64位值,请将该值移动到64位寄存器中,然后推送堆栈上的64位寄存器。我还认为您打算将
$0x123456789012345656
$0x12345678
$
一起使用,因为您可能打算推送立即val,而不是内存操作数。我假设您使用的是AT&T语法,而不是Intel,因为您声称要传递给
gcc
的选项,实际上,我正在尝试将字符串指针推送到堆栈,我非常确定我的机器是Intel和64位的。那么,如果我想将64位地址推送到堆栈,我该怎么办呢?英特尔是处理器,但汇编程序必须使用两种不同的格式。一种是AT&T语法,另一种是Intel语法。GNU汇编程序(GCC的默认汇编程序后端)使用AT&T语法作为默认语法。在AT&T语法中,pushq 0x12345678将尝试读取内存地址0x12345678处的8个字节,并将这8个字节推送到堆栈中<另一方面,code>pushq$0x12345678会将32位(符号扩展到64位)立即数0x12345678推送到堆栈上,您可以将其用作指针。要将指针(64位立即数)推送到堆栈上,您必须使用类似于
movq$0x123456789012345656,%rax
push%rax