Машинная команда, инструкция, команда Ассемблера – что это?

Тема в разделе "WASM.ASSEMBLER", создана пользователем Bitfry, 20 июн 2005.

  1. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    Я везде (рассылки, учебники, форумы) встречаю ошибки и запутки в этих понятиях.

    Буду очень признателен, если вы мне поможете разобраться.



    <ol type=1>1 Машинный код

    2 Машинная команда

    3 Инструкция процессора

    4 Команда Ассемблера

    5 И отдельно Код операции</ol>



    Я предполагаю так:

    4. Команда Ассемблера - это символьное представление инструкции процессора.



    3. Инструкция процессора включает в себя:

    мнемонику команды операнд1,операнд2



    То есть нельзя называть mov командой Ассемблера, не подразумевая операнды при ней!

    И ещё, инструкция процессора может представляться разными машинными командами? Например:
    Код (Text):
    1. 00000000: 50      push  ax
    2. 00000001: FFF0    push  ax
    3.  
    4. 00000003: 40      inc   ax
    5. 00000004: FFC0    inc   ax
    6.  
    7. 00000006: E94700  jmp   000000050  ---X
    8. 00000009: EB45    jmps  000000050  ---X
    9.  
    10. 0000000B: CC      int 3
    11. 0000000C: CD03    int   003






    Всё это ЧЕТЫРЕ ПАРЫ инструкций процессора (а символьном виде команды Ассемблера)?

    2. Но всё это 8 РАЗНЫХ машинных команд?



    1. Машинный же код - это совокупность нескольких команд и ?????? (может быть данные тоже входят в машкод?).



    5. А опкод - это вообще более узкое понятие (которое я сам путал с байтами команд).

    Код операции является ОБЯЗАТЕЛЬНОЙ составляющей частью МАШИННОЙ КОМАНДЫ?

    И таких составляющих частей у неё МОЖЕТ БЫТЬ столько:



    префикс | опкод | постбайт | sib-байт | поля смещения | непосредственный операнд.



    Если я где-то запутался, пожалуйста, направьте меня читать что-то конкретное (пример: дока Интел N такой-то, стр. такая-то или учебник...,глава...).

    Если возможно объясните здесь, только если вы уверенны в своих представлениях.



    ЗЫ я сознательно запостил сюда чтобы тема была в поиске, многие новички путаются.

    ЗЫ2 закладка FAQ сверху сейчас не работает.
     
  2. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    >1 Машинный код

    Это последовательность >2 Машинных команд или тоже самое >3 Инструкций процессора

    >5 И отдельно Код операции

    Это несколько бит в Машинной команде (которая может состоять из 1 или нескольких байт).

    >4 Команда Ассемблера

    Запись машинной команды не последовательностью байт, а мнемоникой (сокращениями слов)

    Пример:

    mov ecx, 12345h - Команда Ассемблера

    ее Машинная команда

    B9 45 23 01 00

    байты 45, 23, 01, 00 - это число 12345h, байт B9 - здесь записан код операции и регистр, подробней см. описание полей команд.
     
  3. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    1.Машинный код

    Это последовательность машинных команд или инструкций процессора.

    2.Машинная команда.

    Это последовательность из одного или нескольких байт, которую процессор разпознаёт как одну команду.

    3.Инструкция процессора.

    Тоже самое, что и 2.

    4.Команда ассемблера.

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

    5.Код операции.

    Это байт, однозначно определяющий команду процессора. Иногда код операции состоит из 2 байт, тогда 1 байт равен 0Fh.
     
  4. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    Забыл сказать, что речь идёт о IA-32!



    Таким образом:

    Никакого рода данные (кроме непосредственных операндов в команде) машинным кодом назвать нельзя?

    То есть не всё что поступает в процессор, есть машинный код?



    Машинная команда = инструкция процессора?

    Тогда FFF0 и 50 – это байты разных инструкций процессора, но одной и той же команды Асма?





    Где смотреть?

    У Юрова я читал – не понял.

    Его учебник, второе издание, 59 стр., он пишет:

    "Значение 8B – код операции…

    Значение поля с кодом операции – B9."

    Значит, весь байт B9 нужно называть код операции?

    И дальше он же пишет:

    "Код операции может занимать от одного(!) до трёх байт. Для некоторых команд часть битов кода операции может находиться в постбайте..."

    Врёт либо он, либо ты... Либо я не понял кого-то из вас. :)



    В Intel, не нашел я этого, кто знает где у них поля расписаны?

    Питер Абель – Врёт.



    Где подробно расписаны эти категории?

    Только не в туторах каких-нибудь, а в "проверенных" источниках.



    R_NEW





    Это, похоже, враньё (смотри код который я показал).



    Какая команда имеет три операнда?





    Или из трёх байт... И вообще нет такого термина "команда процессора" у Интел, по крайней мере, нет.



    ЗЫ Я понимаю, что это всего лишь терминология, но мне хотелось бы стать грамотным в этом вопросе. Кроме того, я пишу свои уроки.
     
  5. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Код операции может быть и более 2х байт, притом могут играть роль префиксы, +поле opcode extension, +для некоторых команд имеет значение поле mod.
     
  6. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    1)Префиксы в код операции не входят.

    2)Например: imul eax,ebx,3
     
  7. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Машинный код - это скорее исторический термин. Когда-то проги набивали восьмеричными/шестнадцатеричными цифрами (разницы между командами и данными для оператора не было) - это и называлось программировать в машкодах.



    Команда ассемблера - здесь путанница. Прежде всего, Ассемблер - это программа, собирающая бинарник из понятного человеку текста. Т.о. команда ассемблера - команда для этой программы. Что бы не развивать путанницу, правильнее это назвать директивой (пример директивы для masm - .model flat,stdcall).



    mov ecx, 12345h - это (мнемоническая) инструкция. mov - мнемоника инструкции, ecx и 12345h - операнды (аргументы) инструкции.



    С кодами операций (опкодами) и префиксами тоже путаница. На IA-32 размер опкода может быть не кратен байту! Так же, Книга Двойных Слов говорит, что префикс - это часть опкода:

     
  8. SeDoY

    SeDoY New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2003
    Сообщения:
    31
    Адрес:
    Russia
    Bitfry



    Почитай посты Свина, поиграйся с его "обучалками", просветление должно наступить :)



    ЗЫ я здесь ничего писать (пока) не буду, свои мысли тебе письмом пошлю ;)
     
  9. R_NEW

    R_NEW New Member

    Публикаций:
    0
    Регистрация:
    6 май 2005
    Сообщения:
    86
    Адрес:
    Россия
    jmp и jmps - это разные команды. 0CCh и 0CD03h - это тоже разные команды.

    40h и 0FFC0 - это хоть и одинаковые команды, но хороший компилер должен inc ax компилировать в 40h, так как размер кода получается меньше.

    Аналогично 50h и 0FFF0h.

    P.S Хотя может я и не прав :dntknw:
     
  10. yureckor

    yureckor New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    494
    Адрес:
    Russia
    Bitfry>То есть не всё что поступает в процессор, есть машинный код?

    Вообще то в процессор поступают "непосредственно команды" и данные, а все вместе это называют машинная команда или инструкция процессора, т.к. она не отделима от данных.

    Тут пробел в терминологии наверно.



    >Значение поля с кодом операции – B9." Значит, весь байт B9 нужно называть код операции?

    Ты сам себя не слушаешь :)

    посмотри в дизасме машкод

    mov eax, 12345h

    mov ebx, 12345h

    mov ecx, 12345h

    mov edx, 12345h

    mov esi, 12345h

    mov edi, 12345h

    mov esp, 12345h

    и увидишь, что первый байт "непосредственно команды" отличается только тремя младшими битами. Эти биты определяют пераметр (регистр в данном случае) Кода операции. А сам код операции это старшие 2 бита (%10xxxxxx), а другие биты тоже отвечает за некоторые параметры (способ адресации, регистр или память).
     
  11. Bitfry

    Bitfry New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2004
    Сообщения:
    54
    Адрес:
    Россия, Санкт-Петербург
    S_T_A_S_



    Стас, я надеюсь, ты понимаешь, что слово _Ассемблер_ (с большой буквы) мы воспринимаем как язык программирования.

    А программу-ассемблер (через дефис, так же, как и программа-компилятор) мы можем сократить до слова _ассемблер_ с маленькой буквы.

    Если ты не согласен, то получается, что этот сайт назван в честь программы?

    Любой язык имеет свой синтаксис. И у нас есть тонкости перевода. Английский <> русский, машинный <> символьный.

    Вот о чём я здесь и спрашиваю. Если не разобраться в основополагающих терминах, будет очень трудно структурировать знания в голове.



    Я не видел учебников, которые не разделяли бы понятия _директива_ и _команда Ассемблера_. И тут я согласен с учебниками, потому что словарное значение директивы – это направление. Команда же – это приказ. Кроме того, слово _команда_ чаще всего приравнивают к инструкции процессора или максимально приближают к этому. Так всё-таки логичнее.

    Директива никогда не представляет инструкции(ю) процессора (та же .model или .data). То, что переводится в совокупность инструкций или инструкцию, чаще всего называют макрокомандой (пример: invoke).

    Насчёт Книги Двойных Слов. Какой номер (и том)? Не могу найти у себя, а на intel.com хрен найдёшь по словам внутренности документа.



    R_NEW



    На компиляторы ссылаться не стоит, в них правды нет, даже близко. Из-за такого подхода появляются фокусы вроде "int3 в два байта и SoftIce".

    Как я уже сказал, jmp и jmps мы подразумеваем с операндами. С данными операндами действие у этих двух записей будет одинаковое. Я склоняюсь к тому, что это одна команда Ассемблера.

    Hiew выделяет её разными мнемониками, что есть полезное уточнение в рамках одной команды Ассемблера.





    yureckor





    66678B03 или 8B03 mov dword ptr EAX,[EBX] - это инструкция процессора (или маш.команда)?

    В процессор отправляются байты, указанные здесь, и ещё процессор "забирает" данные - те, что указаны регистром EBX.

    Те данные входят в понятие машинный код, но не входят в машинную команду? ...

    Хотя тут я скорее соглашусь со Стасом. Машинный код – это исторический термин, и к IA его прикладывать необязательно.

    А вот что включает в себя машинная команда, хорошо бы определить.





    SeDoY



    The Sivn'a я нашёл, ну и напостил же он. :)

    Пролистал так по-быстрому, всё интересно, теперь читать придется... И думать :).
     
  12. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Есть четкое различие между директивами и командами ассемблера. Это совершенно разные вещи. Ты бы ещё макросы сюда приплел. Разделять понятия 'директива' и 'команда' ассемблера необходимо.



    Всё это недопонимание из-за того, что нормальных современных книжек по ассемблеру сейчас нет. Не хотят новички читать нормальные Книги по Ассемблеру, таких авторов как: П.Абель, П.Нортон, Финогенов, Григорьев, Фроловы, +ещё несколько начала 90-х.

    Такими темпами через лет 10 останутся только пишушие на макросах масма ламеры, чистый код вымрет, всё будет делатся как папа-микрософт скажет, и боже упаси железо напрямую программировать.
     
  13. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    Bitfry >




    2й том - 25366615.pdf и 25366715.pdf здесь





    _BC_ >




    Угу. А в продвинутых ассемблерах (fasm) необходимо ещё и разделять директивы препроцессора, ассемблера и форматтера :)



    >




    Да, давно пора на fasm переходить :) Там такие макросы !!! особенно в последних версиях :)
     
  14. SeDoY

    SeDoY New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2003
    Сообщения:
    31
    Адрес:
    Russia
    [оффтоп]







    А он что сказал? Читать надо внимательнее ;)



    А то что ты написал, это похоже на ворчание старика (точнее, на ворчание молодого, изображающего из себя старика). Стоящиие книги будут читать всегда (Кнут, Ахо, Уорен и т.д.), а раз книги эти не читают, значит они того не стоят, либо их можно заменить чем-то другим.







    А если на макросах ФАСМа? =)



    Не буду углубляться в оффтоп... =)

    [оффтоп]
     
  15. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    S_T_A_S_





    Это не флеймовый топик, не надо передергивать мои слова.





    SeDoY





    Читать внимательно надо тем, кто задает нелепые вопросы, которых бы не возникало при чтении 'нормальных', правильных книжек.







    Значит, раз того же Григорьева никто не читает, значит это -- г#вно? Или его можно заменить (новичку!) интеловскими даташитами?



    О, сразу зашевелились любители мелкософта. Под макросами я не имел в виду классические макросредства MASM/TASM, а подразумевал псевдо-ЯВУ макросы масма32 (и теперь фасма). Обычные макросы я и сам использую, если считаю полезным.
     
  16. SeDoY

    SeDoY New Member

    Публикаций:
    0
    Регистрация:
    14 дек 2003
    Сообщения:
    31
    Адрес:
    Russia
    Да бы не засорять сей топик всякими измышлизмами...



    _BC_

    Хочеться почитать нотации "маленьким" (насколько мне известно, битфрай постарше тебя годика на 4)? продолжай писать в теме "про жизнь". А в этом топике, предлагаю прекратить припенания, ибо ты прав топик не флеймовый.
     
  17. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759




    Через чуть более года мой ассемблерный стаж составит 10 лет. Было бы интересно узнать, сколько лет ТЫ занимаешься ассемблером, что указываешь куда мне писать, а куда нет. Не будем разводить флейм, просто упомяни в сообщении как-нибудь.
     
  18. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    _BC_ >




    Судя по всему, ты просто не знаком с fasm, потому что мои слова - это просто констатация фактов о нём :derisive: Что бы пользоваться макровозможностями fasm, нужно хорошо представлять, не какой стадии компиляции выполняется та или иная директива.



    >




    Да, ты действительно совершенно не знаешь fasm. В нём _нет_ псевдо-ЯВУ _совсем_. Этот факт признаёт даже самый яростный защитник чистоты ассемблера Betov.
     
  19. _BC_

    _BC_ БЦ

    Публикаций:
    0
    Регистрация:
    20 янв 2005
    Сообщения:
    759
    С чего ты взял? fasm - один из лучших ассемблеров, дело не этом. Моя мысль про макросы относится к HLL-макросам, которые насколько я помню мелкософт в масме ввел. От этих .if, .while, и тд, имхо только вред начинающим. Ой! я опять навязываю своё мнение? Ха.
     
  20. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    От этих .if, .while, и тд не только вред начинающим, но и результирующий код зачастую получается больше, чем после msvc :-( Они и мне когда-то довольно большой вред принесли, хорошо, что я своевременно это понял :)