帮助%es注册x86到x86_64汇编代码端口

时间:2011-03-13 12:25:02

标签: linux gcc assembly

好的,我收到了这个编译错误:

  

错误:对于“push”

,后缀或操作数无效

当我使用这一行时:

pushw %es; 

我知道它是%es或w,因为我已成功移植其他推送,弹出命令为64位汇编程序。

%es是根据我发现的某个文档而存在的寄存器,我认为其参考不同。

那么我的问题可能是什么?我的asm非常生疏,我认为它可能是w。

感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

由于Zimbaboa已经explained,因此在64位模式下没有分段。

此外,如果您查看英特尔的手册Instruction Set Reference, M-Z,您会看到push ES在64位模式下完全无效指令(第423页):

Opcode  Instruction  Op/  64-Bit  Compat/  Description
                     En   Mode    Leg Mode
...
0E      PUSH CS      NP   Invalid Valid    Push CS. 
16      PUSH SS      NP   Invalid Valid    Push SS. 
1E      PUSH DS      NP   Invalid Valid    Push DS. 
06      PUSH ES      NP   Invalid Valid    Push ES. 
0F A0   PUSH FS      NP   Valid   Valid    Push FS. 
0F A8   PUSH GS      NP   Valid   Valid    Push GS. 

答案 1 :(得分:0)

这是奔腾指令集吗?如果是,那么是的,我认为ES(大写)是一个16位段寄存器。根据此站点,该指令只是“push%ES”:http://faydoc.tripod.com/cpu/index.htm。 希望我能提供更多帮助,但我只在MIPS汇编中编码。

答案 2 :(得分:0)

您正在使用指令PUSHW这是推送字堆叠。在64位机器上,wordsize为64,你试图用错误的指令推送16位ES寄存器。

尝试使用push,但请注意您的pop也匹配。

修改1:检查processor documentation,在x86_64的64位模式下禁用细分

检查上述文件的section 4

  

64位模式,禁用分段,创建平坦的64位虚拟地址空间。可以看出,某些段寄存器的某些功能,特别是系统段寄存器,继续在64位模式下使用。

再次在section 4.5.3

  

64位模式下的DS,ES和SS寄存器。在64位模式下,ES,DS和SS段寄存器的内容将被忽略。段寄存器的隐藏部分中的所有字段(基数,限制和属性)都将被忽略。

因此,在您的代码中,只需安全地忽略对这些寄存器的任何引用。