Команда безусловного перехода 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Команда безусловного перехода



Безусловный переход в программе на ассемблере производится по команде JMP. Полный формат команды следующий:

JMP [модификатор] адрес_перехода.

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

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

 

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

Прямой короткий внутрисегментный переход применяется, когда расстояние от команды JMP до адреса перехода не более чем 127 байтов выше или ниже. В этом случае транслятор языка формирует машинную команду безусловного перехода длиной 2 байта: первый байт – код операции, второй байт – смещение. В коде операции заложена информация о том, что второй байт интерпретируется как смещение. Здесь нужно отметить одну особенность большинства трансляторов ассемблера – они являются однопроходными, иными словами, машинный код программы получается за один просмотр команд от начала программы до ее окончания. В связи с этим обстоятельством, если безусловный переход должен происходить на адрес до команды JMP, то транслятор может легко вычислить смещение. Если же переход короткий, но на метку после команды JMP, то транслятору нужно подсказать, что он должен сформировать команду безусловного короткого перехода. С этой целью в команде JMP используется модификатор SHORT PTR (полностью - SHORT POINTER или короткий указатель):

JMP SHORT PTR M1

...... не более 35-40 команд

M1: MOV AL, 34H.

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

Косвенный внутрисегментный переход означает, что в команде JMP указывается не сам адрес перехода, а место, где этот адрес записан. Например:

LEA BX, M1

JMP BX

......

M1: MOV AL, 34H

Или

DSEG SEGMENT PARA PUBLIC ‘DATA’

ADDR DW M1

........

CSEG SEGMENT PARA PUBLIC ‘CODE’

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

......

JMP ADDR.

В командах косвенного перехода рекомендуется применять модификатор NEAR, т.к. при косвенном переходе не всегда транслятору удается определить, находится адрес перехода в текущем сегменте кода или нет.

 

МЕТОДИКА ВЫПОЛНЕНИЯ РАБОТЫ

 

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

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

- разработайте схему программы в терминах действий (смысловых операций обработки). В качестве комментариев к разработанной схеме могут быть описаны основные механизмы реализации программы;

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

- для более простой реализации на языках низкого уровня рекомендуется все блоки схемы программы помещать последовательно “в столбик”, от терминатора “начало” до терминатора “конец”. От блоков “решение” один выход должен идти к следующему блоку, а второй – к блоку выше или ниже в последовательности. Такое построение схем программ позволит при реализации сразу определять, где должны проставляться метки: если к блоку подходит более одной линии, первая команда такого блока должна быть помечена;

- используйте другие программы в качестве примеров. Несколько начальных и конечных команд во всех программах на языке ассемблера совершенно одинаковы. Используйте таблицы команд, приведенные в приложении В;

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

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

Проиллюстрируем применение этих рекомендаций на следующем примере: разработать схему и программу, которая в символьной строке подсчитывает количество символов латиницы в интервале от С до N, первый символ из этого интервала запоминает в переменной FIRST, а последний – в переменной LAST.

Прежде чем приступить к разработке схемы и программы, определим, какие исходные данные и переменные требуются для программы обработки. Это должны быть заданная строка символов, переменные FIRST и LAST, размер которых должен совпадать с размером символа в символьной строке, и счетчик количества символов, лежащих в заданном интервале, пусть это будет SCH. Уяснив состав переменных, можем определить сегмент данных следующим образом:

DSEG SEGMENT PARA PUBLIC ‘DATA’

STR DB8RFJM/96QZDLE[]X’;заданная символьная строка

Len_str=$-str;определяем длину строки

FIRST DB (); первый символ из диапазона

LAST DB (); последний символ из диапазона

SCH DB (0); количество символов из диапазона

FLAG DB (0); FLAG= 1 флаг установлен

DSEG ENDS

Схема программы с комментариями в виде команд программы приведена на рис. 3.

 

 

CSEG SEGMENT PARA PUBLIC ‘CODE’

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

Установить указатель на начало строки
OUR_PROG PROC FAR

PUSH DS

SUB AX,AX

PUSH AX

MOV AX,DSEG

MOV DS,AX

ДА XOR SI,SI

CYCL: CMP STR[SI],’C’

JB NEXT

 
 


НЕТ

 
 


CMP STR[SI],’N’

ДА JA NEXT

 


 

НЕТ

 
 


НЕТ TEST FLAG,1

JE M

 

 

ДА

 
 
Запомнить символ в FIRST и установить флаг


MOV AL, STR[SI]

MOV FIRST, AL

MOV FLAG,0

       
 
 
   
Запомнить символ в LAST

 


M: MOV AL, STR[SI]

MOV LAST, AL

       
 
 
   
Перейти к следую-щему символу


NEXT: INC SI

CMP SI, LEN_STR

JNE CYCL

RET

OUR_PROG ENDP

CSEG ENDS

НЕТ ДА END OUR_PROG

 


Рис. 3 – Схема и программа подсчета символов в заданном диапазоне

На рис. 3 в основном все команды записаны напротив соответствующих символов схемы. Исключения составляют команды и символы, соединенные стрелкой.

Ожидаемый результат обработки: FIRST=F, LAST=Е, SCH=6 (FJMDLE). Можете убедиться в правильном функционировании программы, набрав ее текст и просмотрев результаты в отладчике.

 

ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ

 

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

2. Изучить приведенный пример схемы и программы. Если остаются какие-то неясности в программе, рекомендуется ввести пример-программу в компьютер и отладить ее.

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

4. Используя программу предыдущей лабораторной работы, внести в нее изменения в соответствии с разработанной схемой программы.

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

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

 

Требования к содержанию и оформлению отчета

 

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

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

б) формулировку задачи работы;

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

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

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

г) вывод, согласованный с задачей работы.

 

Критерии результативности выполнения работы

 

Лабораторная работа считается успешно выполненной, если:

· ожидаемые результаты обработки совпадают с фактическими результатами работы программы;

· отчет на бумажном носителе содержит все необходимые пункты согласно требованиям;

· студент дает аргументированные пояснения по всем приведенным в отчете пунктам задания;

· студент отвечает на контрольные вопросы преподавателя.

 

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

1. Какой символ схемы программы соответствует командам сравнения и условного перехода?

2. Почему в Ассемблере используются разные команды условного перехода для сравнения чисел со знаком и чисел без знака? Поясните ответ на примере.

3. Какие ограничения накладываются на имена меток?

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

CMP AL,STR[SI]

JBE M1

M1: MOV AL, STR[SI]).

5. В каких случаях используется команда безусловного перехода? Поясните на примере.

 

Варианты заданий

 

1. В заданной символьной строке латинских букв найти все символы ‘a’ или ‘A’. Подсчитать их количество и заменить все такие буквы на символ ‘0’ (нуль).

2. В заданной символьной строке латинских букв найти все символы ‘Y’ или ‘y’. Определить номер последнего такого символа. Все найденные буквы ‘Y’ или ‘y’ заменить на символ ‘9’.

3. В заданной символьной строке найти все числовые символы, перенести их в область CHISLO. Подсчитать количество числовых символов в заданной строке. Определить значение первого числового символа и занести его в переменную FIRST.

4. В заданной символьной строке найти все символы арифметических операций (+, -, *, /) и заменить их на символ ‘0’. Определить, какой арифметический знак был найден в строке первым. Подсчитать количество арифметических знаков в символьной строке.

5. В заданном предложении определить количество слов (оно равно количеству пробелов +1). Определить длину первого слова (сколько в нем символов). Первое слово перенести в область FIRST.

6. В заданном предложении определить количество слов (оно равно количеству пробелов +1). Определить смещение последнего слова. Последнее слово перенести в область LAST.

7. В заданной символьной строке подсчитать количество строчных символов кириллицы. Определить позицию первого встреченного в строке символа из заданного диапазона и значение последнего символа из заданного диапазона. Позицию записать в переменную POZ, а значение – в переменную LAST.

8. В заданной символьной строке определить количество прописных символов латиницы. Определить значение первого встреченного в строке символа из заданного диапазона и позицию последнего символа из диапазона. Позицию записать в переменную POZ, а значение – в переменную FIRST.

 

 

ЛАБОРАТОРНАЯ РАБОТА № 4



Поделиться:


Последнее изменение этой страницы: 2017-02-17; просмотров: 192; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.137.171.121 (0.045 с.)