
- •1.Оформление лабораторных работ.
- •2.Лабораторная работа 1. Вычисление арифметического выражения.
- •3.Лабораторная работа 2. Программа табулирования функций, использующая ввод чисел с клавиатуры.
- •4.Лабораторная работа 3. Обработка одномерных массивов.
- •5.Лабораторная работа 4. Обработка двумерных массивов.
- •6.Лабораторная работа 5. Обработка строковых данных.
- •7.Лабораторная работа 6. Многомодульные программы.
-3- -4-
Целью лабораторных работ является изучение языка Ассемблер для персональных ЭВМ типа IBM PC, а также овладение навыками программирования на языке Ассемблера.
1.Оформление лабораторных работ.
Отчет должен содержать следующие пункты:
Задание.
Контрольный пример.
Блок-схема (кроме лабораторной работы 1)
Текст программы.
Результаты выполнения программы.
2.Лабораторная работа 1. Вычисление арифметического выражения.
Целью работы является изучение команд, выполняющих основные арифметические действия, а также процедур: печати значений целых чисел и печати текстов.
Для выполнения этой работы следует взять за основу исходный текст программы “Labn1.ASM”. В сегмент данных вписать свои переменные и их значения. В сегмент кодов в процедуру MAIN ввести операторы, выполняющие действия, соответствующие индивидуальному заданию.
Ниже приведен пример заполнения текста программы для вычисления Y=(A+B)/C2.
DSEG SEGMENT
; индивидуальные переменные начало
a dw 3
b dw 8
c dw -2
;индивидуальные переменные конец
y dw ?
text1 db 10,13,'Вычисление значения функции y = (a + b) / c*с',10,13,'$'
text db 'ответ y=$'
buffer db 6 dup(?),'$'
DSEG ENDS
STACKSG SEGMENT
dw 100 dup(?)
stacksg ends
codes segment
main proc far
assume cs:codes,ds:dseg,ss:stacksg
mov ax,dseg
mov ds,ax
lea dx,text1
call prt
; индивидуальная часть программы начало
mov ax,c
imul ax
mov bx,ax
mov ax,a
add ax,b
cwd
idiv bx
mov y,ax
; индивидуальная часть программы конец
lea dx,text
call prt
mov ax,y
call prn
mov ah,1 ; задержка экрана
int 21h
mov ah,4ch ; конец программы, выход в операционную систему
int 21h
main endp
; ***********************************************
prt proc ; процедура печати текста
; в регистре dx хранится адрес начала текста, который нужно напечатать
push ax
mov ah,09h
int 21h
pop ax
ret
prt endp
; ***********************************************
prn proc ; процедура печати целого числа
; в регистре ax хранится целое число, которое нужно напечатать
push bx
push dx
push ax
lea bx,buffer
call convba
mov dx,bx
mov ah,09h
int 21h
pop ax
pop dx
pop bx
ret
prn endp
; **************************************************
convba proc ; процедура перевода двоичного числа в строку ASCII-кодов
; в регистре ax хранится целое число, которое нужно преобразовать в ;строку ASCII-кодов
;в регистре bx - адрес начала поля, в котором будет получено число
; в формате ASCII-кодов.
push cx
push dx
push si
push ax
mov cx,6
c10:
mov byte ptr[bx],' '
inc bx
loop c10
mov si,10
or ax,ax
jns c20
neg ax
c20:
xor dx,dx
div si
add dx,30h
dec bx
mov [bx],dl
or ax,ax
jnz c20
pop ax
or ax,ax
jns c30
dec bx
mov byte ptr[bx],'-'
c30:
pop si
pop dx
pop cx
ret
convba endp
; *************************************************
codes ends
end main
Для защиты лабораторной работы нужно знать
Типы сегментов. Регистры. Загрузка сегментных регистров.
Команды сложения, вычитания, умножения, деления.
Команда CALL.
Процедуры PRT, PRN,. CONVBA.
Варианты заданий:
Y=(A+B*C)/2
Y=(A+B)*(C-D)/S2
Y=(A-B2)/ (C-D)
Y=A/B2-100/D
Y=(A-B+C)2/S
Y=(A+B)3-C/D
Y=A3+B*C/(A-D)
Y=((A+B)/(C-D))*S
Y=(A2+B*C)/D
Y=(A+B+C)/(2*D)
Y=(A3+B*C)/A-D
Y=(A3+B)*C/A
Y=(A+B2)/(C2-D3)
Y=A+B2/(C-D3)
Y=(A-B)/(C2+D3)
Y=A/B+(C-D)/3
Y=A*B-(C-D)/2
Y=A3/B+C-D/3
Y=(A*C-D)/(3*B)
Y=3*A/(B+C-D)
Y=A*B+C/D-L
Y=(A*B+C)/D-L
Y=A*B+C/(D-L)
Y=A*(C+B)/D
Y=(A*C+B)/D2
Y=(A+C*B)/2*D
Y=(A*C+B*D)/2
Y=A2+(C+B)/(D-2)
Y=A2*C+(B/D-5)
Y=A*C+B2/D2
Y=2*A*(C+B/(D+2))
Y=(A*C+B)/(D2+10)
Y=A*(C2-B)/D
Y=A+(C-B)2/(D+4)