Набор команд и язык ассемблера одинаковы? - PullRequest
21 голосов
/ 21 марта 2011

Мне было интересно, если набор команд и язык ассемблера - это одно и то же?

Если нет, чем они отличаются и каковы их отношения?

Спасибо и всего наилучшего!

Ответы [ 7 ]

23 голосов
/ 22 марта 2011

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

Позвольте мне попробовать некоторые примеры, основанные на некоторых из вопросов, которые вы задаете. И я собираюсь прыгать с процессора на процессор с любым удобным для меня кодом.

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

0x5C0B

Язык ассемблера, будет

add r12,r11

Для этого конкретного процессора. В данном случае это означает, что r11 = r11 + r12. Поэтому я поместил этот текст, добавить r12, r11 в текстовый файл и использую ассемблер (программу, которая компилирует / ассемблирует язык ассемблера), чтобы собрать его в некоторый вид двоичного файла. Как и любой язык программирования, иногда вы создаете объектные файлы, а затем связываете их вместе, иногда вы можете перейти прямо к двоичному файлу. И есть много форм двоичных файлов, которые находятся в ascii и двоичных формах, и совсем другое обсуждение.

Теперь, что вы можете сделать в ассемблере, который не является частью набора команд? Чем они отличаются? Ну, для начала вы можете иметь макросы:

.macro add3 arg1, arg2, arg3

    add \arg1,\arg3
    add \arg2,\arg3

.endm


.text

   add3 r10,r11,r12

Макросы похожи на встроенные функции, они не являются вызываемыми функциями, а генерируют код в строке. Не отличается от макроса C, например. Таким образом, вы можете использовать их, чтобы сохранить некоторую типизацию, или вы можете использовать их, чтобы абстрагировать что-то, что вы хотите делать снова и снова, и хотите, чтобы способность изменялась в одном месте и не приходилось касаться каждого экземпляра. Приведенный выше пример по существу генерирует это:

add r10,r12
add r11,r12

Другим отличием между набором команд и языком ассемблера являются псевдоинструкции, например, для этого конкретного набора инструкций нет поп-инструкции для выталкивания вещей из стека, по крайней мере, не по этому имени, и я объясню почему. Но вам разрешено сохранять некоторые данные и использовать в своем коде всплывающее окно:

pop r12

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

mov @r1+,r12

и pop, и mov приводят к коду операции 0x413C.

Другой пример различий между набором команд и ассемблером, переключением наборов команд, выглядит примерно так:

ldr r0,=bob

Что для этого языка ассемблера означает загрузку адреса bob в регистр 0, для этого нет инструкции, что ассемблер делает с ним, генерирует что-то, что выглядело бы так, если бы вы писали его в ассемблере вручную:

ldr r0,ZZ123
...
ZZ123: .word bob

По существу, в доступном месте из этой инструкции, а не в пути выполнения, создается слово, которое компоновщик заполнит адресом для bob. Инструкция ldr, аналогично ассемблеру или компоновщику, будет закодирована с помощью ldr относительной инструкции pc.

Это приводит к целой категории различий между набором команд и языком ассемблера

call fun

Машинный код не может знать, что такое веселье и где его найти. Для этого набора команд с его многими режимами адресации (заметьте, я специально и намеренно избегаю называть наборы инструкций, которые я использую, поскольку это не имеет отношения к обсуждению), ассемблер или компоновщик в зависимости от обстоятельств (в зависимости от того, где заканчивается функция fun быть по отношению к этой инструкции).

Ассемблер может выбрать кодирование этой инструкции как относительного pc, если функция fun на 40 байт опережает инструкцию call, он может закодировать ее с помощью эквивалента call pc + 36 (снять четыре, потому что pc впереди одной инструкции во время выполнения, и это 4-байтовая инструкция).

Или ассемблер может не знать, где или что интересного, и оставить его на усмотрение компоновщика, и в этом случае компоновщик может указать абсолютный адрес функции, который будет похож на вызов # 0xD00D.

То же самое относится к нагрузкам и хранилищам, некоторые наборы команд имеют относительный ближний и дальний компьютер, некоторые имеют абсолютный адрес и т. Д. И вы можете не выбирать, вы можете просто сказать

mov bob,r1 

и ассемблерЛибо компоновщик, либо их комбинация позаботятся обо всем остальном.

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

В некоторых других случаях язык ассемблера может иметь несколько ярлыков:

hang: b hang
  b .
  b 2f
1:
  b 1b
  b 1f
1:
  b 1b
2:

Значение hang: b hang имеет смысл, переход к метке с именем hang.По сути, это ветвь для себя.И как следует из названия, это бесконечный цикл.Но для этого языка ассемблера b.означает переход к себе, бесконечный цикл, но мне не нужно было изобретать ярлык, печатать его и переходить к нему.Другой ярлык использует числа b 1b означает переход к 1 назад, ассемблер ищет метку № 1 позади или над инструкцией.B 1f, который не является ветвью для себя, означает ветвь 1 вперед, это совершенно правильный код для этого ассемблера.Он будет смотреть вперед или ниже строки кода для метки № 1: и вы можете повторно использовать цифру 1 как сумасшедший в своей программе на ассемблере для этого ассемблера, что избавляет от необходимости изобретать имена меток для простых коротких ветвей.Второй b 1b ответвляется на второй 1. и является ответвлением для себя.

Важно понимать, что компания, создавшая процессор, определяет набор команд, а также машинный код или коды операций или любой другой термин, который ониили вы используете для битов и байтов процессор декодирует и выполняет.Очень часто эта компания выпускает документ с языком ассемблера для этих инструкций, синтаксис.Часто эта компания выпускает программу на ассемблере для компиляции / сборки этого языка ассемблера ... с использованием этого синтаксиса.Но это не означает, что любой другой человек на планете, который решит написать ассемблер для этого набора команд, должен использовать этот синтаксис.Это очень очевидно с набором инструкций x86.Точно так же любые инструкции psuedo, такие как pop up, или синтаксис макросов, или другие сокращения, такие как b 1b, должны выполняться от одного ассемблера к другому.И очень часто это не так, вы видите это с ARM, например, универсальный символ комментария;не работает с ассемблером GNU, вы должны использовать вместо @.Ассемблер ARM использует;(обратите внимание, я пишу свой ассемблер с помощью; @, чтобы сделать его переносимым).С инструментами gnu это становится еще хуже, например, вы можете поместить в язык ассемблера такие вещи, как #define и / * comment * /, и использовать компилятор C вместо ассемблера, и это будет работать.Я предпочитаю оставаться настолько чистым, насколько это возможно для максимальной мобильности, но, естественно, вы можете использовать любые функции, которые предлагает инструмент.

8 голосов
/ 21 марта 2011

Инструкция set состоит из всех инструкций, которые может выполнить процессор, в то время как ассемблер - это язык программирования , который использует эти инструкции для создания программ.
Другими словами, набор инструкций - это просто группа байтов, которые процессор может понять, но вы не можете ничего с ними сделать полезного (представьте инструкции как буквы алфавита), в то время как ассемблер - это язык, который позволяет вам комбинировать эти инструкции. (или буквы) для создания программы (что-то вроде речи).

2 голосов
/ 12 января 2017

Компьютер (точнее процессор) может выполнять только вычисления, т. Е. Выполнять арифметические и логические операции.

Одна арифметическая или логическая операция называется инструкция .

Набор всех инструкций называется набор инструкций этого компьютера (точнеепроцессор).

Набор команд либо встроен в процессор, либо реализован с использованием метода, называемого микрокод .

. Программирование компьютера возможно только при наличииязык, то есть то, что он понимает.Двоичный код не является языком компьютера.Набор команд на основе двоичного кода - это компьютерный язык.

Язык - это не что иное, как спецификация на бумаге .Первым языком, разработанным на бумаге, был машинный язык.Его реализация в компьютере была возможна только через аппаратное обеспечение (или новейшую технику микрокода).Эта реализация называется набором команд.Все остальные языки будут разработаны поверх машинного языка.

С машинным языком было трудно работать, так как мы в основном работаем с алфавитами в повседневной жизни.Поэтому было решено ввести мнемонический язык, называемый ассемблер, поверх машинного языка.Реализация языка ассемблера была названа Assembler.

[Вы можете задаться вопросом, как был написан первый ассемблер.Первый ассемблер может или не может быть написан на машинном языке.Я не упоминаю концепцию начальной загрузки здесь для простоты]

РЕЗЮМЕ:

Язык ассемблера преобразуется в набор команд, собранный Ассемблером.И то, и другое - разные стороны медали со слоем абстракции или мнемонического кода между ними.Машинный язык - это «битовая кодировка» набора команд процессора.Язык ассемблера - это «символическая кодировка» набора команд процессора.

2 голосов
/ 21 марта 2011

Язык ассемблера - это больше, чем просто расширенный набор команд: это способ генерации объектных файлов, символов, отладочной информации, связей, а также минимальное структурированное программирование даже на этом уровне.(В некоторой степени опираясь на другие ответы / комментарии здесь)

  • Расположение файла объекта.Например, разделы: код, данные, только для чтения, отладка, динамическое связывание.Общая директива org сообщает ассемблеру расположение инструкций / данных.
  • Предварительная обработка.Это включает макросы (встроенное расширение, повторение) и иногда структурированное программирование (структура структуры, определение псевдонимов для регистров).
  • Определение данных.Либо включая оптовые файлы, либо определяя байты / слова за раз, например ".byte", ".word", ".dw" в зависимости от вашей архитектуры.

Большинство компиляторов C генерируют сборку, котораязатем передается ассемблеру для создания объектных файлов.Если вы посмотрите на вывод gcc при запуске с флагом '-S', вы увидите, что большинство вышеперечисленного используется.Если у вас включена отладка (-g) и динамическое связывание (по умолчанию в наши дни), вы увидите огромное количество сборок, не посвященных просто инструкциям.

2 голосов
/ 21 марта 2011

Язык ассемблера будет включать мнемонику для инструкций, но обычно добавляет немного больше, например:

  1. макросы
  2. какой-то способ определения данных
  3. способы определения имен (например, для функций)

Редактировать: Инструкция (сама по себе) будет закодирована в двоичном виде, чтобы процессор мог ее прочитать. Мнемоника это название для инструкции. Например, на языке ассемблера я мог бы написать «mov ax, 1». Соответствующая инструкция для этого (в случае x86) будет закодирована как B8 00000001 (в шестнадцатеричном формате).

Определение данных, макросов, имен для функций и т. Д. Не является действительными инструкциями. Макрос (очень похожий на макрос в C и т. Д.) Позволяет вам определять имена в процессе сборки. Это может (часто будет) приводить к генерации некоторых инструкций, но они отделены от самого определения макроса. Так же, как в C, когда вы определяете некоторые данные, которые обычно приводят к записи в объектном файле с указанием некоторого пространства для имени X, но не генерируют напрямую никаких инструкций.

1 голос
/ 13 мая 2015

Все в многоуровневой архитектуре с "Строгим (в большинстве случаев) и четко определенными интерфейсами" .

Начните с аппаратного обеспечения

  1. Есть много слоев, пока вы не дойдете до процессора.

    Уровень Я имею в виду, что мы начинаем с "физики-> устройств (электроника) -> Аналоговый (Усилитель) -> Вентили-> Цифровые схемы-> Микро-архитектура-> Архитектура (ISA, Процессор)

  2. Но начинается с процессора, он состоит из двух частей (как большинство встроенныхсистемы имеют.): Аппаратное и программное обеспечение.
  3. Программная часть, которая называется ISA (Архитектура набора команд)

    В ней есть все инструкции, которые может поддерживать уважаемый процессор. Это означает, что ISAпривязан только к одному процессору (например, аппаратное обеспечение типа x86).
    Важно то, почему требуется этот ISA? То же, что я уже говорил ранее, это строгий и четко определенный интерфейс. Процессор не может выполнять никакие инструкции, кроме ISA [Строгое]

    Но Любой, кто хочет использовать этот процессор, может использовать эти команды от ISA для выполнения своей работы. [Хорошо определенный интерфейс]

Теперь перейдем к Assembly, C, Assembler, Compiler ....

  • Многоуровневая архитектура, вы знаете, мы используем ее (Layered Arch) в аппаратном обеспечении для реализации одного процессора для вас

    Вы можете узнать больше о том, почему эта многоуровневая архитектура.Это позволяет легко справиться с большой проблемой шаг за шагом.

  • То же самое, что мы хотим?что наша цель?

    Мы хотим, чтобы пользователь мог легко использовать этот процессор.Здесь пользователь программист .

  • Теперь посмотрите на трудности для программиста.

    Может ли программист запомнить все инструкции для процессора в двоичном формате.И в следующем приложении процессор может измениться с Intel на IBM (теперь не для конкретной версии).

    • Так что здесь у нас также есть многоуровневая архитектура [не исправлена].
    • 1) Ассемблер - Компилятор
    • 2) Ассемблер

Ассемблер также является слоем, который он имеет - два интерфейса.То же самое с компилятором.

Пример: Вы пишете код на языке C. Процессор не может понять этот код.Он понимает все, что написано в двоичном формате и определяется инструкцией, данной в ISA.Но трудно написать (сохранить | изменить) программу в инструкции в ISA.

1) Итак, Пользователь пишет код на C. Этот код понимает C-компилятор.Поскольку пользователь ограничен использованием только синтаксиса, заданного в C. Это означает, что C-компилятор предоставляет стандартный и четко определенный интерфейс для пользователя на одном конце.На другом и можно использовать непосредственно инструкцию ISA или другой интерфейс под названием «Ассемблер».

2) Теперь, если вы используете Ассемблер, тогда Компилятор переведет весь C-код в синтаксис, заданный Ассемблером.И синтаксис, который Ассемблер предоставляет компилятору, называется ассемблером.Это также хорошо определенный интерфейс, и любой может использовать его для программирования на языке ассемблера.А на другом конце Ассемблер преобразует весь свой синтаксис (Mnemonics | Директивы, которых нет в ISA) в инструкции двоичного кода в ISA.

Вот несколько примеров этого перевода.

  • В C = hello.c
  • В коде сборки = hello.s
  • В объектном коде = hello.obj (Нет привязки выполнено: дополнительная информация)

В этом файле одна строка "Machine: Advanced Micro Devices X86-64" , которая предоставляет информацию о процессоре, соответственно, мы используем ISA и ассемблер.И программист на Си не знает об этом, он может свободно программировать на C. Это является преимуществом «Хорошо определенный интерфейс».

  • InМашинный код = hello.binary (после связывания: дополнительная информация)

для сравнения Просто посмотрите

  • hello.c (программа на C)

  • hello.asm2bin (таблица объектных файлов: мнемоника и двоичные инструкции прямого сопоставления)

  • hello.asm2bin_exe (таблица двоичных файлов: дополнительные сопоставления после компоновки)

    В этих файлах вы увидите одну строку "Разборка секции .." Поскольку ассемблер делает: он собирает инструкцию ISA (битовый шаблон) из языка ассемблера, поэтому здесь мы видим сначала инструкцию ISA, а затем разборку до мнемоники.

Все файлы находятся по этой ссылке [Скачать и открыть]

https://www.dropbox.com/sh/v2moak4ztvs5vb7/AABRTxl7KQlqU2EkkMkKssqYa?dl=0

  • В Linux Вы можете использовать vim, emacs, чтобы открыть эти файлы.
  • В Windows просто используйте vim или используйте «Открыть-> Выбрать программу из .....» после щелчка правой кнопкой мыши по файлу и выбора текстового редактора на ваш выбор.
1 голос
/ 21 марта 2011

Когда вы заглядываете в статью Википедии о языке ассемблера , на которую вы ссылались в своем вопросе, ниже приведен пример, показывающий инструкции на языке ассемблера и соответствующий объектный код.Оба являются разными представлениями одного и того же: инструкции из набора команд процессора.Но только столбец с заголовком «Инструкция (синтаксис AT & T)» содержит язык ассемблера.

Надеюсь, это прояснит ситуацию.

...