Что такое язык ассемблера?

Иногда называемый ассемблером или ASM, ассемблер является языком программирования низкого уровня.

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

Машинный язык - это просто последовательность цифр, которую людям нелегко читать. Используя ASM, программисты могут писать понятные человеку программы, которые почти точно соответствуют машинному языку.

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

Почему ASM является языком низкого уровня?

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

Чем ASM отличается от языка высокого уровня?

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

Программы, написанные на языках высокого уровня, никогда не будут соответствовать скорости и эффективности программ, написанных на ассемблере. Примеры языков высокого уровня включают Python, Java, JavaScript, Clojure и Lisp.

Что такое язык среднего уровня?

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

Программы, написанные на языках среднего уровня, могут работать так же хорошо, как и программы, написанные на ассемблере. Примеры языков программирования среднего уровня включают C, C ++, Ada, Nim и Rust.

Является ли ASM портативным?

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

Портативность - одно из главных преимуществ языков более высокого уровня. Язык программирования C часто называют «переносимой сборкой», поскольку компиляторы C существуют практически для любой современной архитектуры системы. Программа, написанная на C, может потребовать некоторых изменений, прежде чем скомпилируется на другом компьютере, но основной язык является переносимым.

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

Пример: Привет, Мир! в 32-битной сборке, для Windows

Вот «Hello, World», написанный для 32-разрядного процессора Intel. Он также будет работать на 64-битном процессоре. Мы скомпилируем и запустим его на Windows 10.

 global _main extern _printf section .text _main: вызов push-сообщения _printf add esp, сообщение 4 ret: db 'Hello, World!', 10, 0 

Для начала откройте Блокнот. Скопируйте приведенный выше код в новый текстовый файл и сохраните его как hello.asm .

Для компиляции сборки мы будем использовать NASM, Netwide Assembler. Его можно скачать по адресу //www.nasm.us/.

 nasm -f win32 hello.asm 

Когда вы запускаете эту команду, NASM создает объектный файл. Объектный файл содержит машинный код, но не является исполняемым файлом. Наш объектный файл называется hello.obj .

Чтобы создать исполняемый файл, мы будем использовать 32-разрядную версию MinGW (Minimal GNU для Windows), которая предоставит компилятор gcc. Его можно скачать по адресу //www.mingw.org/.

 gcc -o hello.exe hello.obj 
 Привет 
 Привет, мир! 

Пример: Привет, Мир! в 64-битной сборке, для Linux

Вот «Hello, World», написанный для 64-битного процессора Intel. Мы скомпилируем и запустим его на 64-битном Linux.

 extern printf; функция C printf, которая будет называться section .data; Раздел данных, инициализированные переменные msg: db "Hello, world!", 0; Строка C заканчивается 0 fmt: db "% s", 10, 0; Формат printf, «\ n», «0» раздел .text; Начните раздел кода global main; стандартная точка входа gcc main:; метка программы для точки входа push rbp; установить кадр стека, должен быть выровнен mov rdi, fmt mov rsi, msg mov rax, 0; также может быть: xor rax, rax call printf; Вызов функции printf C pop rbp; восстановить стек mov rax, 0; нормальный, без ошибок, возвращаемое значение ret; вернуть 

Скопируйте и вставьте эту программу в новый файл с именем hello.asm .

Затем скомпилируйте сборку с помощью NASM, которую вы можете установить с помощью менеджера пакетов. Например, в Ubuntu или Debian вы можете установить NASM, используя apt:

 sudo apt update && sudo apt install nasm 

Запустите эту команду, чтобы создать свой объектный файл:

 nasm -f elf64 hello.asm 

Объектный файл называется hello.o .

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

 gcc hello.o -o привет 

Наконец, запустите исполняемый файл:

 ./Привет 
 Привет, мир! 

Для справки, это та же самая программа, написанная на C:

 #include int main () {char msg [] = "Hello world \ n"; Е ( "% s \ п", MSG); вернуть 0; } 

  • Смотрите подпрограммы отладки для других примеров низкоуровневого кода сборки и дополнительной информации о том, что делает каждая подпрограмма.
  • Дополнительные примеры языка ассемблера см. На веб-сайте Happy Codings.

2GL, Ассемблер, Низкоуровневый язык, Машинный язык, Условия программирования