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

1117

.pdf
Скачиваний:
2
Добавлен:
07.01.2021
Размер:
880.85 Кб
Скачать

osh_v db 0

 

rezult dq 0

 

kol dq 0

 

datasg ends

; конец сегмента данных

;- сегмент кода----------------------------------

 

codesg segment para 'Code' ; para – параграф (сегмент должен начинаться с

;

адреса, кратного шестнадцати, т.е. на границе параграфа)

begin proc far

; начало процедуры (begin – имя процедуры; far – дальняя)

assume cs:codesg,ds:datasg,ss:stacksg ; директива, устанавливающая соответствие

;сегментных регистров (cs, ds, ss) сегментам (ее обычный вид для EXE-программы)

;следующие строки должны быть в любой EXE-программе:

push ds

 

; сохранение содержимого регистра ds в стеке (для возврата в DOS)

xor ax,ax

 

; ax:=0

 

push ax

 

; ячейка в стеке для MS-DOS (требование – д.б. равна нулю)

mov ax,datasg

; инициализация регистра ds (заносится адрес

mov ds,ax

 

; начала сегмента данных)

;---------

 

 

 

mov ax,0600h

;\

| ah=06(прокрутка),al=00(весь экран)

mov bh,07

 

; \

| нормальный атрибут (черно-белый)

mov cx,0000 ;

очистка экрана | верхняя левая позиция

mov dx,314fh

; /

| нижняя правая позиция

int 10h

 

;/

| передача управления в BIOS

mov ah,02

 

;\

| установка курсора

mov bh,00

 

; \

| экран 0

mov dh,00 ; управление курсором | строка 00

mov dl,00

 

; /

| столбец 00

int 10h

 

;/

| передача упр. в BIOS

snova:

 

 

 

xor ax,ax

;\

 

 

mov al,b1

; | b1*b2

 

mul b2

;/

 

 

mov word ptr rezult,ax

; занесение одного слова в байты rezalt и rezalt+1, т.е. в

;

мл. слово учетверенного слова rezalt (байты с rezalt+2 по rezalt+7 не изменяются)

 

call bin_ASCII

;вызов процедуры перевода из bin в ASCII

 

mov ah,09h

;вывод на экран

 

lea dx,msg_b1b2

; сообщения «b1*b2=»

 

int 21h

 

 

 

 

mov ah,09h

;вывод на экран

 

lea dx,ascval

; полученного значения

 

int 21h

 

 

 

 

 

call cursor

 

 

 

 

mov ax,w1

 

 

 

 

mul w2

; w1*w2

 

 

mov word ptr rezult,ax

; занесение одного слова в байты rezalt и rezalt+1

 

mov word ptr rezult[2],dx

; занесение одного слова в байты rezalt+2 и rezalt+3

;

call bin_ASCII

 

 

(байты с rezalt+4 по rezalt+7 не изменяются)

 

;вызов процедуры перевода из bin в ASCII (результат -> в ascval)

 

mov ah,09h

; вывод на экран

 

 

 

 

 

111

lea dx,msg_w1w2

; сообщения « w1*w2= »

int 21h

 

 

 

mov ah,09h

 

; вывод на экран

lea dx,ascval

 

; полученного значения

int 21h

 

 

 

 

call cursor

 

 

 

xor bx,bx

;\

 

 

mov ax,w1

; | w1*b1

 

 

mov bl,b1

; |

 

 

mul bx

;/

 

 

mov word ptr rezult,ax

 

; занесение одного слова в байты rezalt и rezalt+1

mov word ptr rezult+2,dx

; занесение одного слова в байты rezalt+2 и rezalt+3

;

 

 

 

(байты с rezalt+4 по rezalt+7 не изменяются)

call bin_ASCII

 

;вызов процедуры перевода из bin в ASCII

mov ah,09h

 

; вывод на экран

lea dx,msg_w1b1

 

; сообщения « w1*b1= »

int 21h

 

 

 

mov ah,09h

 

; вывод на экран

lea dx,ascval

 

; полученного значения

int 21h

 

 

 

 

call cursor

 

 

 

xor ax,ax

 

 

 

mov al,b1

 

 

 

mul w2

 

 

 

mov word ptr rezult,ax

 

; занесение одного слова в байты rezalt и rezalt+1

mov word ptr rezult+2,dx

; занесение одного слова в байты rezalt+2 и rezalt+3

;

 

 

 

(байты с rezalt+4 по rezalt+7 не изменяются)

call bin_ASCII

 

;вызов процедуры перевода из bin в ASCII

mov ah,09h

 

; вывод на экран

lea dx,msg_b1w2

 

; сообщения «b1* w2= »

int 21h

 

 

 

mov ah,09h

 

;вывод на экран

lea dx,ascval

 

; полученного значения

int 21h

 

 

 

 

call cursor

 

 

 

mov ah,02 ;\

| установка курсора

mov bh,00 ; \

| экран 0

mov dh,24 ; управление курсором | строка 24

mov dl,00

; /

| столбец 00

int 10h

;/

| передача упр. в BIOS

mov ah,09h ;\

 

 

lea dx,msg_e ; вывод на экран сообщения «Для вывода нажмите любую клавишу»

int 21h

;/

mov ah,0

; ожидание нажатия клавиши

int 16h

 

ret

;выход в DOS

begin endp

 

; процедуры

-----------------------------

 

112

;сюда вставляется текст процедуры l_1proc7.asm из файла с таким же именем include l_1proc7.asm

;сюда вставляется текст процедуры bin_ASCII из файла bin_asci.asm

include bin_asci.asm codesg ends

end begin

==================================================================

Пример 1.8

;lab1pr8.asm ред. 17_12_05

;РАЗРАБОТАЛ МИШУРИН А.О., СТУДЕНТ ГРУППЫ 11БИ, ИЮЛЬ 2003 ГОДА. ;Программа (работает с МП 8086) вычисляет по формулам: w1/b1; b1/b2; d1/w1.

;Компиляция (clab1pr8.bat):

;tasm.exe lab1pr8.asm

;tlink.exe lab1pr8.obj

;-сегмент стека---------------------------------

stacksg segment para stack 'Stack' db 1024 dup(?)

stacksg ends

;-сегмент данных----------------------------------

datasg segment para 'Data' msg_b1 db "b1=","$" msg_w1 db "w1=","$" msg_d1 db "d1=","$" msg_b1b2 db "b1/b2=","$" msg_w1w2 db "w1*w2=","$" msg_d1w1 db "d1/w1=","$" msg_w1b1 db "w1/b1=","$"

msg_e db "Для выхода нажмите любую клавишу!","$" msg_err1 db "Ошибка#1: ошибка ввода!","$" msg_err2 db "Ошибка#2: деление на нуль!","$" ascval db "00000000000000000000","$" perevod_cursora db 0dh,0ah,"$"

; сюда вставляются списки параметров (из файла vvod_bwd.asm)

include vvod_bwd.asm ; include – директива, вставляющая в текст программы текст

;

файла (в данном случае вставляется текст файла vvod_bwd.asm)

b1 db 255

 

b2 db 10

 

w1 dw 65535

 

w2 dw 1000

 

d1 dd 2147483647

 

d2 dd 3000000000

 

prom dw 0

 

promd dd 0

 

fml dd 0

 

osh_v db 0

 

rezult dq 0

 

kol dq 0

 

datasg ends

; конец сегмента данных

 

113

;- сегмент кода----------------------------------

; para – параграф (сегмент должен начинаться с

codesg segment para 'Code'

;

адреса, кратного шестнадцати, т.е. на границе параграфа)

begin proc far

; начало процедуры (begin – имя процедуры; far– дальняя)

assume cs:codesg,ds:datasg,ss:stacksg ; директива, устанавливающая соответствие

;сегментных регистров (cs, ds, ss) сегментам (ее обычный вид для EXE-программы)

;следующие строки должны быть в любой EXE-программе:

push ds

 

 

 

 

sub ax,ax

 

 

 

 

push ax

 

 

 

 

mov ax,datasg

 

 

 

mov ds,ax

 

 

 

 

mov ax,0600h

;\

| ah=06(прокрутка), al=00(весь экран)

mov bh,07

 

; \

| нормальный атрибут (черно-белый)

mov cx,0000 ; очистка экрана | верхняя левая позиция

mov dx,314fh

; /

| нижняя правая позиция

int 10h

 

;/

| передача управления в BIOS

mov ah,02 ;\

 

| установка курсора

mov bh,00 ; \

 

| экран 0

 

mov dh,00 ; управление курсором | строка 00

mov dl,00

; /

 

| столбец 00

 

int 10h

;/

 

| передача упр. в BIOS

snova:

 

 

 

 

; деление слова на байт

 

 

xor dx,dx

;\

dx:=0

 

 

xor bx,bx

; \

bx:=0

 

 

mov ax,w1

; |w1/b1

ax:w1

 

mov bl,b1

; /

bx:=b1

 

div bx

;/

ax:= w1/b1 и dx:=остаток

mov word ptr rezult,ax

; подготовка к вызову bin_ASCII

call bin_ASCII

 

;вызов процедуры перевода из bin в ASCII

;

 

 

 

помещает результат в ascval

mov ah,09h

 

; вывод на экран

lea dx,msg_w1b1

 

; сообщения

«w1/b1= »

int 21h

 

 

 

 

mov ah,09h

 

; вывод на экран

lea dx,ascval

 

; полученного значения

int 21h

 

 

 

 

call cursor

 

 

 

 

 

; деление байта на байт

 

 

xor ax,ax

;\

 

 

 

mov al,b1

; | b1/b2

 

 

div b2

; |

 

 

 

xor ah,ah

;/

 

 

 

mov word ptr rezult,ax

 

 

call bin_ASCII

 

;вызов процедуры перевода из bin в ASCII

mov ah,09h

 

; вывод на экран

lea dx,msg_b1b2

 

;сообщения

«b1/b2=»

 

 

 

 

 

114

int 21h

 

 

mov ah,09h

; вывод на экран

lea dx,ascval

; полученного значения

int 21h

 

 

call cursor

 

 

 

;деление двойного слова на слово (d1/w1)

;деление вычитанием (результат верен даже в случае, когда частное превышает число

;65536, т.е. не помещается в слово)

cmp w1,0 ;\

 

 

 

jz s1er

 

; обнаружена попытка деления на нуль

mov ax,word ptr d1

 

 

mov dx,word ptr d1+2

 

 

xor bx,bx

 

 

 

xor cx,cx

 

 

 

s1: cmp dx,0

 

 

 

jnz s2

 

 

 

cmp ax,w1

 

 

 

jnb s2

 

 

 

jmp s3

; | d1/w1 (вычитанием) + проверка деления на нуль

s2: sub ax,w1

 

 

 

sbb dx,00

 

 

 

add bx,1

 

 

 

adc cx,0

 

 

 

jmp s1

 

 

 

s3: jmp s4

 

 

 

s1er: mov ah,09h

 

 

 

lea dx,msg_err2

 

 

 

int 21h

 

 

 

jmp sn_e

 

 

 

s4:

 

 

 

mov word ptr rezult,bx

 

 

mov word ptr rezult+2,cx

 

 

call bin_ASCII

 

;вызов процедуры перевода из bin в ASCII

mov ah,09h

 

;вывод на экран

lea dx,msg_d1w1

 

; сообщения «d1/w1=»

int 21h

 

 

 

mov ah,09h

 

;вывод на экран

lea dx,ascval

 

; полученного значения

int 21h

 

 

 

call cursor

 

 

 

sn_e: mov

ah,02

;\

|

установка курсора

mov bh,00

; \

| экран 0

mov dh,24 ; управление курсором | строка 23

mov dl,00

; /

| столбец 00

int 10h

;/

| передача упр. в BIOS

; деление через div (но если частное превышает число 65536, то результат НЕВЕРЕН!) mov ax,word ptr d1

mov dx,word ptr d1+2

115

div w1

 

 

mov word ptr rezult,ax

; результат деления d1/w1

mov word ptr rezult+2,0

 

 

call bin_ASCII

;вызов процедуры перевода из bin в ASCII

mov ah,09h

;вывод на экран

lea dx,msg_d1w1

; сообщения «d1/w1=»

int 21h

 

 

mov ah,09h

;вывод на экран

lea dx,ascval

; полученного значения

int 21h

 

 

call cursor

 

 

 

mov ah,09h

; вывод на экран сообщения

lea dx,msg_e

;"Для выхода нажмите любую клавишу!"

int 21h

 

 

mov ah,0

;-ожидание нажатия клавиши

int 16h

 

 

ret

; возврат в DOS

begin endp

 

 

;процедуры

;сюда вставляется текст процедуры l_1proc7.asm из файла с таким же именем include l_1proc7.asm

;сюда вставляется текст процедуры bin_ASCII из файла bin_asci.asm

include bin_asci.asm codesg ends

end begin

116

 

 

 

 

 

 

 

 

 

 

Приложение 1.1

 

 

Варианты формул для программирования

 

 

 

 

Первая формула (в 1 5, 7, 9 12 и 14 лабораторных работах)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Выполняемые

Выполняемые

 

 

Выполняемые

п/п

вычисления

п/п

вычисления

 

 

п/п

вычисления

1

b1+b2-w1*w2+d1/b3

17

 

w1*w2-d1/b1+w3+b2

33

d1+b1-w1*w2*b3+w3/b2

2

b1-b2+w1*w2-d1/b3

18

 

w1*w2+d1/b1-(w3+b2)

34

d1-b1-w1*w2*b3+w3/b2

3

w1+w2-b1*b2+d1/b3

19

 

b1*b2-w1/b3+d1+d2

35

d1+w1+b4-b1*b2+w2/b3

4

w1-w2+b1*b2-d1/b3

20

 

b1*b2+w1/b3-(d1-d2)

36

d1-w1+b1*b2*b4-w2/b3

5

w1+b1-w1*w2+d1/b2

21

 

w1*w2-w3/b1+d1+b2

37

w1*w2*b3-d1/b1+b2+b3

6

w1-b1+w1*w2-d1/b2

22

 

w1*w2+w3/b1-(d1-b2)

38

w1*w2*b3+d1/b1-(b2-b3)

7

d1+d2-b1*b2+w1/b3

23

 

b1*b2-w1/b3+d1+w2

39

b1*b2*b3-d1/b3+w1+w2

8

d1-d2+b1*b2-w1/b3

24

 

b1*b2+w1/b3-(d1-w2)

40

b1*b2*b3+d1/b3-(w1+w2)

9

d1+b1-w1*w2+w3/b2

25

 

b1+b2+b3-w1*w2+d1/b3

41

w1*w2-d1/b1+w3+b2+b3

10

d1-b1-w1*w2+w3/b2

26

 

b1-b2-b3+w1*w2-d1/b3

42

w1*w2+d1/b1-w3+b2*b3

11

d1+w1-b1*b2+w2/b3

27

 

w1+w2+w3-b1*b2+d1/b3

43

b1*b2*b3-w1/b3+d1+d2

12

d1-w1+b1*b2-w2/b3

28

 

w1-w2-w3+b1*b2-d1/b3

44

b1*b2*b3+w1/b3-(d1-d2)

13

w1*w2-d1/b1+b2+b3

29

 

w1+b1+b3-w1*w2+d1/b2

45

w1*w2-w3/b1+d1+b2

14

w1*w2+d1/b1-(b2-b3)

30

 

w1-b1-b3+w1*w2-d1/b2

46

w1*b3+w3/b1-(d1-b2)

15

b1*b2-d1/b3+w1+w2

31

 

d1+d2-b1*b2*b4+w1/b3

47

b1*b2*b3-w1/b3+d1+w2

16

b1*b2+d1/b3-(w1+w2)

32

 

d1-d2+b1*b2*b4-w1/b3

48

b1*b2+w1/b3-(d1-w2)

 

 

Вариант № 49 для лабораторной работы №1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Выполняемые

 

Х1=

 

Выполняемые

Х1=

 

Выполняемые

Х1=

 

 

 

вычисления

 

 

 

вычисления

 

 

вычисления

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

b1*b2

 

1

 

d5/d6

12

 

w16-w17

23

 

 

 

w1*w2

 

2

 

d7/w9

13

 

w18+b17

24

 

 

 

b3*w2

 

3

 

d8/b10

14

 

w19-b18

25

 

 

 

b4*d1

 

4

 

w10/w11

15

 

d13+d14

26

 

 

 

w3*d2

 

5

 

w12/b11

16

 

d15-d16

27

 

 

 

w4*b5

 

6

 

d9/d10

17

 

d17+b19

28

 

 

 

d3*b6

 

7

 

d11/w13

18

 

d18-b20

29

 

 

 

d4*w5

 

8

 

d12/b12

19

 

d19+w20

30

 

 

 

b7/b8

 

9

 

b13+b14

20

 

d20-w21

31

 

 

 

w6/w7

 

10

 

b15-b16

21

 

 

 

 

 

 

 

w8/b9

 

11

 

w14+w15

22

 

 

 

 

 

b1, b2, b3 – переменные, занимающие один байт, т.е. определенные директивой db;

w1, w2, w3 – переменные, занимающие одно слово (два байта), т.е. определенные директивой dw;

d1, d2 – переменные, занимающие двойное слово (четыре байта), т.е. определенные в сегменте данных директивой dd.

117

Приложение 1.2

Структура (схема) программы

А. Общая структура

; Лабораторная работа №1 ; выполнена студентом группы <обозначение группы> <Фамилия Имя Отчество>;

;тема: «Определение данных. Операции двоичной арифметики. Экранные операции»

;вычисление по формуле <первая формула индивидуального задания>

; г.Омск, СибАДИ, <месяц> <год> г.

;Ограничения: не вводить отрицательных чисел;

;не получать отрицательный результат.

;Сегмент стека

;Сегмент данных

;Сегмент кода

;Начало сегмента кода

;Начало главной процедуры

;Директива, устанавливающая соответствие сегментных регистров сегментам (директива assume)

;Команды, которые должны быть в любой EXE-программе

;Вывод на экран сообщения 'Привет, пользователь!'

;Вывод на экран сообщения 'Эта программа производит вычисления по формуле d1 - (b1+ w1/b2)*w2’

;ввод с клавиатуры числа b1

;ввод с клавиатуры числа b2

;ввод с клавиатуры числа w1

;ввод с клавиатуры числа w2

;ввод с клавиатуры числа d1

; вычисление по формуле

<формула>

;Вывод результата на экран

;выход из главной процедуры (возврат в DOS)

;Конец главной процедуры

;Конец сегмента кода (директива ends)

;Конец программы (директива end)

118

Продолжение прил. 1.2

Б. Детализированная структура (шаг 1)

; Лабораторная работа №1 ; выполнена студентом группы <обозначение группы> <Фамилия Имя Отчество>;

;тема: «Определение данных. Операции двоичной арифметики. Экранные операции»

;вычисление по формуле <первая формула индивидуального задания>

; г. Омск, СибАДИ, <месяц> <год> г.

;Ограничения: не вводить отрицательных чисел;

;не получать отрицательный результат.

;Сегмент стека

;Начало сегмента стека (директива segment)

;резервирование ячеек памяти под стек

;Конец сегмента стека (директива ends)

; Сегмент данных

;Начало сегмента данных (директива segment)

;ячейки памяти b1, b2,…,bm, определенные директивой db;

;ячейки памяти w1, w2,…,wn, определенные директивой dw;

;ячейки памяти d1, d2,…,dk, определенные директивой dd;

;списки параметров для ввода с клавиатуры

;символьные константы (тексты сообщений, выдаваемых на экран)

;ячейки промежуточных результатов

;Конец сегмента данных (директива ends)

;Сегмент кода

;Начало сегмента кода (директива segment)

;Начало главной процедуры (директива proc)

;Директива, устанавливающая соответствие сегментных регистров сегментам (директива assume)

;Команды, которые должны быть в любой EXE-программе

;Вывод на экран сообщения 'Привет, пользователь!' ;Вывод на экран сообщения

;'Эта программа производит вычисления по формуле d1 - (b1+ w1/b2)*w2’

;ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа b1

;ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа b2

;ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа w1

;ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа w2

;ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа d1

; вычисление по формуле <формула> ; Вывод результата на экран

; выход из главной процедуры (возврат в DOS, команда ret)

;Конец главной процедуры (директива endp)

;Конец сегмента кода (директива ends)

;Конец программы (директива end)

119

Продолжение прил. 1.2

В. Детализированная структура (шаг 2)

; Лабораторная работа №1 ; выполнена студентом группы <обозначение группы> <Фамилия Имя Отчество>;

;тема: «Определение данных. Операции двоичной арифметики. Экранные операции»

;вычисление по формуле <первая формула индивидуального задания>

; г. Омск, СибАДИ, <месяц> <год> г.

;Ограничения: не вводить отрицательных чисел;

;не получать отрицательный результат.

;Сегмент стека

;Начало сегмента стека (директива segment)

;резервирование 1024 ячеек памяти под стек

;(директива db оператор dup)

;Конец сегмента стека (директива ends)

; Сегмент данных

;Начало сегмента данных (директива segment)

;ячейки памяти b1, b2,…,bm, определенные директивой db;

;ячейки памяти w1, w2,…,wn, определенные директивой dw;

;ячейки памяти d1, d2,…,dk, определенные директивой dd;

;списки параметров для ввода с клавиатуры значений, занимающих

;один байт, т.е. значений b1, b2,

; список параметров vvod_b (поле для символов - field_b);

;одно слово (w1, w2)

;список параметров vvod_w (поле для символов - field_w); двойное слово (d1)

;список параметров vvod_d (поле для символов - field_d);

;символьные константы (тексты сообщений, выдаваемых на экран)

;ячейки памяти, используемые процедурами ascii_binb, ascii_binw, ascii_bind, bin_ascii и др.

;ячейки промежуточных результатов

;Конец сегмента данных (директива ends)

;Сегмент кода

;Начало сегмента кода (директива segment)

;Начало главной процедуры (директива proc)

;Директива, устанавливающая соответствие сегментных регистров сегментам

(директива assume)

;Команды, которые должны быть в любой EXE-программе ;очистка экрана ;Вывод на экран сообщения 'Привет, пользователь!',

;Вывод на экран сообщения

;'Эта программа производит вычисления по формуле d1- (b1+ w1/b2)*w2’

;***************************************************************************

;ввод с клавиатуры и преобразование из ASCII в двоичное (bin) числа b1 ;***************************************************************************

;вывод на экран сообщения: 'b1= '

;ввод с клавиатуры (функция 0ah) значения переменной b1 в field_b списка параметров vvod_b

120

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]