Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Ошибка компиляции ассемблерной вставки


Автор: drkot 9.12.2012, 22:09
[dcc64 Error]: E2116 Invalid combination of opcode and operands
на строку
Код

   PUSH    EBX


Насколько понимаю в x64 какойто другой ассемблер.
Что не так? Где почитать? 

Автор: Illusion Dolphin 9.12.2012, 23:32
Про регистры http://msdn.microsoft.com/ru-ru/library/windows/hardware/ff561499%28v=vs.85%29.aspx

EBX - 32
RBX - 64:
Код

  PUSH    RBX


Автор: drkot 10.12.2012, 00:45
Спасибо

Автор: northener 10.12.2012, 01:33
Цитата(Illusion Dolphin @  9.12.2012,  23:32 Найти цитируемый пост)
Про регистры тут

О как!
Компилятор 32-х битной Дельфи позволял использовать во встроенном ассемблере в инструкциях PUSH/POP 16-ти разрядные регистры, но не позволял использовать 8-ми разрядные.
Теперь значит компилятор 64-х битной Дельфи позволяет использовать только 64-х разрядные регистры и никак иначе?
:(
Приму к сведению.

Автор: drkot 30.12.2012, 16:35
регистры можно использовать любые
но пуш работает с целыми регистрами

Автор: Чучмек 30.12.2012, 17:47
Цитата(drkot @  30.12.2012,  16:35 Найти цитируемый пост)
но пуш работает с целыми регистрами

вранье. В дизассемблере видел push ebx для 64битного кода. Это просто делфа не компилит.

Автор: drkot 30.12.2012, 18:59
если не сложно покажи машинные коды для х64
push ebx
push rbx

а то сколько компиляторов столько и мнений

Автор: drkot 30.12.2012, 19:22
x64

Test.pas.37: PUSH    BX
00000000006963C0 6653             push bx
Test.pas.38: PUSH    RBX
00000000006963C2 53               push rbx
Test.pas.39: POP     RBX
00000000006963C3 5B               pop rbx
Test.pas.40: POP     BX
00000000006963C4 665B             pop bx
Test.pas.41: end;
00000000006963C6 C3               ret


http://books.google.com.ua/books?id=c3SlgrqMid4C&pg=PA308&dq=push+64&hl=ru&sa=X&ei=wmXgUNyqF4b24QSZ-4CACA&ved=0CDgQ6AEwAA#v=onepage&q=push&f=false

Автор: Чучмек 30.12.2012, 21:06
Сейчас нет под рукой x64.
Через останов и Ctrl+Alt+C по F7 зайди в api-шную  функцию.В LoadLiabraryW  например.

Автор: Illusion Dolphin 30.12.2012, 21:12
Цитата

Через останов и Ctrl+Alt+C по F7 зайди в api-шную  функцию.В LoadLiabraryW  например.


:000007FEFDE3B7B0 ; C:\Windows\system32\KERNELBASE.dll

Код

000007FEFDE3B7B0 FFF3             push ebx  <-- вот оно :) 
000007FEFDE3B7B2 4883EC60         sub rsp,$60
000007FEFDE3B7B6 418BD8           mov ebx,r8d
000007FEFDE3B7B9 4885C9           test rcx,rcx
000007FEFDE3B7BC 7512             jnz $000007fefde3b7d0
000007FEFDE3B7BE B90D0000C0       mov ecx,$c000000d
000007FEFDE3B7C3 E8F85BFFFF       call $000007fefde313c0
000007FEFDE3B7C8 33C0             xor eax,eax
000007FEFDE3B7CA 4883C460         add rsp,$60
000007FEFDE3B7CE 5B               pop rbx
000007FEFDE3B7CF C3               ret

Автор: Чучмек 31.12.2012, 01:24
push ebp  - FFF5
Сейчас посмотрел как работает - идентично push rbp
В чем прикол, не знаю. 
Баг в делфе.
Еще один баг - push (64битная константа).
Компилится как push (младшие 32 разряда) + db (старшие разряды) :(


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)