Объектный код программыЧасть 1. Первоначальные сведения об ассемблере и разработке программ для процессора 8086 Глава 1. Пример разработки простейшей программы на ассемблере Создание исходного текста программы На рис. 1.1 приведен текст простейшей программы на ассемблере, выводящей на экран строку " Hello-o-o-o!".
; Данные программы DATA SEGMENT HELLO DB 'Hello-o-o-o!$' DATA ENDS CODE SEGMENT ASSUME CS: CODE, DS: DATA START: mov AX, DATA Mov DS,AX Mov AH,9; вывод сообщения Mov DX,OFFSET HELLO Int 21h Mov AH,4Ch; выход из программы Int 21h CODE ENDS END START Рис. 1.1. Простейшая программа. Чтобы создать файл с исходным текстом данной программы, надо запустить текстовый редактор, набрать приведенный на рис. 1.1 текст и сохранить его в файле с любым именем и расширением.ASM (расширение может отличаться от.ASM, но тогда при вызове Turbo Assembler нужно будет указывать его вместе с именем файла, тогда как расширение.ASM транслятор использует по умолчанию). Трансляция, компоновка и запуск программы на выполнение Подготовив текст программы и сохранив его в текстовом файле (например, HELLO.ASM), можно переходить к созданию исполняемого файла, который будет запускаться на выполнение, как любая программа DOS. На рис. 1.2 представлена схема разработки программ на Assembler. Как видно, из рисунка, процесс создания программы включает подготовку исходного текста программы, трансляцию его в файл специального вида, называемого объектным файлом,и компоновку полученного -объектного файла (или полученных объектных файлов, если создаваемая программа состоит из нескольких модулей) в выполняемый файл. После того как в результате компоновки получен выполняемый файл, его можно загрузить и выполнить в DOS. Если в результате работы созданной программы возникнет необходимость в изменениях ее алгоритма, весь процесс повторяется сначала. Для трансляции HELLO.ASM необходимо в строке приглашения DOS ввести: MASM hello После этого произойдет вызов Assembler, которому в качестве параметра будет передано имя файла, содержащего исходный текст программы (так как расширение не задано, Assembler будет считать, что используется расширение,ASM). Если текст программы набран правильно, то в результате работы транслятора на экране появится следующий текст:
D:\masm.exe hello Microsoft (R) Macro Assembler Version 5.00 Copyright (C) Microsoft Corp 1981-1985, 1987. All rights reserved.
На вопросы отвечаем нажатием Enter
Object filename [hello.OBJ]: Source listing [NUL.LST]: Cross-reference [NUL.CRF]:
51298 + 380702 Bytes symbol space free
0 Warning Errors 0 Severe Errors Это означает, что процесс трансляции завершился успешно. В этом случае Assembler создает файл HELLO. OBJ, содержащий оттранслированную программу Если в процессе трансляции будут обнаружены ошибки, то объектный файл не создается, а сообщения об ошибках появляются в пункте Severe Errors. Тогда необходимо отредактировать исходный текст программы, устранив в нем указанные в сообщениях ошибки, и повторить трансляцию.
Рис. 1.2. Создание программы на ассемблере.
После получения объектного файла выполняется его компоновка в выполняемый файл. Для этого используется компоновщик Link. Для запуска компоновщика необходимо ввести строку:
LINK hello
После этого произойдет запуск на выполнение компоновщика с передачей ему в качестве параметра имени объектного файла (по умолчанию используется расширение.OBJ). При работе компоновщика на экране должно появиться сообщение:
D:\link.exe hello
Microsoft (R) Overlay Linker Version 3.69 Copyright (C) Microsoft Corp 1983-1988. All rights reserved.
На вопросы отвечаем нажатием Enter
Run File [HELLO.EXE]: List File [NUL.MAP]: Libraries [.LIB]:
LINK: warning L4021: no stack segment Это означает, что процесс компоновки завершился успешно и на диске создан файл программы HELLO. ЕХЕ, готовый к выполнению (на предупреждающее сообщение Warning в данном случае можно не обращать внимания). Теперь созданную программу можно запустить на выполнение, введя в строке приглашения DOS имя исполняемого файла hello. В результате работы программы на экране появится строка
Hello-o-o-o!
Таким образом, процесс создания программы успешно завершен! Из исходного текста программы, находящегося в файле HELLO.ASM, транслятором создан объектный файл HELLO.OBJ, из которого, в свою очередь, компоновщик создал выполняемый файл HELLO. ЕХЕ. Кроме того, компоновщик создает карту использования памяти (файл с расширением.MAP), которая может понадобиться для анализа компоновки программы, состоящей из нескольких объектных файлов. Объектный код программы
Если при трансляции программы на вызов Assembler
Source listing [NUL.LST]: ввести hello то транслятор помимо объектного файла создаст текстовый файл HELLO.LST, в котором, в частности, будет содержаться информация, приведенная на рис. 1.3. Этот файл называется файлом листинга. Листинг предназначен для представления объектного кода программы в шестнадцатиричном виде вместе с соответствующим ему исходным текстом.
0000 DATA SEGMENT 0000 48 65 6C 6C 6F 2D 6F HELLO DB 'Hello-o-o-o!$' 2D 6F 2D 6F 21 24 000D DATA ENDS 0000 CODE SEGMENT ASSUME CS: CODE, DS: DATA 0000 B8 ---- R START: mov AX, DATA 0003 8E D8 mov DS,AX 0005 B4 09 mov AH,9 0007 BA 0000 R mov DX,OFFSET HELLO 000A CD 21 int 21h 000C B4 4C mov AH,4Ch 000E CD 21 int 21h 0010 CODE ENDS END START
Рис. 1.3. Фрагмент листинга HELLO.LST.
Объектный код находится слева от исходного текста программы. Заметим, что некоторые строки программы не порождают объектного кода. Это объясняется тем, что в данных строках находятся не команды процессора и не данные, с которыми они работают, а директивы ассемблера, предназначенные для управления процессом трансляции. Второй вывод, который можно сделать, анализируя этот листинг, каждой ассемблерной команде соответствует свой код, причем одинаковые команды могут иметь разные коды. Причиной такого разнообразия кодирования одних и тех же команд служит вид операндов, с которыми работают эти команды. Например, команды
|