Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
101
Добавлен:
02.05.2014
Размер:
249.86 Кб
Скачать

2.4. Пример программы на Ассемблере

TITLE EX_PROG

PAGE ,132

STACK SEGMENT PARA STACK ‘STACK’

DB64DUP(‘STACK’) ; Область стека

STACK ENDS

DSEG SEGMENT PARA PUBLIC ‘DATA’

SOURCEDB10,20,30,40 ; эта таблица будет скопирована

DESTDB4DUP(?) ; в эту таблицу в обратном порядке

DSEGENDS

SUBTTLОСНОВНАЯ ПРОГРАММА

PAGE

CSEG SEGMENT PARA PUBLIC ‘CODE’

ASSUME CS:CSEG, DS:DSEG, SS:STACK

OUR_PROG PROC FAR

;занести в стек такие начальные значения, чтобы программа

; могла возвратить управление отладчику

PUSHDS ; поместить в стек номер блока адреса возврата

SUBAX,AX ; обнулить регистр АХ, тоже можно сделать командой MOVAX,0

PUSHAX ; поместить в стек значение адреса возврата=0

; инициировать адрес сегмента данных

MOV AX,DSEG

MOV DS,AX

; присвоить элементам таблицы DEST нулевые начальные значения

MOVDEST,0 ; обнуление 1-ого байта

MOVDEST+1,0 ; обнуление 2-ого байта

MOVDEST+2,0 ; обнуление 3-его байта

MOVDEST+3,0 ; обнуление 4-ого байта

; скопировать таблицу SOURCE в таблицу DEST в обратном порядке, в качестве промежуточной ячейки пересылки использовать регистр AL

MOV AL, SOURCE

MOV DEST+3,AL

MOV AL, SOURCE+1

MOV DEST+2,AL

MOV AL, SOURCE+2

MOV DEST+1,AL

MOV AL, SOURCE+3

MOVDEST,AL

RET ; возврат управления отладчику db

OUR_PROG ENDP

CSEG ENDS

ENDOUR_PROG

3. Порядок выполнения работы

1. Набрать приведенную в тексте программу на ассемблере с использованием редактора текста.

2. Оттранслировать программу в объектный код.

3. Скомпоновать программу (получить исполнимый файл). Изучить листинг программы.

4. Провести отладку программы и проверить получаемые результаты.

5. Внести в программу следующие изменения: задать исходную таблицу SOURCE из 5 двухбайтовых шестнадцатеричных переменных и скопировать эту новую таблицу в DEST.

6. В сегменте данных определить переменные, заполнив их следующими значениями:

  • 5 байтов A, B, C, D, E;

  • 5 двухбайтовых слов AA, BB, CC, DD, EE;

  • 5 двойных слов AAAA, BBBB, CCCC, DDDD, EEEE;

7. Получить исполнимый файл программы с данными пункта 6 и изучить дамп памяти данных с целью уяснения механизма выравнивания.

4. Содержание отчета

Отчет должен включать:

а) титульный лист;

б) формулировку цели работы;

в) описание результатов выполнения пунктов 3-7:

• листинги программ;

• результаты выполнения программ;

г) выводы, согласованные с целью работы.

5. Контрольные вопросы

1. Какие группы регистров выделяются в микропроцессоре и каковы особенности их использования?

2. Какую функцию в микропроцессоре выполняет регистр флагов?

3. Как используется регистр команд IP?

4. Какие шаги необходимо выполнить для получения из программы на языке ассемблера исполняемого модуля?

5. Прокомментируйте содержание листинга программы.

6. В каких окнах и в каком виде отображается состояние микропроцессора при отладке программ с применением отладчика td.exe?

Лабораторная работа № 2

Режимы адресации

  1. ЦЕЛЬ РАБОТЫ

Целью работы является разработка простой программы преобразования данных для приобретения практических навыков программирования на языке ассемблера и закрепления знаний по режимам адресации.

2. ОСНОВНЫЕ ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

2.1. Команды ассемблера

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

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

Команда может включать до 4-х полей следующего вида:

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

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

GETCOUNT: MOV CX,DX ;инициализация счетчика, поместить содержимое регистра DX в регистр CX

Пример команды с полем мнемокода:

PUSHF

Эта команда сохраняет в стеке содержимое регистра флагов.

Перечень команд ассемблера, применяемых во всех моделях микропроцессоров Intel приводится в приложении 2.

В качестве операнда в команде может фигурировать константа, которая может вводиться в следующих формах:

а) двоичной, как последовательность цифр 0 и 1, заканчивающихся буквой В, например, 10111010В;

б) десятичной, в привычной десятичной системе счисления с необязательной буквой D на конце, например, 129D или просто 129;

в) шестнадцатеричной, как последовательность цифр от 0 до 9 и букв от A до F, заканчивающаяся буквой H. Если шестнадцатеричная константа начинается с буквы, то такая константа дополняется первым символом - цифрой от 0 до 9, например, 0E23H (в данном случае первая цифра информирует Ассемблер о том, что E23 число, а не идентификатор или переменная);

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

Мнемокоды могут иметь от 2 до 6 букв, при трансляции мнемокод преобразуется в числовое значение по таблице перекодировки (внутри транслятора). Мнемокоды имеют жесткий формат, предусматривающий 1,2 или отсутствие операндов. Если операндов 2 , они отделяются друг от друга запятой.

Нельзя использовать в качестве меток имена регистров и мнемокоды, кроме того метка должна начинаться с буквы, но может содержать цифры и специальные символы: ?, @/, _, $ и точку, однако точка может быть только первым символом метки.

Важной особенностью машинных команд является то, что они не могут манипулировать одновременно 2-мя операндами, находящимися в оперативной памяти (ОЗУ). Это означает, что в команде только 1 операнд может указывать на ячейку ОЗУ, другой операнд должен быть либо регистром, либо непосредственным значением. По этой причине возможны следующие сочетания операндов в команде:

а) регистр - регистр;

б) регистр - память;

в) память – регистр;

г) регистр - непосредственный операнд;

д) память - непосредственный операнд.

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

Соседние файлы в папке Лекции по ассемблеру