Assembly 汇编代码指令;pushq";无法将64位的内容推入堆栈?
我正在学习Linux x64上的汇编代码。我写了这样的东西: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位立即数的表单。您可以在堆栈上推送一个
pushq 0x1234567890123456 #It didn't work.
pushq 0x12345678 #It worked.
我使用gcc-c来编译代码,第一行是error witherror: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