Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
53.25 Кб
Скачать

Санкт-Петербургский государственный электротехнический университет

Отчёт по лабораторной работе №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

Вывод: В результате проведенной лабораторной работы, мы освоили использование математических операций, для вычисления выражений, а также способы написаний ветвлений.