Главная страница

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


Скачать 253 Kb.
НазваниеПрограмма представляется в виде последовательности команд, каждая из которых записывается с помощью целого числа байт порядок команд однозначно определяется программой
АнкорАссемблер методичка.doc
Дата21.03.2018
Размер253 Kb.
Формат файлаdoc
Имя файлаАссемблер методичка.doc
ТипПрограмма
#17015
страница6 из 7
1   2   3   4   5   6   7

2.6.Подготовка программ к выполнению



Программы на ассемблере подготавливаются к выполнению в 2 этапа: ассемблирование и компоновка. Ассемблирование выполняется программой tasm.exe с помощью команды DOS:

Tasm имя_файла.asm

Выходным файлом является файл с расширением obj. На этапе компоновки к нему обычно присоединяются различные библиотеки, однако для учебных программ это не нужно и компоновка выполняется командой:

Tlink имя_файла.obj

Результатом является exe-файл, который доступен для запуска и отладки.

2.7.Отладка программ в Turbo Debugger



Для отладки полученного exe-файла необходимо выполнить команду DOS:

Td имя_файла.exe

Произойдет запуск отладчика и загрузка exe-файла в него. На сообщение об отсутствии дополнительной отладочной информации следует нажать ОК. Рассмотрим области окна отладчика (рис.2.1):


Окно кода.

В нем отображаются команды, их адреса и машинные коды.

Окно значений регистров

Окно значений битов регистра FLAGS

Окно данных.

Отображает содержимое сегмента данных.

Окно стека.

Отображает содержимое стека



Рис. 2.1. Структура окна отладчика Turbo Debugger
При открытии окна отладчика окно данных отображает начало PSP, так как DS в этот момент указывает именно туда. Но при перенастройке DS в команде MOV DS,AX это окно не меняет содержимого. Чтобы отобразить в нем сегмент данных после выполнения этой команды, необходимо перейти в это окно (с помощью мыши или клавиши Tab), нажать комбинацию клавиш Ctrl+G, в появившемся окне ввести ds:0 и нажать Enter.

Для выполнения программы по шагам предназначены клавиши F7 и F8. Разница между ними заключается в обработке команды CALL. Нажатие F7 приводит к переходу на первую команду вызываемой подпрограммы, а нажатие F8 – к переходу к следующей за CALL команды вызывающей подпрограммы. Комбинация клавиш Ctrl+F2 позволяет заново начать выполнение программы с ее первой команды. Клавиша F4 позволяет выполнить программу до текущей строки.

В соответствующих окнах также можно просматривать содержимое регистров и стека.

3.ЛАБОРАТОРНЫЙ ПРАКТИКУМ



Лабораторная работа №1
ПРЕДСТАВЛЕНИЕ ДАННЫХ.

АРИФМЕТИКО-ЛОГИЧЕСКИЕ ОПЕРАЦИИ
Цель работы: изучение архитектуры МП Intel 8086, изучение структуры простейшей ассемблерной программы, ознакомление с системой арифметико-логических команд процессора, организация вычислений на языке ассемблера.
Методические указания
При выполнении арифметико-логических команд наибольшего быстродействия и удобства программирования можно достичь за счет использования аккумулятора (регистра AX) для хранения промежуточных результатов. Например, вычисление выражения D=A+B-C можно записать так:

MOV AX,A

ADD AX,B

SUB AX,C

MOV D,AX

При реализации операций деления необходимо помнить о том, что если результат не помещается целиком в регистре-приемнике (например, при делении 8B00h в регистре AX на 3 в регистре BL), возникает ошибка «деление на ноль» и программа аварийно завершается. Чтобы избежать подобных ситуаций, следует увеличивать размерность делимого и делителя. В нашем примере следует командой CWD расширить разрядность делимого и делить на BX, а не на BL (естественно, при этом BH должен быть равен 0).

Деление и умножение на степень двойки следует выполнять с помощью команд сдвига. Эти команды наиболее эффективны при их выполнении для регистра AX.
Практическая часть
Практическая часть работы включает выполнение следующих действий:

  • формирование числовых значений в соответствии с индивидуальным заданием, определение минимального формата представления исходных данных;

  • по заданному алгоритму составление и выполнение программы работы с данными.

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

Х1=№В*(-1)№В

Х2=(-1)№В+1*(№Г*№В)

Х3=(-1)№В+2*(№Г*№В+№Г)

Х4=(-1)№В+3*№Г

где №В – номер варианта, №Г – номер группы.

Варианты алгоритмов программ приведены на рис. 3.1, 3.2.
Порядок выполнения работы


  1. Определить исходные данные в соответствии с номером варианта.

  2. Перевести значения величин Х1-Х4 в шестнадцатеричную систему счисления.

  3. Провести трассировку заданного алгоритма с использова-нием заданных исходных данных.

  4. Составить программу заданного алгоритма в мнемокодах.

  5. Оформить отчет по лабораторной работе.

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


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


  1. Титульный лист.

  2. Текст задания.

  3. Алгоритм программы.

  4. Текст программы на ассемблере с комментариями.

  5. Таблица трассировки программы.


Лабораторная работа №2
УСЛОВНЫЕ И БЕЗУСЛОВНЫЕ ПЕРЕХОДЫ
Цель работы: изучение команд условного перехода, организации условных операторов и итеративных циклов.

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

Jусловие End_if



Операторы



End_if:

Заметим, что операторы в данном случае выполняются при невыполнении условия, в отличие от языков высокого уровня. Например, оператор языка Pascal

If A=0 then

A=5;

на языке ассемблера будет выглядеть так:

CMP WORD PTR A, 0

JNZ End_if1

MOV WORD PTR A, 5

End_if1 …

Как видно, в операторе If языка ассемблера условие заменяется на противоположное тому, что использовалось бы в языке высокого уровня.

Двухальтернативный условный оператор записывается в ассемблере так:

Jусловие If_ops



Операторы ветви Else



JMP End_if

If_ops: …

Операторы ветви If



End_if:

Здесь условие менять на противоположное не надо, так как при его выполнении выполнится блок If, а при невыполнении – блок Else.

Циклы с предусловием записываются в языке ассемблера следующим образом:

Cycle1: Jусловие End_cycle1



Операторы



JMP Cycle1

End_cycle1: …

Условие, как и для одноальтернативных условных операторов, нужно изменить по сравнению с языками высокого уровня на противоположное. Пример: цикл языка Pascal

While A<>0 do

A=A shr 1;

на ассемблере запишется так:

Cycle1: CMP BYTE PTR A, 0

JZ End_cycle1

MOV AL,A

SAR AL,1

MOV A,AL

JMP Cycle1

End_cycle1: …

Циклы с постусловием записываются на ассемблере так:

Cycle1: …

Тело цикла



Jусловие Cycle1

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

  • формирование исходных числовых значений;

  • в соответствии с индивидуальным заданием состав-ление алгоритма программы для решения поставленной задачи;

  • по алгоритму составление и выполнение программы.

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

  1. Подсчитать вес двоичного вектора и сохранить результат.

  2. Если число в состоит менее, чем из 3 десятичных цифр, сохранить их сумму, иначе сохранить 0.

  3. Найти и сохранить сумму четных десятичных цифр заданного числа.

  4. Найти и сохранить сумму нечетных десятичных цифр заданного числа.

  5. Найти и сохранить количество десятичных цифр в числе.

  6. Найти максимальную цифру в числе и сохранить ее.

  7. Найти и сохранить минимальную цифру в числе.

  8. Найти и сохранить номер максимальной цифры в числе, считая, что младшая цифра имеет номер 1, и номера увеличиваются в сторону старших цифр.

  9. В условиях задания №8 найти и сохранить номер минимальной цифры числа.

  10. Сохранить 1, если число содержит данную цифру, иначе сохранить 0.






  1. Найти и сохранить индекс первой со стороны младших цифр четной цифры числа, учитывая, что индекс вычисляется по правилам из задания №8.

  2. Найти сумму первых N натуральных чисел и сохранить ее.

  3. Найти сумму первых N натуральных положительных чисел и сохранить ее.

  4. Найти сумму первых N натуральных четных чисел и сохранить ее.

  5. Найти сумму первых N натуральных нечетных чисел и сохранить ее.



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


  1. Сформировать исходные данные в соответствии с вариантом.

  2. Составить алгоритм программы.

  3. Провести трассировку заданного алгоритма с использова-нием заданных исходных данных.

  4. Составить программу заданного алгоритма в мнемокодах.

  5. Оформить отчет по лабораторной работе.

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



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


  1. Титульный лист.

  2. Текст задания.

  3. Алгоритм программы.

  4. Текст программы на ассемблере с комментариями.

  5. Таблица трассировки программы.


Лабораторная работа №3
ОБРАБОТКА МАССИВОВ
Цель работы: изучение работы с массивами, организации арифметических циклов в языке ассемблера.
Методические указания
Работа с массивами возможна при использовании нескольких способов адресации (см. раздел 1.3): косвенной и индексной (как со смещением, так и без него).

Арифметические циклы на языке ассемблера организуются следующим образом:

MOV CX, число_итераций

Cycle1: …

Тело цикла



LOOP Cycle1

Следует помнить, что данный цикл в ассемблере всегда имеет форму:

For cx:=число_итераций downto 1 do

Тело_цикла;

Если необходимо использовать другой цикл, например, for i:=1 to число_итераций do тело_цикла, нужно дополнительно использовать ячейку памяти или регистр для использования в роли i. Пример:

MOV SI,1

MOV CX, число_итераций

Cycle1: …

Тело цикла



INC SI

LOOP Cycle1

Если необходим шаг цикла, отличный от единицы, следует вместо INC SI использовать ADD SI, шаг_цикла.

Практическая часть
Практическая часть работы включает выполнение следующих действий:

  • в соответствии с индивидуальным заданием состав-ление алгоритма программы обработки массивов, содержащих 10 элементов;

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

  • контроль результатов работы программы.

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

  1. Найти логическую сумму положительных элементов массива и записать ее в Rg AX, и логическую сумму отрицательных элементов массива, записать ее в Rg ВХ (формат элементов массива - байт).

  2. Найти максимальный элемент массива и записать его в Rg BH (формат элементов массива - байт).

  3. Найти сумму элементов массива, значение которых  3, и записать ее в Rg AL (формат элементов массива - байт).

  4. Посчитать количество элементов массива, равных нулю, и записать их в Rg AX (формат элементов массива - слово).

  5. Найти результат умножения максимального элемента массива на 25 и записать его в Rg BX, Rg CX (формат элементов массива - слово).

  6. Найти результат деления числа 100 на минимальный элемент массива и записать в Rg BX (формат элементов массива - байт).


  1. Найти количество положительных, нулевых и отрицательных элементов массива и записать в Rg AL, Rg BL и Rg DL соответственно (формат элементов массива - байт).

  2. Найти минимальный положительный элемент массива (его номер и значение) и записать в Rg BX и Rg DX соответственно (формат элементов массива - слово).

  3. Найти арифметическую сумму элементов массива, значения которых лежат в интервале -10 < X(i) < 20, и записать ее в Rg DH (формат элементов массива - байт).

  4. Найти количество элементов массива, имеющих отрицательное значение и четный номер, и записать в Rg AX (формат элементов массива - слово).

  5. Найти элемент массива, имеющий максимальное абсолютное значение, и записать в RgCX (формат элементов массива - байт).

  6. Найти отрицательный элемент массива, имеющий максимальное абсолютное значение, и записать в Rg DX (формат элементов массива - слово).

  7. Найти количество элементов массива, значения которых лежат в интервале - 20

  8. Найти сумму модулей элементов массива и записать в RgDХ (формат элементов массива - байт).

  9. Найти результат умножения индекса минимального элемента на 55 и записать его в RgBX (формат элементов массива - байт).


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


  1. Сформировать исходные данные в соответствии с вариантом.

  2. Составить алгоритм программы для решения поставленной задачи.

  3. Провести трассировку заданного алгоритма с использова-нием заданных исходных данных.

  4. Составить программу заданного алгоритма в мнемокодах.

  5. Оформить отчет по лабораторной работе.

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


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


  1. Титульный лист.

  2. Текст задания.

  3. Алгоритм программы.

4. Текст программы на ассемблере с комментариями.

5. Таблица трассировки программы.

Лабораторная работа №4
ОРГАНИЗАЦИЯ РАБОТЫ С ПОДПРОГРАММАМИ
Цель работы: изучение организации вызова подпрограмм в языке ассемблера, передачи параметров через стек и возврат значений из функции.
Методические указания
Передача параметров в подпрограммы языков высокого уровня обычно производится через стек. Поэтому вызов подпрограммы выглядит обычно следующим образом:

PUSH пар_1



PUSH пар_N

CALL subrtn

ADD sp, N*2
Рассмотрим, что происходит со стеком:



SP
















До вызова




SP







Адр. взвр

Пар_2

Пар_1

После вызова

После вызова


SP







Адр. взвр

Пар_2

Пар_1

После ADD

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

Subrtn PROC NEAR

PUSH BP ; Сохранить старое значение BP

MOV BP, SP



Тело подпрограммы



POP BP ; Восстановить значение BP

Subrtn ENDP

Рассмотрим стек после выполнения первых двух операторов подпрограммы:

BP

Адр. Возвр.

Пар_2

Пар_1
BP=SP

BP+2

BP+4
BP+6

BP+8
Видно, что первый параметр находится по адресу SS:[BP+8], а второй – по адресу SS:[BP+6].

В
1   2   3   4   5   6   7


написать администратору сайта