Какая связь между языком ассемблера и машинным языком? - PullRequest
28 голосов
/ 10 августа 2009

Являются ли ассемблер и машинный язык (для одной базовой системы) действительно одинаковыми? Есть ли различия между этими двумя понятиями?

Ответы [ 9 ]

39 голосов
/ 10 августа 2009

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

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

17 голосов
/ 10 августа 2009

Машинный язык - это «битовая кодировка» кодов операций процессора.

Язык ассемблера - это "символическая кодировка" кодов операций процессора.

Так, например, Символически:

loop:  dec R1    # Decrement register R1
       bnq loop  # Branch if not equal to zero to
                 # address "loop"

Становится битовой кодировкой:

# Mythical CPU Machine code 4 bits operation,
#                           4 bit "option"
       0x41      # 4 is a "dec" and represents r1;
       0x7E      # 7 is bnq and E means PC -2;

Как правило, это отношение один к одному, однако некоторые языки ассемблера будут иметь дополнительные инструкции по сборке, которые сопоставляются либо с несколькими инструкциями машинного кода, либо повторно используют другой код операции. Например, использование машинного кода «xor R1, R1» в качестве «clr R1» или что-то очень похожее.

Кроме того, языки ассемблера будут склонны поддерживать «макропрограммирование», которое в 80-х годах, когда ассемблер широко использовался, придало исходному коду более «высокий уровень». Я лично написал макросы сборки, которые выглядели как «plot x, y» и «Hex Val», чтобы упростить общие операции.

Например:

# Mythically CPU Macro
.macro spinSleep x,y
            ld #x,y
localLoop:  dec y
            brq localLoop
.endmacro
# Macro invocation
            spinSleep 100,R1
# Macro expantion
            ld #100,R1
localLoopM: dec R1
            brq localLoopM   # localLoopM is "Mangled" for localization.
7 голосов
/ 14 мая 2011

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

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

Язык ассемблера более человечный удобочитаемый вид машинного языка. Вместо того, чтобы представлять машину язык как цифры, инструкция и регистры даны имена (обычно сокращенные слова или мнемоника, например, ld означает «нагрузка»). В отличие от язык высокого уровня, ассемблер очень близко к машинному языку. Основные абстракции (кроме мнемоника) использование меток вместо фиксированных адресов памяти, и Комментарии.

Программа на ассемблере (т.е. текстовый файл) переводится на машину язык ассемблером. дизассемблер выполняет обратное функция (хотя комментарии и названия ярлыков были отбрасывается в процессе ассемблера).

Источник: В чем разница между машинным языком и языком ассемблера?

5 голосов
/ 10 августа 2009

В ассемблере инструкции представляют собой более понятное представление инструкций процессора.

Но ассемблер также упрощает, например, адресацию:

  • На машинном языке вы должны знать расстояние (в адресном пространстве) между тем, где вы находитесь и куда вы хотите перейти к
  • На языке ассемблера вы называете один адрес «iWantToJumpHere», а затем можете говорить «jump iWantToJumpHere»

Это значительно упрощает поддержку сборки, особенно при изменении расстояния между адресами.

1 голос
/ 30 апреля 2013

машинный язык - это то, что понимает чип Сборка - это то, что вы понимаете

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

 machine code bytes |   x86 assembly language
8D B0 00 36 65 C4    lea    esi, [eax - 1000000000]     
BB 00 FC FF FF       mov    ebx, -1024
43                   inc    ebx
41                   inc    eax
3B CA                cmp    ecx,edx
C3                   ret

C5 F5 72 D2 01       vpsrld ymm1,ymm2,0x1        ; AVX2
C5 F5 D4 6D 88       vpaddq ymm5,ymm1,YMMWORD PTR [ebp-0x78]
C5 CD D4 AD 68 ff ff ff vpaddq ymm5,ymm6,YMMWORD PTR [ebp-0x98]
0 голосов
/ 05 августа 2018

Язык ассемблера сначала конвертируется в машинный язык ассемблером. который хранится в памяти (RAM), процессор / чашка извлекает его и сохраняет в памяти для регистрации и следования инструкциям, установленным один за другим.

0 голосов
/ 03 ноября 2017

Машинный язык:

  1. Это язык программирования первого поколения
  2. Это намного сложнее, чем ассемблер
  3. Трудно понять человеку
  4. Это в форме 0 и 1
  5. Машинный язык зависит от платформы
  6. Его нельзя легко изменить
  7. Не поддерживает модификацию
  8. Высокий риск существования ошибки
  9. Бинарный код не может быть запомнен
  10. Нет необходимости в компиляторе

Язык ассемблера:

  1. Это язык программирования второго поколения
  2. Это менее сложно, чем машинный язык
  3. Легко понять человеком
  4. Используются символические инструкции, описательные имена для элементов данных и места в памяти.
  5. Язык ассемблера зависит от платформы
  6. Легко модифицируется
  7. Изменения в поддержке
  8. Снижается риск возникновения ошибки
  9. Запоминаемость высокая
  10. Нужен компилятор и знает как ассемблер
0 голосов
/ 13 марта 2015

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

0 голосов
/ 10 августа 2009

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

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