2011-03-13 58 views
2

好吧,我得到这个编译错误:帮助%ES寄存器用于x86到x86_64的汇编代码端口

Error: suffix or operands invalid for `push'

当我使用这条线:

pushw %es; 

我知道这是要么% es或w,因为我已经成功移植了64位汇编器的其他push,pop命令。

%es根据我发现的一些文档,是一个现有的注册,我认为没有引用不同。

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

感谢您的任何帮助。

+0

您打算如何使用段寄存器在64位模式?没有细分。 – 2011-03-14 16:57:25

回答

0

这是奔腾指令集吗?如果是这样,那么是的,我认为ES(大写)是一个16位段寄存器。该指令只是根据此网站“推送%ES”:http://faydoc.tripod.com/cpu/index.htm。 希望我可以帮到更多,但我只在MIPS组装中编码。

0

您正在使用指令PUSHW这是推动词堆叠。在64位计算机上,字的大小是64,并且您尝试使用错误的指令推送16位ES寄存器。

尽量使用push,但要注意您的流行音乐也是匹配的。

EDIT1:经过的processor documentation,分割是x86_64的

上述文献的检查section 4的64位模式下禁用。

64-bit mode, segmentation is disabled, creating a flat 64-bit virtual-address space. As will be seen, certain functions of some segment registers, particularly the system-segment registers, continue to be used in 64-bit mode.

再在section 4.5.3

DS, ES, and SS Registers in 64-Bit Mode. In 64-bit mode, the contents of the ES, DS, and SS segment registers are ignored. All fields (base, limit, and attribute) in the hidden portion of the segment registers are ignored.

因此,在你的代码只是忽略对这些寄存器的任何引用。

+0

试过这个,我仍然得到同样的问题。也许操作数,然后当我改变%es到ES它不会吐出一个错误,但我相信它不会再指额外的段寄存器。 – Edward 2011-03-13 14:59:19

+0

你可以把更详细的代码。 – Zimbabao 2011-03-13 15:05:11

+0

#define save_context()\ \t push%rbp; \ \t mov%rsp,%rbp; \ \t push%rdi; \ \t push%rsi; \ \t push%rbx; \ \t pushw%es; \ \t pushw%fs; \ – Edward 2011-03-13 16:04:10

2

由于津巴布亚已经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.