Языки программирования низкого уровня ассемблер. Когда был создан ассемблер(assembler) и машинный язык? Идентификаторы, целые числа, символы, комментарии, эквивалентность

Язык программирования

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

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

Директивы ассемблера позволяют включать в программу блоки данных (описанные явно или считанные из файла); повторить определённый фрагмент указанное число раз; компилировать фрагмент по условию; задавать адрес исполнения фрагмента, менять значения меток в процессе компиляции; использовать макроопределения с параметрами и др.

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

Достоинства и недостатки

  • минимальное количество избыточного кода (использование меньшего количества команд и обращений в память). Как следствие - большая скорость и меньший размер программы
  • большие объемы кода, большое число дополнительных мелких задач
  • плохая читабельность кода, трудность поддержки (отладка, добавление возможностей)
  • трудность реализации парадигм программирования и любых других сколько-нибудь сложных конвенций, сложность совместной разработки
  • меньшее количество доступных библиотек, их малая совместимость
  • непосредственный доступ к аппаратуре: портам ввода-вывода, особым регистрам процессора
  • возможность написания самомодифицирующегося кода (т.е. метапрограммирования, причем без необходимости программного интерпретатора)
  • максимальная «подгонка» для нужной платформы (использование специальных инструкций, технических особенностей «железа»)
  • непереносимость на другие платформы (кроме двоично совместимых).

Синтаксис

Общепринятого стандарта для синтаксиса языков ассемблера не существует. Однако, существуют стандарты де-факто - традиционные подходы, которых придерживаются большинство разработчиков языков ассемблера. Основными такими стандартами являются Intel-синтаксис и AT&T-синтаксис.

Общий формат записи инструкций одинаков для обоих стандартов:

`[метка:] опкод [операнды] [;комментарий]`

Опкод - непосредственно мнемоника инструкции процессору. К ней могут быть добавлены префиксы (повторения, изменения типа адресации и пр.). В качестве операндов могут выступать константы, названия регистров, адреса в оперативной памяти и пр.. Различия между стандартами Intel и AT&T касаются, в основном, порядка перечисления операндов и их синтаксиса при различных методах адресации.

Используемые мнемоники обычно одинаковы для всех процессоров одной архитектуры или семейства архитектур (среди широко известных — мнемоники процессоров и контроллеров Motorola, ARM, x86). Они описываются в спецификации процессоров.

Например, процессор Zilog Z80 наследовал систему команд Intel i8080, расширил ее и поменял мнемоники (и обозначения регистров) на свой лад. Например, сменил интеловские mov на ld . Процессоры Motorola Fireball наследовали систему команд Z80, несколько её урезав. Вместе с тем, Motorola официально вернулась к мнемоникам Intel. и в данный момент половина ассемблеров для Fireball работает с интеловскими мнемониками, а половина с мнемониками Zilog.

Директивы

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

  • определение данных (констант и переменных)
  • управление организацией программы в памяти и параметрами выходного файла
  • задание режима работы компилятора
  • всевозможные абстракции (т.е. элементы языков высокого уровня) - от оформления процедур и функций (для упрощения реализации парадигмы процедурного программирования) до условных конструкций и циклов (для парадигмы структурного программирования)
  • макросы

Происхождение и критика термина «язык ассемблера»

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

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

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

Элементы синтаксиса:

Примеры:

Hello, World!:

Пример для версий Intel x86 (IA32)

mov ax , cs mov ds , ax mov ah , 9 mov dx , offset Hello int 21h xor ax , ax int 21h Hello : db "Hello World !", 13, 10, "$"

Hello, World!:

Пример для версий Amiga

move . l #DOS move . l 4. w , a6 jsr - $0198(a6 ) ; OldOpenLibrary move . l d0 , a6 beq . s . Out move . l #HelloWorld , d1 A ) moveq #13, d2 jsr - $03AE (a6 ) ; WriteChars B ) jsr - $03B4 ; PutStr move . l a6 , a1 move . l 4. w , a6 jsr - $019E (a6 ) ; CloseLibrary . Out rts DOS dc . b "dos.library" , 0 HelloWorld dc . b "Hello World!" , $A , 0

Hello, World!:

Пример для версий AtariST

move . l #helloworld , - (A7 ) move #9, - (A7 ) trap #1 addq . l #6, A7 move #0, - (A7 ) trap #1 helloworld : dc . b "Hello World !", $0d , $0a , 0

Hello, World!:

Пример для версий Intel x86 (IA32)

NASM Linux , используется Intel синтаксис. Компиляция и линковка:

  • nasm –f elf –o hello.o hello.asm
  • ld -o hello hello.o

SECTION . data msg db "Hello , world !", 0xa len equ $ - msg SECTION . text global _start _start : ; Точка входа в программу mov eax , 4 ; "write" системный вызов mov ebx , 1 mov ecx , msg ; Указатель на данные mov edx , len ; Количество данных int 0x80 ; Вызов ядра mov eax , 1 ; "_exit" системный вызов mov ebx , 0 ; Возвращаем 0 (все хорошо) int 0x80 ; Вызов ядра

Hello, World!:

Пример для версий PDP-8

/ — комментарии.

/ Hello World на ассемблере для DEC PDP - 8 * 200 hello , cla cll tls / tls устанавливает флаг печати. tad charac / создает индексный регистр dca ir1 / для получения символов tad m6 / настроить счетчик для dca count / ввода символов. next , tad i ir1 / получить символ. jms type / его тип. isz count / сделать что нибудь еще? jmp next / нет, ввести другой символ hlt type , 0 / подпрограмма type tsf jmp . - 1 tls cla jmp i type charac , . / используется в качестве начального значения ir1 . 310 / H 305 / E 314 / L 314 / L 317 / O 254 / , 240 / 327 / W 317 / O 322 / R 314 / L 304 / D 241 / ! m6 , - 15 count , 0 ir1 = 10 $

Hello, World!:

Пример для версий PDP-11

Программа написана на макроассемблере MACRO-11 Для компиляции и запуска этой программы в ОС RT-11 командуем:

MACRO HELLO

ERRORS DETECTED: 0

LINK HELLO -- Линкуем. RUN HELLO -- Запускаем

TITLE HELLO WORLD ; Название . MCALL . TTYOUT ,. EXIT HELLO :: MOV #MSG , R1 ; Начальный адрес строки 1$: MOVB (R1 ) + , R0 ; Получаем следующий символ BEQ DONE ; Если ноль, выходим из цикла . TTYOUT ; Иначе печатаем символ BR 1$ ; Повтор цикла DONE : . EXIT MSG : . ASCIZ / Hello , world !/ ; Строка Hello , world ! . END HELLO ; Конец программы HELLO

Hello, World!:

Пример для версий System/360 , System/370

IBM System/360/370/390 Basic Assembler Language .

// EXEC ASSEMBLY START MAIN BALR 2 , 0 USING * , 2 OPEN PRINT MVC BUF , HW PUT PRINT CLOSE PRINT EOJ HW DC CL132 " HELLO WORLD " BUF DS CL132 PRINT DTFPR IOAREA1 = BUF , DEVADDR = SYSLST , BLKSIZE = 132 , * DEVICE = 3203 , CONTROL = YES , PRINTOV = YES END MAIN /* // EXEC LNKEDT // EXEC /* /&

Hello, World!:

Пример для версий Apple II

* HELLO WORLD FOR 6502 APPLE ][ * ******************************** STROUT EQU $DB3A LDY #> HELLO LDA #< HELLO JMP STROUT HELLO ASC "HELLO WORLD !", 00

Hello, World!:

Пример для версий PDP-10

CHTTYO — весь ввод/вывод осуществляется с помощью каналов ввода/вывода. Лучше всего сделать символические имена для тех каналов, которые вы используете, и начинать их с CH. Определите эти имена с помощью MIDAS оператора == .

CALL — это символическое обозначение для вызова системного вызова. Его формат: .CALL .

OPEN открывает канал ввода/вывода для использования. Требует два параметра — номер канала и имя устройства в SIXBIT.

LOSE %LSFIL — системный вызов, который печатает сообщение об ошибке ввода/вывода, если вдруг она произошла.

IOT — системный вызов, который фактически занимается вводом/выводом. В качестве параметра нужно указать канал и адрес, содержащий код символа для вывода. Например, “H представляет H .

TITLE PRINTHELLO A = 1 CHTTYO == 1 ; Канал для вывода. START : ; Открытие TTY канала. . CALL [ SETZ ? SIXBIT / OPEN / [. UAO , CHTTYO ] ? [ SIXBIT / TTY / ] ((SETZ ))] . LOSE %LSFIL . IOT CHTTYO ,[ "H ] ; Печать HELLO WORLD посимвольно. . IOT CHTTYO ,[ "E ] . IOT CHTTYO ,[ "L ] . IOT CHTTYO ,[ "L ] . IOT CHTTYO ,[ "O ] . IOT CHTTYO ,[ ^M ] ; Символ новой строки . IOT CHTTYO ,[ "W ] . IOT CHTTYO ,[ "O ] . IOT CHTTYO ,[ "R ] . IOT CHTTYO ,[ "L ] . IOT CHTTYO ,[ "D ] . VALUE ; Программка, остановись :) END START

Числа Фибоначчи:

Пример для версий MIPS32

Эмулятор MARS. Вывод консоли MARS:

The Fibonacci numbers are: 1 1 2 3 5 8 13 21 34 55 89 144 -- program is finished running --

Программа выводит 15 чисел Фибоначчи. Количество чисел можно изменить в секции.data.

Data space: .asciiz " " head : .asciiz "The Fibonacci numbers are:\n" fib: .word 0 : 15 size : .word 15 .text main: la $t0 , fib la $t5 , size lw $t5 , 0 ($t5 ) li $t2 , 1 add.d $f0 , $f2 , $f4 sw $t2 , 0 ($t0 ) sw $t2 , 4 ($t0 ) addi $t1 , $t5 , - 2 loop : lw $t3 , 0 ($t0 ) lw $t4 , 4 ($t0 ) add $t2 , $t3 , $t4 sw $t2 , 8 ($t0 ) addi $t0 , $t0 , 4 addi $t1 , $t1 , - 1 bgtz $t1 , loop la $a0 , fib move $a1 , $t5 jal print li $v0 , 10 syscall print : add $t0 , $zero , $a0 add $t1 , $zero , $a1 la $a0 , head li $v0 , 4 syscall out : lw $a0 , 0 ($t0 ) li $v0 , 1 syscall la $a0 , space li $v0 , 4 syscall addi li $v0 , 1 la $a0 , ($t2 ) syscall la $a0 , string1 li $v0 , 4 syscall mult $t1 , $t2 mflo $t1 li $v0 , 1 la $a0 , ($t1 ) syscall la $a0 , string2 li $v0 , 4 syscall addiu $t2 , $t2 , 1 beq $t2 , 16 , endloop j loop endloop: li $v0 , 10 syscall



Ассемблер

Ассемблер ― язык программирования низкого уровня. Язык получил свое название от слова assembler - сборщик. Возник еще в 50-е гг. как символический аналог машинного языка.
Команды Ассемблера один в один соответствуют командам процессора и фактически, представляют собой удобную символьную форму записи команд и аргументов. Также, Ассемблер обеспечивает связывание частей программы и данныx через метки, выполняемое при ассемблировании (для каждой метки высчитывается адрес, после чего каждое вхождение метки заменяется на этот адрес).
Поскольку системы команд микропроцессоров различаются, каждый процессор имеет свой набор команд на языке ассемблера.
С помощью ассемблера можно написать такие программы, которые невозможно, или очень сложно написать на других языках програмирования. Например: генераторы ключей (keygen), системные мониторы, драйвера для оборудования или даже операционные системы.
Языки высокого уровня ("C","Pascal","Delphi" и т.д.) не обеспечивают надёжного контроля за потоками данных, адресами памяти или регистрами процессора, а также все они были разработаны под определённый вид операционной системы, ассемблер же может стать этим-же ассемблером, но работающим на неизвестной науке платформе, и делающий программы под эту-же платформу.
Программы на ассемблере, в отличие от программ, написанных на языках высокого уровня получаются в десятки раз меньше, а работают в десятки раз быстрее. Примером может послужить операционная система MenuetOS, которая написана на Flat Assembler и умещающаяся на одной дискете (1.44 Мб), причём в комплект входят прикладные программы, такие как: редактор ассемблерного кода с подсветкой, работа с файловой системой, 3d заставки, некоторое количество игр, просмоторщик картинок, компилятор Flat Assembler, терминал, CD плейер и многое другое. Преимущество состоит в том, что его можно быстро скачать с интернета (даже при маленькой скорости соединения).
На данный момент, большинство специалистов в области программного обеспечения ведут разработки на языках высокого уровня, таких как Паскаль или С, что проще при написании программ, но наиболее мощное и эффективное программное обеспечение полностью или частично написано на языке ассемблера.

Литература
1. Питер Абель - Ассемблер. Язык и программирование для IBM PC - М., 1999.

Ассемблер

Ассемблер (от англ. assembler - сборщик) - компилятор исходного текста программы, написанной на языке ассемблера, в программу на машинном языке.
Как и сам язык, ассемблеры, как правило, специфичны для конкретной архитектуры, операционной системы и варианта синтаксиса языка. Вместе с тем существуют мультиплатформенные или вовсе универсальные (точнее, ограниченно-универсальные, потому что на языке низкого уровня нельзя написать аппаратно-независимые программы) ассемблеры, которые могут работать на разных платформах и операционных системах. Среди последних можно также выделить группу кросс-ассемблеров, способных собирать машинный код и исполняемые модули (файлы) для других архитектур и ОС.
Ассемблирование может быть не первым и не последним этапом на пути получения исполнимого модуля программы. Так, многие компиляторы с языков программирования высокого уровня выдают результат в виде программы на языке ассемблера, которую в дальнейшем обрабатывает ассемблер. Также результатом ассемблирования может быть не исполнимый, а объектный модуль, содержащий разрозненные блоки машинного кода и данных программы, из которого (или из нескольких объектных модулей) в дальнейшем с помощью редактора связей может быть получен исполнимый файл.
Специальные ячейки памяти, расположенные непосредственно в процессоре. Работа с регистрами выполняется намного быстрее, чем с ячейками оперативной памяти, поэтому регистры активно используются как в программах на языке ассемблера, так и компиляторами языков высокого уровня.
Названия регистров происходят от их назначения:

EAX/AX/AH/AL (accumulator register) - аккумулятор;
EBX/BX/BH/BL (base register) -регистр базы;
ECX/CX/CH/CL (counter register) - счётчик;
EDX/DX/DH/DL (data register) - регистр данных;
ESI/SI (source index register) - индекс источника;
EDI/DI (destination index register) - индекс приёмника (получателя);
ESP/SP (stack pointer register) - регистр указателя стека;
EBP/BP (base pointer register) - регистр указателя базы кадра стека.

Команды обработки строк
Для работы со строками, или цепочками символов или чисел (т.е. попросту говоря, с массивами произвольных данных) в МП предусмотрен ряд специальных команд:
movs - пересылка строки;
cmps - сравнение двух строк;
seas - поиск в строке заданного элемента;
lods - загрузка аккумулятора (регистров AL или АХ) из строки;
stos - запись элемента строки из аккумулятора (регистров АХ или AL).

Достоинства

· Язык ассемблера позволяет писать самый быстрый и компактный код, какой вообще возможен для данного процессора.
· Скорость работы - за счёт оптимизации вычислительного алгоритма и/или более рационального обращения к оперативной памяти (например, если все исходные данные хранятся в регистрах процессора, то можно исключить излишние обращения к ОП), перераспределения данных, табличного вычисления функций;
· Объём кода (в том числе за счёт эффективного использования промежуточных результатов). Сокращение объёма кода также нередко повышает скорость выполнения программы.
· Обеспечение максимального использования специфических возможностей конкретной платформы, что также позволяет создавать более эффективные программы, в том числе менее ресурсоёмкие.
· При программировании на языке ассемблера возможен непосредственный доступ к аппаратуре, и, в частности, портам ввода-вывода, регистрам процессора и др. Во многих операционных системах прямое обращение из прикладных программ для записи в регистры периферийного оборудования блокировано для надёжности работы системы и исключения "зависаний".
· Язык ассемблера часто применяется для создания драйверов оборудования и ядра операционной системы, когда важно временное согласование работы периферийных устройств с центральным процессором.
· Язык ассемблера используется для создания "прошивок" BIOS.
· С помощью языка ассемблера часто создаются машиннозависимые подпрограммы компиляторов и интерпретаторы языков высокого уровня, а также реализуется совместимость платформ.
· С помощью программы дизассемблера можно понять алгоритмы работы исследуемой программы при отсутствии листинга на высокоуровневом языке, изучая только машинные коды, но в сложных нетривиальных программах это очень и очень трудоёмко.

Недостатки
· В силу машинной ориентации ("низкого" уровня) языка ассемблера человеку сложнее читать и понимать программу на нём по сравнению с языками программирования высокого уровня; программа состоит из слишком "мелких" элементов - машинных команд, соответственно, усложняются программирование и отладка, растут трудоёмкость и вероятность внесения ошибок.
· Требуется повышенная квалификация программиста для получения качественного кода: код, написанный средним программистом на языке ассемблера, обыкновенно оказывается не лучше или даже хуже кода, порождаемого оптимизирующим компилятором для сравнимых программ, написанных на языке высокого уровня.
· Программа на языке высокого уровня может быть перекомпилирована с автоматической оптимизацией под особенности новой целевой платформы, программа же на языке ассемблера на новой платформе может потерять своё преимущество в скорости без ручного переписывания кода.
· Как правило, меньшее количество доступных библиотек по сравнению с современными индустриальными языками программирования.
· Отсутствует переносимость программ на компьютеры с другой архитектурой и системой команд.

Совместимость
Программа, предназначенная для одного типа ассемблеров, не может быть откомпилирована на другом без радикальной переделки или автоматической конвертации! Но даже среди ассемблеров "своего" типа наблюдается разброд, разнобой и множество различий: в ключевых словах, в правилах оформления листинга, в поставляемых библиотеках и заголовочных файлов и т. д. Если только совместимость не заявлена явно, транслировать программу нужно тем и только тем ассемблером для которого она предназначена. В противном случае - готовьтесь к переделкам (то есть, к адоптации). Отличия зачастую проявляются в самых неожиданных местах. Некоторые ассемблеры понимают, что "mov eax, x" это тоже самое, что и "mov eax,[x]", некоторые - нет. Они спотыкаются и выдают ошибку. Но еще ничего! Гораздо хуже, когда транслятор молчаливо трактует эту конструкцию как "mov eax, offset x", что совсем не одно и тоже! Так что при переносе программы приходится быть очень и очень осторожным.

Совместимость операционных систем. Программы, ориентированные на MS-DOS, без не только не транспортабельны, но и непереносимы. Для них характерно прямое взаимодействие с оборудованием, доступное в NT только с ядерного уровня, не говоря уже о том, что 16-разрядный код вызывается из 32-разрядных приложений только через DPMI, да и то не без ухищрений.

Таким образом, прежде чем транслировать ассемблерную программу, необходимо отождествить для какого транслятора и операционной системы она предназначена! С ассемблерными фрагментами, выхваченными из "родного" контекста, приходится еще хуже. Допустим, в некоторой статье описывается интересный антиотладочный прием и приводится ассемблерный код, но как встроить его в свою программу - не говорится. Знакомая ситуация, не правда ли? Непосредственная трансляция невозможна - транслятор дико материться, но ничего не говорит.

Ассемблирование программы

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

Asm --> .obj --> .exe/.dll/.com

На первой стадии (.asm --> .obj) из ассемблерного файла путем компиляции получаются файлы промежуточного объектного кода, имеющего расширение.obj (при этом могут использоваться дополнительные inc-файлы). Файл с расширением.obj содержит оптимизированный машинный код при условии, что не встретились синтаксические и семантические ошибки. Если в исходном файле с программой на языке ассемблера обнаруживаются ошибки, то программисту выдается список обнаруженных ошибок, в котором ошибки указываются с номером строки, в которой они обнаружены. Программист циклически выполняет действия по редактированию и компиляции до тех пор, пока не будут устранены все ошибки в исходном файле. На этом этапе уже возможно получение готовой программы, но чаще всего в ней не хватает некоторых компонентов. Если компилятор по какой-либо причине (неверно прописан путь к такому файлу или файл отсутствует) не может найти inc-файл, то выдается предупреждение и obj-файл получен не будет.

Ассемблирование, как правило, проходит в два приема. При первом проходе переводятся мнемонические команды, десятеричные числа и символы в соответствующие машинные коды, подсчитывается, сколько какая команда занимает места, обнаруженные имена, введенные пользователем (константы, метки, переменные) их тип и числовое значение записывается в таблицу. В эту же таблицу записывается, с каких адресов начинаются процедуры, адреса меток, адреса начала/конца сегментов и т. д., при втором проходе подставляются адреса начала процедур, заменяются названия меток на адреса.

В результате ассемблирования получается так называемый "объектный файл". В качестве дополнительной возможности ассемблер может создать файл листинга программы.

Обычно для получения файлов объектного кода необходимо выполнить соответствующую программу ассемблера (программы ML.EXE фирмы Microsoft и TASM.EXE фирмы Borland), указав в командной строке имя файла с текстом программы.

Эта форма вызова является минимально необходимой. Кроме имени текстового файла, необходимо указывать опции ассемблирования. Более подробную информацию об опциях программы ассемблирования следует искать в документации к этим программам.

Компоновка программы

Следующая стадия (.obj --> .exe/.dll/.com) называется линковкой или компоновкой и служит для замещения символьных имен, используемых программистом, на реальные адреса.

Сравните шестнадцатеричное содержимое OBJ и EXE файла, который у вас получился. В EXE-файле присутствует та же последовательность байтов, что и в OBJ-файле. Но помимо этого еще присутствует: имя ассемблированного файла, версия ассемблера, "имя собственное" сегмента и так далее.

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

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

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

Процесс объединения объектных модулей в один файл осуществляется специальной программой-компоновщиком или сборщиком (программа LINK.EXE фирмы Microsoft и TLINK.EXE фирмы Borland), которая выполняет связывание объектных модулей и машинного кода стандартных функций, находя их в библиотеках, и формирует на выходе работоспособное приложение - исполнимый код для конкретной платформы.

Исполнимый код - это законченная программа с расширением COM, DLL или EXE, которую можно запустить на компьютере с установленной операционной системой, для которой эта программа создавалась. Имя исполняемого файла задастся именем первого.OBJ файла. Для линковки нужно в командной строке набрать:

link prog1.obj prog2.obj или tlink prog1.obj prog2.obj

Содержимое объектного файла анализируется компоновщиком. Он определяет, есть ли в программе внешние ссылки, то есть содержит ли программа команды вызовов процедур, находящихся в одной из библиотек объектных модулей (link library). Компоновщик находит эти ссылки в объектном файле, копирует необходимые процедуры из библиотек, объединяет их вместе с объектным файлом и создает исполняемый файл (executable file). В качестве дополнительных возможностей компоновщик может создать файл перекрестных ссылок, содержащих план полученного исполняемого файла.

Используемые источники
1. https://ru.wikipedia.org/
2. http://natalia.appmat.ru/
3. http://www.codenet.ru/
4. http://wasm.ru/
5. Нортон П., Соухэ Д. Язык ассемблера для IBM PC. М.: Компьютер, 1992.

1. Когда и кем были изобретены счетно-перфорационные машины? Какие задачи на них решались?

2. Что такое электромеханическое реле? Когда создавались релейные вычислительные машины? Каким быстродействием они обладали?
3. Где и когда была построена первая ЭВМ? Как она называлась?
4. Какова роль Джона фон Неймана в создании ЭВМ?
5. Кто был конструктором первых отечественных ЭВМ?
6. На какой элементной базе создавались машины первого поколения? Каковы были их основные характеристики?
7. На какой элементной базе создавались машины второго поколения? В чем их преимущества по сравнению с первым поколением ЭВМ?
8. Что такое интегральная схема? Когда были созданы первые ЭВМ на интегральных схемах? Как они назывались?
9. Какие новые области применения ЭВМ возникли с появлением машин третьего поколения?
10. Что такое микропроцессор? Когда и где был создан первый микропроцессор?
11. Что такое микроЭВМ и персональный компьютер?
12. Какие типы ПК наиболее распространены в мире?
13. Что такое суперкомпьютер?
14. Что такое кластерные системы ПК?
15. В чем особенность компьютеров пятого поколения?

Назовите первое вычислительное устройство. Абак Калькулятор Арифмометр русские счеты Какую идею выдвинул в середине

19 века английский математик Чарльз Бэббидж?

Идею создания программно управляемой счетной машины, имеющей арифметическое устройство, устройство управления, а также устройство ввода и печати

Идею создания сотового телефона

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

В каком году и где была создана первая ЭВМ на основе электронных ламп?

1945 год, США

1944 г, Англия

1946 г, Франция

На какой базе были созданы ЭВМ третьего поколения?

Интегральные схемы

полупроводники

электронные лампы

сверхбольшие интегральные схемы

Как назывался первый персональный компьютер?

Назовите центральное устройство компьютера.

Процессор

Системный блок

Блок питания

Материнская плата

Процессор обрабатывает информацию представленную:

В десятичной системе счисления

На английском языке

На русском языке

На машинном языке (в двоичном коде)

Для ввода числовой и текстовой информации используется

Клавиатура

Сканер используется для…

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

Для рисования на ней специальной ручкой

Перемещения курсора на экране монитора

Получения голографических изображений

10. Какой тип принтера целесообразно использовать для печати финансовых документов?

Матричный принтер

Струйный принтер

Лазерный принтер

Какой тип принтера целесообразно использовать для печати рефератов?

Матричный принтер

Струйный принтер

Лазерный принтер

Какой тип принтера целесообразно использовать для печати фотографий?

Матричный принтер

Струйный принтер

Лазерный принтер

При несоблюдении санитарно – гигиенических требований компьютера вредное влияние на здоровье человека может оказать…

Монитор на электронно – лучевой трубке

Монитор на жидких кристаллах

Плазменные панели

При выключении компьютера вся информация стирается из…

Оперативной памяти

Жесткого диска

Лазерного диска

В каком устройстве компьютера осуществляется хранение информации?

Внешняя память;

процессор;

Оптические дорожки имеют меньшую толщину и размещены более плотно на …

Цифровом видеодиске (DVD – диске)

Компакт диске (CD – диске)

В устройства ввода входят…

В устройства вывода входят…

Клавиатура, мышь, джойстик, световое перо, сканер, цифровая камера, микрофон

Звуковые колонки, монитор, принтер, наушник

Жесткий диск, процессор, модули памяти, материнская плата, дискета

Программой называется…

Компьютерная программа может управлять работой компьютера, если она находится…

В оперативной памяти

На гибком диске

На жестком диске

На CD – диске

Данные – это…

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

Информация, представленная в цифровой форме и обрабатываемая на компьютере

Данные, имеющие имя и хранящиеся в долговременной памяти

Файл – это…

Текст распечатанный на компьютере

Информация, представленная в цифровой форме и обрабатываемая на компьютере

Программа или данные, имеющие имя и хранящиеся в долговременной памяти

При быстром форматировании гибкого диска …

Производится очистка каталога диска

Стираются все данные

Производится дефрагментация диска

Производится проверка поверхности диска

При полном форматировании гибкого диска…

стираются все данные

производится полная проверка диска

производится очистка каталога диска

диск становится системным

В многоуровневой иерархической файловой системе...

Файлы хранятся в системе, представляющей собой систему вложенных папок

Файлы хранятся в системе, которая представляет собой линейную последовательность

История развития вычислительной техники:

1. Назовите первое вычислительное устройство.
1) Абак
2) Калькулятор
3) Арифмометр
4) русские счеты

2. Какую идею выдвинул в середине 19 века английский математик Чарльз Бэббидж?
1) Идею создания программно управляемой счетной машины, имеющей арифметическое устройство, устройство управления, а также устройство ввода и печати
2) Идею создания сотового телефона
3) Идею создания роботов, управляемых компьютером
3. Назовите первого программиста вычислительных машин.
1) Ада Лавлейс
2) Сергей Лебедев
3) Билл Гейтс
4) Софья Ковалевская

4. В каком году и где была создана первая ЭВМ на основе электронных ламп?
1) 1945 год, США
2) 1950, СССР
3) 1944 г, Англия
4) 1946 г, Франция

5. На какой базе были созданы ЭВМ третьего поколения?
1) Интегральные схемы
2) полупроводники
3) электронные лампы
4) сверхбольшие интегральные схемы

6. Как назывался первый персональный компьютер?
1) Apple II
2) IBM PC
3) Dell
4) Корвет
Устройство компьютера.........................15
1. Назовите центральное устройство компьютера.
1) Процессор
2) Системный блок
3) Блок питания
4) Материнская плата
2. Как записывается и передается физическая информации в ЭВМ?
1) цифрами;
2) с помощью программ;
3) представляется в форме электрических сигналов.

3. Процессор обрабатывает информацию представленную:
1) В десятичной системе счисления
2) На английском языке
3) На русском языке
4) На машинном языке (в двоичном коде)
4. Для ввода числовой и текстовой информации используется
1) Клавиатура
2) Мышь
3) Трекбол
4) Ручка
5. Важнейшей характеристикой координатных устройств ввода является разрешающая способность, которая обычно составляет 500 dpi (dot per inch – точек на дюйм (1 дюйм = 2,54 см)), что означает…
1) При перемещении мыши на один дюйм указатель мыши перемещается на 500 точек
2) При перемещении мыши на 500 точек указатель мыши перемещается на один дюйм
6. Сканер используется для…
1) Для ввода в компьютер изображений и текстовых документов
2) Для рисования на ней специальной ручкой
3) Перемещения курсора на экране монитора
4) Получения голографических изображений
Устройства вывода информации.................21
1. Какой тип принтера целесообразно использовать для печати финансовых документов?
1) Матричный принтер
2) Струйный принтер
3) Лазерный принтер
2. Какой тип принтера целесообразно использовать для печати рефератов?
1) Матричный принтер
2) Струйный принтер
3) Лазерный принтер

1. Какой тип принтера целесообразно использовать для печати фотографий?
1) Матричный принтер
2) Струйный принтер
3) Лазерный принтер
2. При несоблюдении санитарно – гигиенических требований компьютера вредное влияние на здоровье человека может оказать…
1) Монитор на электронно – лучевой трубке
2) Монитор на жидких кристаллах
4) Плазменные панели
3. Устройство, которое обеспечивает запись и считывание информации называется…
1) Дисководом или накопителем

4. При выключении компьютера вся информация стирается из…
4) Оперативной памяти
5) Жесткого диска
6) Лазерного диска
7) Дискеты
13. В каком устройстве компьютера осуществляется хранение информации?
1) Внешняя память;
2) монитор;
3) процессор;
2. Оптические дорожки имеют меньшую толщину и размещены более плотно на …
1) Цифровом видеодиске (DVD – диске)
2) Компакт диске (CD – диске)
3) Дискете
3. На каком диске информация хранится на концентрических дорожках, на которых чередуются намагниченные и ненамагниченные участки
1) На дискете
2) На компакт диске
3) На DVD – диске

4. В устройства ввода входят…

1) Жесткий диск, процессор, модули памяти, материнская плата, дискета
5. В устройства вывода входят…
1) Клавиатура, мышь, джойстик, световое перо, сканер, цифровая камера, микрофон
2) Звуковые колонки, монитор, принтер, наушник
3) Жесткий диск, процессор, модули памяти, материнская плата, дискета
6. Программой называется…

7. Компьютерная программа может управлять работой компьютера, если она находится…
1) В оперативной памяти
2) На гибком диске
3) На жестком диске
4) На CD – диске
8. Данные – это…
1) Последовательность команд, которую выполняет компьютер в процессе обработки данных
2) Информация, представленная в цифровой форме и обрабатываемая на компьютере
3) Данные, имеющие имя и хранящиеся в долговременной памяти
9. Файл – это…
1) Текст распечатанный на компьютере
2) Информация, представленная в цифровой форме и обрабатываемая на компьютере
3) Программа или данные, имеющие имя и хранящиеся в долговременной памяти

10. При быстром форматировании гибкого диска …
1) Производится очистка каталога диска
2) Стираются все данные
3) Производится дефрагментация диска
4) Производится проверка по


Для начала разберёмся с терминологией.

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

Язык программирования низкого уровня (низкоуровневый язык программирования) – это язык программирования, максимально приближённый к программированию в машинных кодах. В отличие от машинных кодов, в языке низкого уровня каждой команде соответствует не число, а сокращённое название команды (мнемоника). Например, команда ADD – это сокращение от слова ADDITION (сложение). Поэтому использование языка низкого уровня существенно упрощает написание и чтение программ (по сравнению с программированием в машинных кодах). Язык низкого уровня привязан к конкретному процессору. Например, если вы написали программу на языке низкого уровня для процессора PIC, то можете быть уверены, что она не будет работать с процессором AVR.

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

Язык ассемблера – это низкоуровневый язык программирования, на котором вы пишите свои программы. Для каждого процессора существует свой язык ассемблера.

Ассемблер – это специальная программа, которая преобразует (компилирует) исходные тексты вашей программы, написанной на языке ассемблера, в исполняемый файл (файл с расширением EXE или COM). Если быть точным, то для создания исполняемого файла требуются дополнительные программы, а не только ассемблер. Но об этом позже…

В большинстве случаев говорят «ассемблер», а подразумевают «язык ассемблера». Теперь вы знаете, что это разные вещи и так говорить не совсем правильно. Хотя все программисты вас поймут.

ВАЖНО!
В отличие от языков высокого уровня, таких, как Паскаль , Бейсик и т.п., для КАЖДОГО АССЕМБЛЕРА существует СВОЙ ЯЗЫК АССЕМБЛЕРА. Это правило в корне отличает язык ассемблера от языков высокого уровня. Исходные тексты программы (или просто «исходники»), написанной на языке высокого уровня, вы в большинстве случаев можете откомпилировать разными компиляторами для разных процессоров и разных операционных систем. С ассемблерными исходниками это сделать будет намного сложнее. Конечно, эта разница почти не ощутима для разных ассемблеров, которые предназначены для одинаковых процессоров. Но в том то и дело, что для КАЖДОГО ПРОЦЕССОРА существует СВОЙ АССЕМБЛЕР и СВОЙ ЯЗЫК АССЕМБЛЕРА. В этом смысле программировать на языках высокого уровня гораздо проще. Однако за все удовольствия надо платить. В случае с языками высокого уровня мы можем столкнуться с такими вещами как больший размер исполняемого файла, худшее быстродействие и т.п.


В этой книге мы будем говорить только о программировании для компьютеров с процессорами Intel (или совместимыми). Для того чтобы на практике проверить приведённые в книге примеры, вам потребуются следующие программы (или хотя бы некоторые из них):

  1. . Хорошая программа, особенно для новичков. Включает в себя редактор исходного кода и некоторые другие полезные вещи. Работает в Windows, хотя программы пишутся под DOS. К сожалению, программа стоит денег (но оно того стоит))). Подробности см. на сайте http://www.emu8086.com .
  2. – Турбо Ассемблер от фирмы Borland. Можно создавать программы как для DOS так и для Windows. Тоже стоит денег и в данный момент уже не поддерживается (да и фирмы Borland уже не существует). А вообще вещь хорошая.
  3. – Ассемблер от компании Microsoft (расшифровывается как МАКРО ассемблер, а не Microsoft Assembler, как думают многие непосвящённые). Пожалуй, самый популярный ассемблер для процессоров Intel. Поддерживается до сих пор. Условно бесплатная программа. То есть, если вы будете покупать её отдельно, то она будет стоить денег. Но она доступна бесплатно подписчикам MSDN и входит в пакет программ Visual Studio от Microsoft.
  4. – ассемблер от компании Watcom. Как и все другие, обладает преимуществами и недостатками.
  5. - обладает скромными возможностями, но имеет большой плюс - входит в стандартный набор Windows. Поищите ее в папке WINDOWS\COMMAND или WINDOWS\SYSTEM32. Если не найдете, тогда в других папках каталога WINDOWS.
  6. Желательно также иметь какой-нибудь . Не помешает и досовский файловый менеджер, например Волков Коммандер (VC) или Нортон Коммандер (NC). С их помощью можно также посмотреть шестнадцатеричные коды файла, но редактировать нельзя. Бесплатных шестнадцатеричных редакторов в Интернете довольно много. Вот один из них: McAfee FileInsight v2.1 . Этот же редактор можно использовать для работы с исходными текстами программ. Однако мне больше нравится делать это с помощью следующего редактора:
  7. Текстовый редактор. Необходим для написания исходных текстов ваших программ. Могу порекомендовать бесплатный редактор PSPad , который поддерживает множество языков программирования, в том числе и язык Ассемблера.
Все представленные в этой книге программы (и примеры программ) проверены на работоспособность. И именно эти программы используются для реализации примеров программ, приведённых в данной книге.

И еще – исходный код, написанный, например для Emu8086, будет немного отличаться от кода, написанного, например, для TASM. Эти отличия будут оговорены.

Большая часть программ, приведённых в книге, написана для . Во-первых, потому что этот ассемблер наиболее популярен и до сих пор поддерживается. Во-вторых, потому что он поставляется с MSDN и с пакетом программ Visual Studio от Microsoft. Ну и в третьих, потому что я являюсь счастливым обладателем лицензионной копии MASM.

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

Для того чтобы машина могла выполнить команды человека на аппаратном уровне, необходимо задать определенную последовательность действий на языке «ноликов и единиц». Помощником в этом деле станет Ассемблер. Это утилита, которая работает с переводом команд на машинный язык. Однако написание программы - весьма трудоемкий и сложный процесс. Данный язык не предназначен для создания легких и простых действий. На данный момент любой используемый язык программирования (Ассемблер работает прекрасно) позволяет написать специальные эффективные задачи, которые сильно влияют на работу аппаратной части. Основным предназначением является создание микрокоманд и небольших кодов. Данный язык дает больше возможностей, чем, например, Паскаль или С.

Краткое описание языков Ассемблера

Все языки программирования разделяются по уровням: низкий и высокий. Любой из синтаксической системы «семейки» Ассемблера отличается тем, что объединяет сразу некоторые достоинства наиболее распространенных и современных языков. С другими их роднит и то, что в полной мере можно использовать систему компьютера.

Отличительной особенностью компилятора является простота в использовании. Этим он отличается от тех, которые работают лишь с высокими уровнями. Если взять во внимание любой такой язык программирования, Ассемблер функционирует вдвое быстрее и лучше. Для того чтобы написать в нем легкую программу, не понадобится слишком много времени.

Кратко о структуре языка

Если говорить в общем о работе и структуре функционирования языка, можно точно сказать, что его команды полностью соответствуют командам процессора. То есть Ассемблер использует мнемокоды, наиболее удобные человеку для записи.

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

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

Язык Ассемблера имеет несколько синтаксисов, которые будут рассмотрены в статье.

Плюсы языка

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

Драйвера, операционные системы, BIOS, компиляторы, интерпретаторы и т. д. - это все программа на языке Ассемблера.

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

Минусы языка

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

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

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

Команды языка

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


Использование директив

Программирование микроконтроллеров на языке (Ассемблер это позволяет и прекрасно справляется с функционированием) самого низкого уровня в большинстве случаев заканчивается удачно. Лучше всего использовать процессоры с ограниченным ресурсом. Для 32-разрядной техники данный язык подходит отлично. Часто в кодах можно заметить директивы. Что же это? И для чего используется?

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


Происхождение названия

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

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

Макросредства

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

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