Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву
Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Лабораторная работа №8 Организация подпрограмм
Цель работы: Изучить способы организации подпрограмм и передачи параметров.
Порядок выполнения работы 1. Изучить принципы организации подпрограмм: описание, связь по управлению, связь по данным; работу со стеком. Изучить режимы адресации. 2. Изучить работу команд call и ret, push и pop. 3. Изучить пример выполнения задания. Обратить внимание на передачу параметров в подпрограмму через стек и работу со стеком в теле подпрограммы, на использованные режимы адресации. 4. Разработать алгоритм решения индивидуального задания (детализация алгоритма должна быть максимально приближена к командам языка ассемблера; обязательно выделить часть алгоритма в виде подпрограммы с параметрами (необходимо использовать различные варианты передачи параметров: по ссылке, по значению); предусмотреть вывод результатов на экран), и записать его на языке C++. 5. Разработать программу на языке ассемблера, реализующую алгоритм п. 4, сохранить его в файл с расширением *.asm. 6. Разработанную программу транслировать в исполняемый файл (*.ехе), как описано в п. 4 порядка выполнения лабораторной работы №1. И запустить полученный файл, как описано в п. 6 порядка выполнения лабораторной работы №6. 7. Провести тестирование разработанной программы, на разных наборах входных данных, меня их в файле *.asm и выполняя пп.6. Если возникли ошибки, то перейти к пункту 5, если это не помогло, то к пункту 4. 8. Составить отчет
Пример выполнения задания Переменной С присвоить максимальное значение среди переменных A и B.
Текст программы на языке языке C++ #include "stdafx.h" #include <iostream>
int Max(int p1, int p2) { if (p1 > p2) return p1; else return p2; }
int main() { using namespace std; int A, B, C; cout << "Input A: "; cin >> A; cout << "Input B: "; cin >> B; C = Max(A, B); cout << "C="<<C; return 0; }
Рисунок 1. Пример работы программы на языке C++
Текст программы на языке ассемблер dosseg .model small .stack 200h .data A dw ? B dw ? C dw ? SA db 'Input A: $' SB db 0ah,'Input B: $' SC db 0ah,'C=$'
;данные для подпрограммы ввода целых чисел cr = 0dh ;cr присваиваем значение кода символа возврата каретки (клавиши «Enter») lf = 0ah ;lf присваиваем значение кода символа перевода строки в сегменте данных описываем область string для вводимой строки, сообщение об ошибке errmsg и флаг отрицательности числа negflag (0 – неотрицательное,0ffffh - отрицательное) string db 255, 0, 255 dup (?) errmsg db 'Недопустимый символ, можно' db 'использовать только цифры',cr,lf,'$' negflag dw ?
.code
IntegerIn proc start: mov ah,0ah;функцией 0a вводим строку символов и размещаем ее в области string lea dx,string int 21h xor ax,ax ;обнуляем ax, в котором будем формировать число lea si,string+2 ;устанавливаем si на первый символ введенной строки mov negflag,ax ;обнуляем флаг отрицательности числа (предполагаем, что оно ;будет неотрицательным) cmp byte ptr [si],'-';первый символ – это минус? jne m2 ;если нет – на m2 not negflag ;отмечаем, что число отрицательное ;(negflag не равен 0) inc si ;продвигаем si со знака числа к первой цифре jmp m3 ;прыгаем на разбор строки цифр m2: cmp byte ptr [si],'+';первый символ – это плюс? jne m3 ;если нет – на m inc si ;продвигаем si со знака числа к первой цифре ;анализируем текущий символ m3: cmp byte ptr [si],cr ;если это cr – строка закончилась, выходим ;из цикла разбора ;символов je ex1 cmp byte ptr [si],'0';если код символа меньше кода '0' – ;это не цифра jb err1 ;прыгаем на метку err1 cmp byte ptr [si],'9';если код символа больше кода '9' – ;это не цифра ja err1 ;прыгаем на метку err1 mov bx,10 ;домножаем полученное число на основание ;системы счисления mul bx sub byte ptr [si],'0';вычитаем код символа '0' (получаем очередную цифру) add al,[si] ;добавляем цифру к числу adc ah,0 inc si ;продвигаем si к следующему символу jmp m3 ;организуем цикл функцией 09 выводим сообщение об ошибке err1: lea dx,errmsg mov ah,9 int 21h jmp start ;повторяем ввод ex1: cmp negflag,0 ;число положительное? je ex ;если да – выходим neg ax ;меняем знак числа ex: ret IntegerIn endp
IntegerOut proc xor cx,cx ;обнуляем счетчик цифр mov bx,10 ;в bx помещаем делитель cmp ax,0 ;проверяем знак числа jge m ;если неотрицательное – на m neg ax ;иначе – меняем знак числа push ax ;сохраняем число перед вызовом функции, ;использующей ax mov ah,2 ;функцией 02 выводим знак '-' mov dl,'-' int 21h pop ax ;восстанавливаем число в ax m: inc cx ;считаем количество получающихся цифр xor dx,dx ;преобразуем делимое к 32 разрядам div bx ;получаем очередную цифру push dx ;сохраняем ее в стеке or ax,ax ;проверяем есть ли еще цифры jnz m ;если да – на метку m ;при выходе из цикла в стеке лежат цифры, в cx – их ;количество m1: pop dx ;извлекаем цифру из стека add dx,'0' ;преобразуем в код символа mov ah,2 ;функцией 02 выводим на экран int 21h loop m1 ;повторяем cx раз ret ;возвращаемся из процедуры IntegerOut endp
Max proc near push bp mov bp, sp mov ax, [bp+6] mov bx, [bp+4] cmp ax, bx jg go_exit mov ax, bx go_exit: pop bp ret 4 Max endp
Begin: mov ax,@Data mov ds, ax ;ввод Mov ah,09 Lea dx,SA Int 21h call IntegerIn mov A,ax Mov ah,09 Lea dx,SB Int 21h call IntegerIn mov B,ax
;решение mov ax, A push ax mov ax, B push ax call Max mov C, ax
;вывод Mov ah,09 Lea dx,SC Int 21h mov ax,C call IntegerOut
mov ax, 4C00h int 21h end Begin
Рисунок 2. Пример работы программы на языке ассемблер
Содержание отчета 1. Текст задачи 2. Запись алгоритма решения задачи на языке C++ 3. Схема алгоритма решения задачи 4. Текст программы на языке ассемблер 5. Тесты 6. Вывод
Варианты индивидуальных заданий В качестве индивидуального задания для выполнения работы следует использовать варианты заданий из лабораторной работы 2.
Контрольные вопросы 1. Специальные архитектурные средства для организации подпрограмм в МП Intel 8086, назначение этих средств. 2. Основные способы связи программных единиц. 4. Режимы адресации; вычисление исполнительного адреса. 5. Модели памяти и сегментация.
|
||
|
Последнее изменение этой страницы: 2024-06-17; просмотров: 55; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 216.73.217.176 (0.006 с.) |