
- •36 Вопрос
- •15 Вопрос
- •9Вопрос
- •5 Вопрос
- •8 Вопрос
- •9 Вопрос
- •10Вопрос
- •14 Вопрос
- •15 Вопрос
- •16Вопрос
- •22 Вопрос
- •12 Вопрос
- •13 Вопрос
- •15 Вопрос
- •16 Вопрос
- •17 Вопрос
- •1 Вопрос
- •19 Вопрос
- •52 Вопрос
- •21 Вопрос
- •30 Вопрос
- •21 Вопрос
- •25 Вопрос
- •22 Вопрос
- •23 Вопрос
- •24 Вопрос
- •25 Вопрос
- •26 Вопрос
- •27 Вопрос
- •32 Вопрос
- •29 Вопрос
- •30 Вопрос
- •35 Вопрос
- •37 Вопрос
- •34 Вопрос
- •35 Вопрос
- •40 Вопрос
- •37 Вопрос
- •46 Вопрос
- •50Вопрос
- •42Вопрос
- •43 Вопрос
- •44 Вопрос
- •44 Вопрос
- •42 Вопрос
- •54 Вопрос
1 Вопрос
Программа, написанная на ассемблере, так же как и программа, написанная на любом другом языке программирования, выполняется не сама по себе, а при помощи операционной системы. Операционная система выделяет области памяти для программы, загружает ее, передает ей управление и обеспечивает взаимодействие программы с устройствами ввода-вывода, файловыми системами и другими программами (разумеется, кроме тех случаев, когда эта программа сама является операционной системой или ее частью). Способы взаимодействия программы с внешним миром различны для разных операционных систем, так что программа, написанная для Windows, не будет работать в DOS, а программа для Linux — в Solaris/x86, хотя все эти системы могут работать на одном и том же компьютере.
Самая простая и распространенная операционная система для компьютеров, основанных на процессорах Intel, — DOS (Дисковая Операционная Система). Она распространяется как сама по себе несколькими производителями — Microsoft (MS-DOS), IBM (PC-DOS), Novell (Novell DOS), Caldera (Open DOS) и др., так и в виде части систем Microsoft Windows 95 и старше. DOS предоставляет программам полную свободу действий, никак не ограничивая доступ к памяти и внешним устройствам, позволяя им самим управлять процессором и распределением памяти. По этой причине DOS лучше всего подходит для того, чтобы близко познакомиться с устройством компьютера и возможностями, которые может использовать программа на ассемблере, но которые часто скрываются компиляторами с языков высокого уровня и более совершенными операционными системами.
Итак, чтобы программа выполнилась любой ОС, она должна быть скомпилирована в исполнимый файл. Основные два формата исполнимых файлов в DOS — СОМ и ЕХЕ. Файлы типа СОМ содержат только скомпилированный код без какой-либо дополнительной информации о программе. Весь код, данные и стек такой программы располагаются в одном сегменте и не могут превышать 64 килобайта. Файлы типа ЕХЕ содержат заголовок, в котором описывается размер файла, требуемый объем памяти, список команд в программе, использующих абсолютные адреса, которые зависят от расположения программы в памяти, и т.д. ЕХЕ-файл может иметь любой размер. Формат ЕХЕ также используется для исполнимых файлов в различных версиях DOS-расширителей и Windows, но со значительными изменениями.
19 Вопрос
Традиционно первая программа для освоения нового языка программирования — программа, выводящая на экран текст «Hello world!». He будет исключением и эта книга, так как такая программа всегда была удобной отправной точкой для дальнейшего освоения языка.
Итак, наберите в любом текстовом редакторе, который может записывать файлы как обычный текст (например: EDIT.COM в DOS, встроенный редактор в Norton Commander или аналогичной программе, NOTEPAD в Windows), следующий текст:
; hello-l.asm
; Выводит на экран сообщение "Hello World!" и завершается
.model tiny ; модель памяти, используемая для СОМ
.code ; начало сегмента кода
org 100h ; начальное значение счетчика - 100h
start: mov ah,9 ; номер функции DOS - в АН
mov dx,offset message ; адрес строки - в DX
int 21h ; вызов системной функции DOS
ret ; завершение СОМ-программы
message db "Hello World!",0Dh,0Ah,'$' ; строка для вывода
end start ; конец программы
и сохраните его как файл hello-l.asm. Можно также использовать готовый файл с этим именем. Чтобы превратить программу в исполнимый файл, сначала надо вызвать ассемблер, для того чтобы скомпилировать ее в объектный файл с именем hello-1.obj, набрав в командной строке следующую команду:
Для TASM:
tasm hello-1.asm
Для MASM:
ml /c hello-1.asm
Для WASM:
wasm hello-1.asm
С ассемблерными программами также можно работать из интегрированных сред разработки, как обычно работают с языками высокого уровня, но в них обычно удобнее создавать процедуры на ассемблере, вызываемые из программ на языке, для которого предназначена среда, а создание полноценных программ на ассемблере требует некоторой перенастройки.
Формат объектных файлов, используемых всеми тремя рассматриваемыми ассемблерами по умолчанию (OMF-формат), совпадает, так что можно пользоваться ассемблером из одного пакета и компоновщиком из другого.
Для TLINK:
tasm /t /x hello-1.obj
Для MASM (команда link должна вызывать 16-битную версию LINK.EXE):
link hello-1.obj,,NUL,,,
exe2bin hello-1.exe hello-1.com
Для WASM:
wlink file hello-1.obj form DOS COM
Теперь получился файл HELLO-1.COM размером 23 байта. Если его выполнить, на экране появится строка «Hello World!» и программа завершится.
Рассмотрим исходный текст программы, чтобы понять, как она работает.
Первая строка определяет модель памяти TINY, в которой сегменты кода, данных и стека объединены. Эта модель предназначена для создания файлов типа СОМ.
Директива .CODE начинает сегмент кода, который в нащем случае также должен содержать и данные.
ORG 100h устанавливает значение программного счетчика в 100h, так как при загрузке СОМ-файла в память DOS занимает первые 256 байт (100h) блоком данных PSP и располагает код программы только после этого блока. Все программы, которые компилируются в файлы типа СОМ, должны начинаться с этой директивы.
Метка START располагается перед первой командой в программе и будет использоваться в директиве END, чтобы указать, с какой команды начинается программа.
Команда MOV АН,9 помещает число 9 в регистр АН. Это — номер функции DOS «вывод строки».
Команда MOV DX,OFFSET MESSAGE помещает в регистр DX смешение метки MESSAGE относительно начала сегмента данных, который в нашем случае совпадает с сегментом кода.
Команда INT 21h вызывает системную функцию DOS. Эта команда — основное средство взаимодействия программ с операционной системой. В нашем примере вызывается функция DOS номер 9 — вывести строку на экран. Эта функция выводит строку от начала, адрес которого задается в регистрах DS:DX, до первого встреченного символа $. При загрузке СОМ-файла регистр DS автоматически загружается сегментным адресом программы, а регистр DX был загружен предыдущей командой.
Команда RET используется обычно для возвращения из процедуры. DOS вызывает СОМ-программы так, что команда RET корректно завершает программу.
Следующая строка программы HELLO-1.ASM определяет строку данных, содержащую текст «Hello World!», управляющий символ ASCII «возврат каретки» с кодом 0Dh, управляющий символ ASCII «перевод строки» с кодом 0Ah и символ «$», завершающий строку. Эти два управляющих символа переводят курсор на первую позицию следующей строки точно так же, как в строках на языке С действует последовательность «\n».
И наконец, директива END завершает программу, одновременно указывая, с какой метки должно начинаться выполнение программы.