Лабораторная работа №8 Организация подпрограмм 


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



ЗНАЕТЕ ЛИ ВЫ?

Лабораторная работа №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 с.)