Справка по регистрации% es для порта с кодом сборки от x86 до x86_64 - PullRequest
2 голосов
/ 13 марта 2011

Хорошо, я получаю эту ошибку компиляции:

Ошибка: суффикс или операнды недействительны для `push '

когда я использую эту строку:

pushw %es; 

Я знаю, что это либо% es, либо w, поскольку я успешно переносил другие команды push, pop для 64-битного ассемблера.

%es является существующим регистром в соответствии с некоторыми документами, которые я нашел, и на которые нет ссылок по-другому, я думаю.

Так в чем может быть моя проблема? Я очень ржавый на своем асме, и я думаю, что это может быть w.

Спасибо за любую помощь.

Ответы [ 3 ]

2 голосов
/ 24 апреля 2012

Как уже объяснил Зимбабоа , в 64-битном режиме сегментация отсутствует.

Более того, если вы посмотрите руководства Intel, Ссылка на набор инструкций, MZ , вы увидите, что 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. 
0 голосов
/ 13 марта 2011

Вы используете инструкцию PUSHW, которая представляет собой push-слово в стек. На 64-битных машинах размер слова равен 64, и вы пытаетесь протолкнуть 16-битный регистр ES, используя неверную инструкцию.

Попробуйте просто использовать push, но позаботьтесь о том, чтобы ваш поп тоже совпадал.

Edit1: Проверено документация процессора , сегментация отключена в 64-битном режиме x86_64

Проверьте section 4 вышеуказанного документа.

64-битный режим, сегментация отключена, создается плоское 64-битное виртуальное адресное пространство. Как будет видно, некоторые функции некоторых сегментных регистров, в частности системные регистры сегментов, продолжают использоваться в 64-битном режиме.

Снова в section 4.5.3

DS, ES и SS регистры в 64-битном режиме. В 64-битном режиме содержимое регистров сегментов ES, DS и SS игнорируется. Все поля (база, лимит и атрибут) в скрытой части регистров сегмента игнорируются.

Так что в вашем коде просто безопасно игнорируйте любые ссылки на эти регистры.

0 голосов
/ 13 марта 2011

Это набор команд Pentium?Если так, то да, я думаю, что ES (с большой буквы) - это 16-битный сегментный регистр.Инструкция просто "push% ES" для этого сайта: http://faydoc.tripod.com/cpu/index.htm. Хотелось бы помочь больше, но я пишу код только в сборке MIPS.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...