2011-03-13 31 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.