Лабораторная работа №31 / lab3 EVM
.docСанкт-Петербургский государственный электротехнический университет
Отчёт по лабораторной работе №3
по дисциплине «Организация и функционирование ЭВМ»
Вариант №6
Проверил:
Выполнил: Юбрин А.Н.
Шин Е.Д.
Санкт-Петербург
2002
1. Цель работы
Разработать на языке Ассемблер IBM PC программу, которая по заданным целым значениям a,b,i,k вычисляет:
а) значения i1 = fn1_0(a,b,i) и i2 = fn2_0(a,b,i);
b) значения res= fn3_0(i1,i2,k),
Значения a,b,i,k являются исходными данными, которые должны выбираться студентом самостоятельно и задаваться в процессе исполнения программы в режиме отладки. При этом следует рассмотреть всевозможные комбинации параметров a,b и k, позволяющие проверить различные маршруты выполнения программы (по указанию преподавателя).
/ 4*i-7 , при a>b
fn1 = <
\-(2*i+6), при a<=b
/ 20-3*i , при a>b
fn2 = <
\ 2*i+7 , при a<=b
/ (|i1|-|i2|), при k<0
fn3 = <
\ max(7,|i2|), при k>=0
Некоторые сведения:
В программе используются условные операторы:
Такие как cmp, в результате в зависимости от результата устанавливаются или сбрасываются флаги в процессоре, после чего можно использовать условные переходы:
JA Переход если выше Jump if CF = 0 and ZF = 0 .
JNBE, переход если не ниже и не равно, - это та же команда, что и JA.
JAE Переход если выше или равно Jump if CF = 0
JNB, переход если не ниже, - это та же команда, что и JAE.
JB Переход если ниже Jump if CF = 1 .
JL переход если меньше
JBE Переход если ниже или равно Jump if CF = 1 or ZF = 1 .
JNA, переход если не выше, - это та же команда, что и JBE.
JC Переход если перенос Jump if CF = 1 .
JCXZ Переход если CX = 0 Jump if CX = 0 .
JE Переход если равно Jump if ZF = 1 .
JG Переход если больше Jump if ZF = 0 and SF = OF .
JGE Переход если больше или равно Jump if SF = OF .
JL Переход если меньше Jump if SF <> OF .
JLE Переход если меньше или равно Jump if SF <> OF or ZF = 1 .
JNAE - синоним JB. См. описание JB.
JNC Переход если нет переноса Jump if CF = 0 .
JNE Переход если не равно Jump if ZF = 0
JNO Переход если нет переполнения Jump if OF = 0 .
JNP Переход если нечетно Jump if PF = 0 .
JNS Переход если положительный результат Jump if SF = 0 .
JO Переход если есть переполнение Jump if OF = 1 .
JP(E) Переход если четно Jump if PF = 1 .
JS Переход если отрицательный результат Jump if SF = 1 .
Текст программы
EOFLine equ '$' ; Определение символьной константы
; "Конец строки"
a equ 1
b equ 2
i equ 3
k equ 4
; Стек программы
AStack segment STACK 'STACK'
dw 12 dup(?) ; Отводится 12 слов памяти
AStack ends
; Данные программы
DATA segment
; Директивы описания данных
i1 dw 0
i2 dw 0
res dw 0
respr db 'res = 0000', 0Ah, 0Dh, EOFline
mem1 db 3
mem2 db 4
mem3 db 2
HELLO db 'Здравствуйте!', 0Ah, 0Dh, EOFLine
GREETING db ' ст.гр.0341 - Добряков М.М.', 0Ah, 0Dh, EOFLine
DATA ends
; Код программы
CODE segment
assume CS:CODE, DS:DATA, SS:AStack
; Процедура печати строки
WriteMsg proc near
mov AH, 9
int 21h ; Вызов функции DOS по прерыванию
ret
WriteMsg endp
TETR_TO_HEX proc near
; перевод двоичного изображения 16-ричной цифры в символьный код,
; AL - содержит байт с исходной цифрой в младшей тетраде и
; возвращает результирующий код символа,
; используемые регистры AX
and AL, 0Fh
cmp AL, 09
jbe NEXT
add AL, 07
NEXT: add AL, 30h
ret
TETR_TO_HEX endp
;-------------------------------
BYTE_TO_HEX proc near
; перевод двоичного байта в символьный код двух 16-ричных цифр,
; AL - содержит исходный байт,
; результирующие коды символов: в AL- код старшей цифры,
; в AH- код младшей цифры,
; используемые регистры - AX,CX
mov AH, AL
call TETR_TO_HEX
xchg AL, AH
mov CL, 4
shr AL, CL
call TETR_TO_HEX
ret
BYTE_TO_HEX endp
;
;-------------------------------
;
WRD_TO_HEX proc near
; перевод 16-ти разрядного числа
; в строку символов 4-х цифр в 16 с/с,
; в AX - число, DI - адрес последнего символа
; используемые регистры - BX
push BX
mov BH, AH
call BYTE_TO_HEX
mov [DI], AH
dec DI
mov [DI], AL
dec DI
mov AL, BH
call BYTE_TO_HEX
mov [DI], AH
dec DI
mov [DI], AL
pop BX
ret
WRD_TO_HEX endp
;------------------------------------------
F11 proc near
push AX
mov AX, i
shl ax, 2
sub AX, 7
mov i1, AX
pop AX
ret
F11 endp
F12 proc near
push AX
mov AX, i
shl AX, 1 ; 2*i,pез-т в AX
add AX, 6 ; 2*i+6, pез-т в AX
neg AX ; Смена знака
mov i2, AX
pop AX
ret
F12 endp
F21 proc near
push AX
mov AX, i
imul mem1
neg ax ; 3*i ,pез-т в AX
add AX, 20 ; pез-т в AX
mov i2, AX ; возможно,т.к. i2 DW
pop AX
ret
F21 endp
F22 proc near
push AX
mov AX, i
shl AX, 1 ; 2*i,pез-т в AX
add AX, 7 ; 2*i+7, pез-т в AX
neg AX ; Смена знака
mov i2, AX
pop AX
ret
F22 endp
max proc near
push AX
mov AX, i2
call p_abs
cmp AX, 7
jl ret7
; mov AX, i2
mov res, AX
pop AX
ret
ret7:
mov res, 7
pop AX
ret
max endp
p_abs proc
locals @@
test AX, AX
jge @@exit
neg AX
@@exit:
ret
p_abs endp
f32 proc near
push AX
mov ax,i1
call p_abs
mov res,ax
mov ax,i2
call p_abs
add res,ax
pop ax
ret
f32 endp
; Головная процедура
Main proc far
mov AX, DATA ; Загрузка сегментного
mov DS, AX ; регистра данных.
mov DX, offset HELLO ; Вывод на экран первой
call WriteMsg ; строки приветствия.
mov DX, offset GREETING ; Вывод на экран второй
call WriteMsg ; строки приветствия.
sub AX, AX
mov AL, a
cmp AL, b ; вычитает b из a (a-b)
jg callf1 ; pез-т сpавнения больше нyля,a>b
call f12 ; если a<=b, то i1-по 2-ой ветви,
call f22 ; i2-по 2-ой ветви,
jmp cont_res
callf1:
call f11 ; если a>b, то i1-по 1-ой ветви,
call f21 ; i2-по 1-ой ветви,
cont_res:
mov AL, k
cmp AL, 0
jl callf32 ; pез-т сpавнения больше нyля,a>b
call max ; если a<=b, то i1-по 2-ой ветви,
jmp fin_res
callf32:
call f32
;callmax: call max
fin_res:
lea DI, respr
add DI, 9
mov AX, res
call wrd_to_hex
mov DX, offset respr
call WriteMsg
mov AX, 4C00h ; Я вставлял
int 21h
Main endp
CODE ends
end Main
Вывод: В результате проведенной лабораторной работы, мы освоили использование математических операций, для вычисления выражений, а также способы написаний ветвлений.