Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ПСМПС (лаб)

.pdf
Скачиваний:
20
Добавлен:
10.06.2015
Размер:
1.42 Mб
Скачать

31

3.Практическая часть

3.1.Исследование простейшей программы на ассемблере

спомощью отладчика CodeView

1. Для исследования выполнения и ознакомления с работой отладчика необходимо перекомпилировать и выполнить повторную сборку созданного в лабораторной работе № 1 проекта с соответствующими ключами командной строки (рис. 2.2).

Рис. 2.2. Окно отладчика с загруженным исходным кодом

2. Используя функциональные клавиши, выполнить переключение между различными видами отладчика.

3. Выполнить пошаговое выполнение (трассировку) программы и наблюдать за изменениями содержимого регистров процессора (рис. 2.3.)

Рис. 2.3. Окно просмотра регистров процессора в отладчике Code View

32

4.Выполнить программу до текущего положения курсора.

5.Используя функциональные клавиши, установить одну или несколько точек останова и выполнить программу.

6.Используя командую строку, выполнить несколько инструкций программы (например: P 1, P 3).

7.Отобразить дамп памяти (рис. 2.4) сегмента данных до и после вы-

полнение программ (например: DB DS:0000 L 5, DB DS:0000 L 25, DB DS:0010 L 5)

Рис. 2.4. Командное окно отладчика

3.2. Программирование арифметико-логических операций

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

text segment

'code'

 

assume CS: text, DS: data

begin:

mov

AX, data

mov

DS, AX

 

 

xor

AX,AX

 

; обнуляем AX

; суммирование без переноса старшего разряда

add

AL,17

; AL = AL+17

add

AL,sum1

; AL = AL+sum1

; суммирование с переносом старшего разряда

add

AL,sum2

; AL = AL+sum2

; маскирование битов

or

AL, 00000010h

; установка 1-й бита

and

AL, 11111101h

; сброс 1-й бита

; инкремент и декремент регистров

33

inc AH dec AL

;меняем местами содержимое AH и AL

;и возвращаем на место

xchg AH,AL xchg AH,AL

mov AH, 4ch mov AL, 00h int 21h

text ends

data segment sum1 db 10

sum2 db 229

data ends

end begin

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

3.3Задания

1.Изучить материал разделов 2.1-2.3.

2.Выполнить примеры из разделов 3.1-3.2

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

вотладчике.

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

1.Объясните основное назначение программного отладчика.

2.Перечислите базовые функции программного интерактивного отлад-

чика.

34

3.Назовите виды отладчиков и их основные различия.

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

5.Приведите базовые положения функциональной классификации машинных команд Intelсовместимых микропроцессоров.

6.Перечислите основные команды пересылки данных, укажите их формат и возможные примеры применения.

7.Перечислите основные логические команды, укажите их формат и приведите примеры их применения.

8.Перечислите основные двоичные арифметические команды, укажите их формат и приведите примеры их применения.

35

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

КОМАНДЫ ПЕРЕДАЧИ УПРАВЛЕНИЯ И ЦИКЛИЧЕСКИЕ КОМАНДЫ. ПРОГРАММИРОВАНИЕ НЕЛИНЕЙНЫХ АЛГОРИТМОВ

НА АССЕМБЛЕРЕ

1. Цель работы

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

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

2.Основные теоретические сведения

2.1.Классификация команд передачи управления

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

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

То, какая инструкция будет выполнена следующей, определяется содержимым пары регистров CS:IP, в которой CS – сегментный регистр кода, задающий базовый адрес текущего сегмента кода, а IP – регистр указатель команд, содержащий смещение инструкции, которая будет выполнена следующей. Поэтому любая команда передачи управления неявно изменяет со-

36

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

По принципу действия команды передачи управления делятся на три группы:

команды безусловной передачи управления;

команды условной передачи управления;

команды управления циклом.

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

Метка может быть определена в программе на ассемблере с помощью оператора (:) следующим образом:

<label name>: <instruction>

Этот синтаксис можно показать с помощью диаграммы Бэкуса-Нуара

(рис. 3.1):

метка :

Инструкция

Рис. 3.1. Описание метки в ассемблере с помощью оператора (:)

Вторым способом определения метки является ее задание с помощью оператора label:

<label name> label <label type>

 

метка

 

label

 

тип метки

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 3.2. Описание метки в ассемблере с помощью оператора label

Например, следующие описания меток ближнего типа эквивалентны:

37

l1: mov AX, DX

l1 label near mov AX, DX

2.2. Инструкция безусловного перехода

Команда JMP передает управление в другую точку программы, не сохраняя какой-либо информации для возврата:

jmp [modifier] <jump address>

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

Взависимости от типа перехода различают:

переход типа SHORT (короткий переход) – если адрес перехода находится в пределах от -127 до +128 байт от команды JMP;

переход типа NEAR (ближний переход) – если адрес перехода находится в том же сегменте памяти, что и команда JMP;

переход типа FAR (дальний переход) – если адрес перехода находится в другом сегменте. Дальний переход может выполняться и в тот же самый сегмент, если в сегментной части операнда указано число, совпадающее с текущим значением CS;

переход с переключением задачи – передача управления другой задаче в многозадачной среде. Этот вариант перехода реализуется в защищенном режиме при переключении контекстов задач.

Первые два вида переходов типа SHORT и NEAR называются внутрисегментными. При их выполнении команда JMP фактически изменяет значение регистра EIP (или IP), изменяя тем самым смещение следующей исполняемой команды относительно начала сегмента кода. Если операнд – регистр или переменная в памяти, то его значение просто копируется в EIP, как если бы это была команда MOV. Если операнд для JMP – непосредственно указанное число, то его значение суммируется с содержимым EIP, приводя к относительному переходу. В ассемблерных программах в качестве операнда обычно указывают имена меток, но на уровне исполняемого кода ассемблер вычисляет и записывает именно относительные смещения.

38

Выполняя дальний переход в реальном режиме, виртуальном режиме и в защищенном режиме (при переходе в сегмент с теми же привилегиями), команда JMP просто загружает новое значение в EIP и новый селектор сегмента кода в CS, используя старшие 16 бит операнда как новое значение для CS и младшие 16 или 32 – как значение IP или EIP.

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

lea

CX, l1

;

загрузка СХ адресом метки

l1

jmp

CX

;

адрес перехода в регистре

CX

2.3. Инструкции условных переходов и команда сравнения CMP

Набор команд типа JХХ предназначен для выполнения условного перехода типа SHORT или NEAR, если удовлетворяется соответствующее условие:

jхх <jump address>

Условием в каждом случае реально является состояние тех или иных флагов, но, если команда из набора JХХ используется сразу после СMР, условия приобретают формулировки, соответствующие отношениям между операндами СMР (см. табл.). Например, если операнды СMР были равны, то команда JE, выполненная сразу после этого СMР, осуществит переход. Операнд для всех команд из набора JCC – 8-битное или 32-битное смещение относительно текущей команды.

Слова «выше» и «ниже» в таблице относятся к сравнению чисел без знака, слова «больше» и «меньше» учитывают знак.

Таблица 2.1/ Соответствия между операндами инструкции СМР и условным переходом

Код команды

Состояние флагов

Условие для CMP

ja

CF = 0 и ZF = 0

если выше

jnbe

 

если не ниже или равно

jae

CF = 0

если выше или равно

 

 

 

39

 

 

 

 

 

 

 

 

jnb

 

 

 

если не ниже

 

jnc

 

 

 

если нет переноса

 

 

 

 

 

Окончание табл. 2.1.

jb

CF = 1

 

если ниже

 

jnae

 

 

 

если не выше или равно

 

jc

 

 

 

если перенос

 

jbe

CF = 1 и ZF = 1

 

если ниже или равно

 

jna

 

 

 

если не выше

 

je

ZF = 1

 

если равно

 

jz

 

 

 

если ноль

 

jg

ZF = 0 и SF = OF

 

если больше

 

jnle

 

 

 

если не меньше или равно

 

jge

SF = OF

 

если больше или равно

 

jnl

 

 

 

если не меньше

 

jl

SF <> OF

 

если меньше

 

jnge

 

 

 

если не больше или равно

 

jle

ZF = 1 и SF <> OF

 

если меньше или равно

 

jng

 

 

 

если не больше

 

jne

ZF = 0

 

если не равно

 

jnz

 

 

 

если не ноль

 

jno

OF = 0

 

если нет переполнения

 

jo

OF = 1

 

если есть переполнение

 

jnp

PF = 0

 

если нет четности

 

jpo

 

 

 

если нечетное

 

jp

PF = 1

 

если есть четность

 

jpe

 

 

 

если четное

 

jns

SF = 0

 

если нет знака

 

js

SF = 1

 

если есть знак

 

Надо отметить, что источником условия может служить не только команда сравнения, но и любая арифметическая команда, изменяющая состояние арифметических флагов ZF, SF, CF, OF, PF.

Команда CMP предназначена для сравнения операндов:

cmp <operand1>, <operand2>

40

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

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

.data

 

mas db dup(?)

 

.code

 

..........

 

cmp mas[si], 5

; сравниваем элемент массива с 5

je eql

; переход если равно

jl low

; переход если меньше

jg grt

; переход если больше

eql:

 

..........

 

low:

 

..........

 

grt:

 

2.4. Инструкции организации циклов

Несмотря на то, что циклические алгоритмические структуры могут быть реализованы и с помощью инструкций условной передачи управления, однако, учитывая важность такого алгоритмического элемента, как цикл, разработчики микропроцессора ввели в систему команд группу из трех инструкций, облегчающую программирование циклов. Эти команды используют регистр ECX/CX в качестве счетчика цикла.

Инструкция LOOP позволяет организовать простые циклы, подобные циклам for в языках высокого уровня с автоматическим уменьшением счетчика цикла:

loop <jump address>

Работа команды заключается в выполнении следующих действий: декремента регистра ECX/CX, сравнения регистра ECX/CX с нулем: при равен-