Assembler. Лабораторная работа №4. (4 часа).

“Разработка и применение подпрограмм”

Цели:

Ход работы:

1. Изучить (повторить) теоретический материал: Тема 11. Организация подпрограмм.

2. Получить (уточнить) у преподавателя номер своего варианта.

3. Выбрать из списка номер своего варианта:

1 2 3 4 5 6 7 8 9 10 11 12

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

5. Изучить примеры программ.

6. Разработать программу для своего варианта.

7. Протестировать программу.

8. Оформить отчет по лабораторной работе - в начале asm-файла записать как комментарий:

9. Сдать преподавателю выполненную работу: скопировать папку с файлами проектов (asm, obj, exe) в папку "Рабочий стол\ЛР-сдача\№группы_Фамилия_№ЛР", например, 29в_Петров_4. Оценки по проверенным работам можно посмотреть в электронном журнале.


Примеры программ:

Пример 1.

Составить программу вычисления y = n! - m! Для вычисления факториала создать подпрограмму (процедуру Factor с возвращением результата). Процедуру Factor записать в текущем файле. Передачу параметра в процедуру и возврат результата организовать через регистры cx и ax соответственно.

 

.model small
.stack 100h
.data
n dw 5
m dw 4
y dw ?
.code
    begin: mov ax,@data
    mov ds,ax
    mov cx,m ;cx:=m
    call Factor ;вычислить m!
    mov bx,ax ;bx:=m!
    mov cx,n ;cx:=n
    call Factor ;вычислить n!
    sub ax,bx ;ax:=n!-m!

    mov y,ax ;y:=ax
    mov ah,4ch ;выход из программы
    int 21h

Factor proc ;подпрограмма
          mov ax,1 ;ax:=1
    for: imul cx ;ax:=ax*cx
          loop for ;cx:=cx-1
          ret ;возврат в основную программу
Factor endp
end begin

 

Пример 2.

Составить программу вычисления:

                       

Для вычисления суммы создать процедуру Summa во внешнем файле. Передачу параметров (предел суммирования) передать через стек. Результат возвратить в регистре ax.

 

Текст основного файла (main.asm)
.model small
.stack 100h
extrn Summa:proc
.data
n dw 7
m dw 5
y dw ?
.code
begin: mov ax,@data
        mov ds,ax

        push m ;передача параметра m
        call Summa ;вычислить S2 (в ax)
        mov bx,3
        imul bx ;ax:=ax*3
        mov bx,ax ;bx:=3*S2
        push n ;передача параметра n
        call Summa ;вычислить S1 (в ax)
        mov dx,2
        imul dx ;ax:=ax*2
        sub ax,bx ;ax:=2*S1-3*S2
        mov y,ax ;y:=ax
        mov ah,4ch ;выход из программы
        int 21h
end begin

 

Текст внешнего файла (sum.asm)
.model small
.code
begin:
Summa proc
Public Summa
        push bp ;”пролог”-для доступа
        mov bp,sp ;к параметрам в стеке
        mov cx,[bp+4] ;cx:=параметр ;(предел суммирования)

        mov ax,0 ;ax:=0
 for: add ax,cx ;ax:=ax+cx
        loop for ;cx:=cx-1
        pop bp ;возврат из процедуры и
        ret 2 ;очистка стека от параметра
Summa endp
end begin

 

Выполнить трансляцию файлов main.asm и sum.asm по отдельности. Для компоновки дать команду: tlink main sum

 


Индивидуальные задания

Вариант 1.

Составить подпрограмму для вычисления суммы:

Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через регистры. Результат возвратить в регистре ax.

В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 7; n = 12

 Вариант 2.

Составить подпрограмму для вычисления суммы:

Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через регистры. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 7; n = 9

Вариант 3.

Составить подпрограмму для вычисления суммы:

 

Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через стек. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 9; n = 8 

Вариант 4.

Составить подпрограмму для вычисления суммы:

Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через стек. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 10; n = 8 

Вариант 5.

Составить подпрограмму для вычисления суммы:

Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через общую область памяти. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 5; n = 8 

Вариант 6.

Составить подпрограмму для вычисления суммы:

 

Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через общую область памяти. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 5; n = 12 

Вариант 7.

Составить подпрограмму для вычисления суммы:

 

Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через регистры. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = 15; n = 12 

Вариант 8.

Составить подпрограмму для вычисления суммы:

 

Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через регистры. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = -20; n = 5 

Вариант 9.

Составить подпрограмму для вычисления суммы:

Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через стек. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = -12; n = 30 

Вариант 10.

Составить подпрограмму для вычисления суммы:

Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через стек. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = -4; n = 7 

Вариант 11.

Составить подпрограмму для вычисления суммы:

Подпрограмму разместить во внешнем файле. Параметры (x, n) в подпрограмму передать через стек. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных: a) x = 2; n = 2; b) x = -2; n = 3; c) x = -28; n = 5 

Вариант 12.

Составить подпрограмму для вычисления суммы:

Подпрограмму разместить в текущем файле. Параметры (x, n) в подпрограмму передать через регистры. Результат возвратить в регистре ax. В основной программе организовать вызов подпрограммы для следующих наборов исходных данных:  a) x = 2; n = 2; b) x = -2; n = 3; c) x = 100; n = 10