Ассемблер методичка. Программа представляется в виде последовательности команд, каждая из которых записывается с помощью целого числа байт порядок команд однозначно определяется программой
Скачать 253 Kb.
|
2.6.Подготовка программ к выполнениюПрограммы на ассемблере подготавливаются к выполнению в 2 этапа: ассемблирование и компоновка. Ассемблирование выполняется программой tasm.exe с помощью команды DOS: Tasm имя_файла.asm Выходным файлом является файл с расширением obj. На этапе компоновки к нему обычно присоединяются различные библиотеки, однако для учебных программ это не нужно и компоновка выполняется командой: Tlink имя_файла.obj Результатом является exe-файл, который доступен для запуска и отладки. 2.7.Отладка программ в Turbo DebuggerДля отладки полученного exe-файла необходимо выполнить команду DOS: Td имя_файла.exe Произойдет запуск отладчика и загрузка exe-файла в него. На сообщение об отсутствии дополнительной отладочной информации следует нажать ОК. Рассмотрим области окна отладчика (рис.2.1):
Рис. 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. Порядок выполнения работы
Содержание отчета
Лабораторная работа №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, то в нем используется именно такая конструкция цикла с постусловием. Практическая часть Практическая часть работы включает выполнение следующих действий:
Правильность разработки и выполнения контролируется путем ручной трассировки составленного алгоритма с последующим сравнением результатов работы программы с результатами ручной трассировки. Варианты заданий Для всех заданий исходное число (числа) хранится в двухбайтовой ячейке (ячейках) сегмента данных, результат необходимо сохранить в однобайтовую ячейку сегмента данных. Под словосочетанием «сохранить результат» понимается запись результата в однобайтовую ячейку в сегменте данных. Во всех заданиях следует использовать только итерационные циклы и условные операторы.
Порядок выполнения работы
Содержание отчета
Лабораторная работа №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, шаг_цикла. Практическая часть Практическая часть работы включает выполнение следующих действий:
Правильность разработки и выполнения контролируется путем ручной трассировки составленного алгоритма с последующим сравнением результатов работы программы с результатами ручной трассировки. Варианты заданий Для всех заданий исходный массив хранится в сегменте данных, результаты необходимо сохранить в РОНы.
Порядок выполнения работы
Содержание отчета
4. Текст программы на ассемблере с комментариями. 5. Таблица трассировки программы. Лабораторная работа №4 ОРГАНИЗАЦИЯ РАБОТЫ С ПОДПРОГРАММАМИ Цель работы: изучение организации вызова подпрограмм в языке ассемблера, передачи параметров через стек и возврат значений из функции. Методические указания Передача параметров в подпрограммы языков высокого уровня обычно производится через стек. Поэтому вызов подпрограммы выглядит обычно следующим образом: PUSH пар_1 … PUSH пар_N CALL subrtn ADD sp, N*2 Рассмотрим, что происходит со стеком:
Subrtn PROC NEAR PUSH BP ; Сохранить старое значение BP MOV BP, SP … Тело подпрограммы … POP BP ; Восстановить значение BP Subrtn ENDP Рассмотрим стек после выполнения первых двух операторов подпрограммы:
BP+2 BP+4 BP+6 BP+8 Видно, что первый параметр находится по адресу SS:[BP+8], а второй – по адресу SS:[BP+6]. В |