Здравствуйте! Прошу здесь высказываться о том что Вы думаете о теме "Система команд x64", пожелания, исправления, замеченные ошибки буду переносить в тему
А зачем такое? Intel SDM разве недостаточно? Как вариант - не перечислять все команды, большинство из которых так или иначе очевидны (стандарная арифметико-логика, обычные ветвления по условиям), а рассмотреть всякие специфические, которые "не такие, как у всех".
Dmitry_Milk, Intel-талмудов достаточно в любом случае, я и постараюсь рассмотреть всякие специфические, которые "не такие, как у всех"
rmn, LEA EAX,[EBX] = MOV EAX,EBX а также сложение с imm и умножение на 2, 3, 4, 5, 8, 9. Правда, так как первоначальное назначение INC, DEC и LEA работа с адресами, эти команды не влияют на CF
Если б мнемоники x86 проектировали Zilog, у них наверное, на все про все была бы одна мнемоника LD Код (Text): LD EAX, EBX LD EAX, some_var ; занести адрес переменной some_var LD EAX, [some_var] ; а так - значение из переменной some_var LD EAX, some_array +EBX + ECX*4 ; адрес LD EAX, [some_array +EBX + ECX*4] ; значение
Для загрузки непосредственного значения в modrm тоже отдельный опкод, но мнемоника все равно MOV. Вот в i8080 на каждый разный чих (регистр-регистр, непосредственное в регистр, аккумулятор по прямому адресу, аккумулятор по адресу в регистровой паре, непосреднсвенное в рег.пару, рег.пара по прямому адресу) действительно была отдельная мнемоника. А Зилоги, когда позаимствовали иструкции из i8080 в z80, все это обозвали одной мнемоникой.
8B -> MOV r32,r/m32 B8+rd -> MOV r32, imm32 Ну и вообще, если откроешь, например, интеловскую документацию - там куча разных опкодов (то есть, это не r/m и не sib) на мнемонику MOV, как, впрочем, и на многие другие мнемоники. То есть, нельзя разносить MOV и LEA в разные категории инструкций только на основании того, что у них разные опкоды. Так они и в x86 в некоторых случаях прямо в опкоде 3 бита, вот, выше опкод B8+rd, по сути коды от B8 до BF. А в i8080 так было во всех инструкциях. Зилог вообще ничего не придумали - они прямо один к одному унаследовали в Z80 кодировку из i8080, просто расширив ее префикс-байтами, но при этом полностью перекроили мнемоники ассемблера, заменив все mov/mvi/sta/lda/stax/ldax/lxi/lhld/shld с разными опкодами одной мнемоникой ld.
В некоторых случаях lea оказывается проблемой. Так для pointer taint те наследовании указателей(pointer flow) необходима сложная обработка инструкции, тк после вычисления может образоваться не указатель