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

“Разработка программ с циклами”.

Цели:

Ход работы:

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

 

2. Выполнить контрольный тест по теме №10 "Программирование циклов".

 

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

 

4. На данную работу предлагается 2 задачи:

 

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

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

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

 

7. Внимательно изучить примеры программ.

 

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

 

9. Протестировать программы.

 

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

 

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


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

; Задача 1. Составить программу вычисления суммы N первых четных чисел.

;================================
    .model small
    .stack 100h
    .data
N dw 5 ;2+4+6+8+10
S dw ?
;=================================

    .code
begin:  mov ax,@data
            mov ds,ax
            mov cx,N     ;cx:=N
            mov bx,2     ;bx:=2
            mov ax,0     ;ax:=0
for:      jcxz exit
            add ax,bx     ;ax:=ax+bx
            add bx,2       ;bx:=bx+2
            loop for       ;cx:=cx-1; если cx>0 на for:
exit:     mov S,ax     ;S:=ax
            mov ah,4ch
            int 21h
end begin
;=================================

 

; Задача 2. Подобрать натуральные x,y (одну комбинацию, наибольшее y при наибольшем х), ;удовлетворяющих равенству 2x+3y=12. Найденные x, y записать в память.

;================================
    .model small
    .stack 100h
    .data

a dw 2
b dw 3
c dw 12
x dw ?
y dw ?

    .code
begin:  mov ax,@data
            mov ds,ax
            mov cx,6         ;цикл по x от 6 до 1
for_x: push cx
            mov cx,4         ;цикл по y от 4 до 1
for_y:  pop ax             ;ax:=x
            push ax            ;сохранить значение стека
            mul a               ;ax:=x*a
            mov bx,ax       ;bx:=ax
            mov ax,cx       ;ax:=y
            mul b               ;ax:y*b
            add ax,bx         ;ax:=a*x+b*y
            cmp ax,c          ;ecли ax=c то
            je break            ;перейти на break
            loop for_y       ;y:=y-1,если y>0 перейти на for_y

            pop cx              ;cx:=x (из стека)
            loop for_x       ;x:=x-1, если x>0 перейти на for_x
            jmp exit           ;нет подходящих x,y => перейти на exit
break:  mov y,cx         ;запись найденной комбинации в память
            pop ax             ;y=2
            mov x,ax         ;x=3
exit:     mov ah,4ch     ;выход в ОС
            int 21h
end begin


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

Вариант 1.

1. Составить программу вычисления суммы первых N натуральных четных чисел. Протестировать программу при N=5.

 

2. Составить программу, подбирающую натуральные X и Y (одну комбинацию, наибольшее Y при наибольшем X), удовлетворяющие равенству: 2*X + 3*Y = 120. Найденные X, Y записать в память.

Вариант 2.

1. Составить программу вычисления произведения первых N натуральных четных чисел. Протестировать программу при N=4.

 

2. Составить программу, подбирающую натуральные X и Y (одну комбинацию, наименьшее Y при наименьшем X), удовлетворяющие равенству: 2*X + 3*Y = 120. Найденные X, Y записать в память.

Вариант 3.

1. Составить программу вычисления суммы первых N натуральных нечетных чисел. Протестировать программу при N=5.

 

2. Составить программу, подбирающую натуральные X и Y (одну комбинацию, наименьшее Y при наименьшем X), удовлетворяющие равенству: X2 + Y2 = 1201. Найденные X, Y записать в память.

Вариант 4.

1. Составить программу вычисления произведения первых N натуральных нечетных чисел. Протестировать программу при N=4.

 

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

Протестировать программу при: n=3; m = 5.

Вариант 5.

1. Составить программу вычисления суммы первых N натуральных чисел. Протестировать программу при N=5.

 

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

Протестировать программу при: n=3; m = 5.

Вариант 6.

1. Составить программу вычисления произведения первых N натуральных  чисел (факториала N). Протестировать программу при N=5.

 

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

Протестировать программу при: n=3; m = 5.

Вариант 7.

1. Составить программу вычисления суммы N натуральных чисел, хранящихся в памяти как массив A. Протестировать программу при: N=5; A=(2, 5, 1, 3, 7).

 

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

Протестировать программу при: n=3; m = 5.

Вариант 8.

1. Составить программу вычисления произведения N натуральных чисел, хранящихся в памяти как массив. Протестировать программу при: N=5; A=(2, 5, 1, 3, 7).

 

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

Протестировать программу при: n=3; m = 5.

Вариант 9.

1. Составить программу вычисления суммы 6-ти байт памяти от адреса start_adr в сегменте данных. Протестировать программу при следующем определении в сегменте данных:

start_adr db 'Program'

 

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

Протестировать программу при: n=3; m = 5.

Вариант 10.

1. Составить программу вычисления произведения 6-ти байт памяти от адреса start_adr в сегменте данных. Протестировать программу при следующем определении в сегменте данных:

start_adr db '14.03'

 

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

Протестировать программу при: n=3; m = 2.

Вариант 11.

1. Составить программу вычисления суммы 5-ти слов в памяти от адреса start_adr в сегменте данных. Протестировать программу при следующем определении в сегменте данных:

start_adr dw F1h, A10h, Ah, ADh, 123h

 

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

Протестировать программу при: n=3; m = 2.

Вариант 12.

1. Составить программу вычисления произведения 5-ти слов в памяти от адреса start_adr в сегменте данных. Протестировать программу при следующем определении в сегменте данных:

start_adr dw 1h, 2h, Ah, Bh, 100h

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

Протестировать программу при: n=3; m = 2.