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

2591

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

mul bx ; результат (произведение) возвращается в (dx:ax) ret

submul endp codesg ends

end submul

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

Пример 2.2

;lb2_1pr2.asm ред. 11_02_06 stacksg segment para ‘Stack’

db 100h dup (?) stacksg ends

datasg segment para ‘Data’

;*************************************************************************** soob db 'текст для выдачи из модуля 2_2 (текст расположен в модуле 2_1)','$'

*

;*************************************************************************** datasg ends

codesg segment para ‘Code’

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

extrn myproc:proc

*

public soob

*

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

begin:

mov ax,datasg mov ds,ax

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

;в регистре ax по-прежнему начало сегмента данных (передается в модуль 2_2)

*

; если же – нет, то его надо загрузить:

mov ax, <адрес начала сегмента>

*

; т.е. в нашем случае надо: mov ax,datasg

*

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

call near ptr myproc

 

; вызов процедуры, расположенной в модуде 2_2

mov ax,4c00h

 

; завершение программы 2_1

int 21h

 

 

 

codesg ends

 

 

 

end begin

 

 

 

;--------------------------------------------------------------------------------------------------------------

 

 

 

;lb2_2pr2.asm

 

ред. 11_02_06

 

codesg segment para ‘Code’

 

 

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

 

public myproc

*

 

extrn soob:byte

*

 

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

 

myproc proc near

 

 

 

mov ds, ax ; восстановление регистра ds

(нужно, чтобы правильно

;

указывать начало сегмента данных,в котором находится soob)*

mov ah,09h

 

 

 

lea dx,ds:soob

 

 

 

 

 

61

 

int 21h ret

myproc endp codesg ends end

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

Пример 2.3

; lab2and.asm EXE-программа для демонстрации операции "логическое И"

;(работает с МП 8086)

;Компиляция: tasm.exe lab2and.asm

;tlink.exe lab2and.obj

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

stacksg segment para 'Stack' db 128 dup (?)

stacksg ends

; --------------------------------------------

datasg segment para 'Data' soob1 db 'Привет!',0dh,0ah,'$'

;

soob2

db '1234',0ah,0dh,'$'

b1

db '4'

;34h или 0011 0100

b2

db '7'

;37h или 0011 0111

;b3

db 3

; в примере

;w1

dw 64

; не используются

datasg ends

;---------------------------------------------------

codesg segment para 'Code'

assume cs:codesg,ds:datasg,ss:stacksg main proc far

push ds xor ax,ax push ax

mov ax,datasg mov ds,ax

;"логическое И" (у=х1 and x2)

;___/____/____

 

;

х1

х2

у

 

;

0

0

0

 

;

0

1

0

 

;

1

0

0

 

;

1

1

1

 

;

 

mov bl,b1

; bl := b1

 

 

;

 

and bl,b2

; bl := b1 and b2

 

 

 

 

 

 

 

 

62

;

0 0 1 1

0 1 0 0

это b1

в двоичном виде

;

0 0 1 1

0 1 1 1

то b2

в двоичном виде

;

| | | |

| | | |

 

 

;

v v v v

v v v v

 

 

;0 0 1 1 0 1 0 0 результат побитового выполнения операции «логическое И»

 

mov soob2+2,bl

; soob2 := soob2 & bl

 

mov ah,09

; вывод сообщения "Привет!"

 

lea dx, soob1

 

 

int 21h

 

 

mov ah,09

; вывод сообщения soob2 с результатом

 

lea dx, soob2

; на месте цифры 3

;

int 21h

; т.е. должно быть: 1244

 

 

; если применить команды:

 

;

mov bl,b1

; bl := b1

;

and bl,b2

; bl := b1 and b2

;

mov soob2+0,bl

; soob2 := soob2 & bl

;то будет вывод сообщения soob2 с результатом

;на месте цифры 1

;т.е. должно быть: 4234

mov ah,0

 

int 16h

 

ret

;вернуться в DOS

main endp

 

codesg ends

 

end main

 

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

Пример 2.4

;lab2or.asm EXE-программа для демонстрации операции "логическое ИЛИ"

;(работает с МП 8086)

;Компиляция: tasm.exe lab2or.asm ; tlink.exe lab2or.obj stacksg segment para 'Stack'

db 128 dup (?) stacksg ends

datasg segment para 'Data' soob1 db 'Привет!',0dh,0ah,'$'

;

 

 

soob2

db '1234',0ah,0dh,'$'

b1

db '1'

;31h или 0011 0001

b2

db '2'

;32h или 0011 0010

;b3

db 3

; в примере

63

;w1 dw 64 ; не используются datasg ends

codesg segment para 'Code'

assume cs:codesg,ds:datasg,ss:stacksg main proc far

push ds xor ax,ax push ax

mov ax,datasg mov ds,ax

;---------------------------------------------------

;логическое "или" (у=х1 or x2)

;x1

;____/____

; ____|

|____ y

;|____/____|

;x2

;

 

 

у

 

 

 

;

х1

х2

 

 

 

;

0

0

0

 

 

 

;

0

1

1

 

 

 

;

1

0

1

 

 

 

;

1

1

1

 

 

 

;

 

 

 

 

 

 

;

реализация:

 

 

 

 

 

mov bl,b1

; bl := b1

;

 

or

bl,b2

 

; bl := b1 or b2

 

0 0 1 1

0 0 0 1

 

 

;

 

это b1

в двоичном виде

;

 

0 0 1 1

0 0 1 0

это b2

в двоичном виде

;

 

| |

| |

| | | |

 

 

;

 

v v v v

v v v v

 

 

;

 

0 0 1 1

0 0 1 1

результат выполнения операции «логическое ИЛИ»

 

 

mov soob2+1,bl

; soob2 := soob2 & bl

 

 

mov ah,09

; вывод сообщения "Привет!"

 

 

lea dx, soob1

 

 

 

 

int 21h

 

 

 

 

 

mov ah,09

; вывод сообщения soob2 с результатом

 

 

lea dx, soob2

; на месте цифры 2

 

 

int 21h

 

; т.е. должно быть: 1334

 

 

mov ah,0

 

 

 

 

int 16h

 

 

 

 

 

ret

 

 

;вернуться в DOS

main

endp

 

 

 

codesg ends

 

 

 

 

 

end main

 

 

 

 

 

 

 

 

64

Пример 2.5

;lab2xor.asm EXE-программа демонстрации операции "исключающее ИЛИ" ;Компиляция: tasm.exe lab2xor.asm

; tlink.exe lab2xor.obj stacksg segment para 'Stack'

db 128 dup (?) stacksg ends

; ---------------------------------------------------

datasg segment para 'Data' soob1 db 'Привет!',0dh,0ah,'$'

;

soob2

db '1234',0ah,0dh,'$'

b1

db '3' ;33h или 0011 0011

b2

db 5

;05h или 0000 0101

;b3

db 3

; в примере

;w1

dw 64

; не используются

datasg ends

 

; ---------------------------------------------------

codesg segment para 'Code'

assume cs:codesg,ds:datasg,ss:stacksg main proc far

push ds xor ax,ax push ax

mov ax,datasg mov ds,ax

; ---------------------------------------------------

;

;логическое "исключающее ИЛИ"

;( по-другому называется "сложение по модулю два")

;

х1

+

х2

=

у

;

 

mod2

 

 

 

;

0

+

0

=

0

;

;

 

mod2

 

 

 

;

0

+

1

=

1

;

;

 

mod2

 

 

 

;

1

+

0

=

1

;

;

 

mod2

 

 

 

;

 

 

 

 

 

;

1

+

1

=

0 (получающаяся единица переноса

;

 

mod2

 

 

в старший разряд отбрасывается)

;

 

 

 

 

 

 

 

 

 

 

65

;

х1

х2

у

 

 

 

;

0

0

0

 

 

 

;

0

1

1

 

 

 

;

1

0

1

 

 

 

;

1

1

0

 

 

 

;

реализация:

 

 

 

 

 

mov bl,b1

; bl := b1

;

 

xor bl,b2

 

; bl := b1 xor b2

 

0 0 1 1

0 0 0 1

 

 

;

 

это b1

в двоичном виде

;

 

0 0 0 0

0 1 0 1

это b2

в двоичном виде

;

 

|

| | |

| | | |

 

 

;

 

v v v v

v v v v

 

 

;

 

0 0 1 1

0 1 0 0

результат выполнения операции «исключающее ИЛИ»

 

 

mov soob2+2,bl

; soob2 := soob2 & bl

 

 

mov ah,09

; вывод сообщения "Привет!"

 

 

lea dx, soob1

 

 

 

 

int 21h

 

 

 

 

 

mov ah,09

; вывод сообщения soob2 с результатом

 

 

lea dx, soob2

; на месте цифры 3

 

 

int 21h

 

; т.е. должно быть: 1244

mov ah,0 int 16h

ret ;вернуться в DOS main endp

codesg ends end main

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

Пример 2.6

;lab2not.asm EXE-программа для демонстрации операции "логическое НЕ" ;Компиляция: tasm.exe lab2not.asm

;tlink.exe lab2not.obj stacksg segment para 'Stack'

db 128 dup (?) stacksg ends

;---------------------------------------------------

datasg segment para 'Data' soob1 db 'Привет!',0dh,0ah,'$'

soob2 db '1234',0ah,0dh,'$'

66

b1

db -3

; 11111101

;b2

db '5'

; в примере

;

b3 db 3

; не

;w1 dw 64 ; используются datasg ends

;---------------------------------------------------

codesg segment para 'Code'

assume cs:codesg,ds:datasg,ss:stacksg main proc far

push ds xor ax,ax push ax

mov ax,datasg mov ds,ax

;---------------------------------------------------

;логическое "не" ( у=not(х1) )

;

;

х1

у

 

 

;

0

1

 

 

;

1

0

 

 

;

 

mov bl,b1

; bl := b1

 

 

;

 

not bl

 

; bl двоичный код "не (b1)", т.е. 00000010

 

1 1 1 1

1 1 0 1

 

;

 

это b1 в двоичном виде

;

 

| | | |

| | | |

 

;

 

v v v v

v v v v

 

;

 

0 0 0 0

0 0 1 0

результат побитового выполнения операции

;

 

 

 

«логическое НЕ»

 

 

or bl,30h

 

;преобразование одной цифры в ascii-код

 

 

mov soob2+3,bl

;получится 00110010, т.е. 32h (ascii–код цифры '2')

 

 

; soob2 := soob2 & bl

 

 

mov ah,09

; вывод сообщения "Привет!"

 

 

lea dx, soob1

 

 

 

int 21h

 

 

 

 

mov ah,09

; вывод сообщения soob2 с результатом

 

 

lea dx,soob2

; на месте цифры 4

 

 

int 21h

 

; должно быть: 1232

mov ah,0 int 16h

ret ;вернуться в DOS main endp

codesg ends end main

67

Приложение 2.1

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

Вторая формула (во 2, 3, 4, 5, 7, 11, 12, 13, 14 лабораторных работах)

№ Выполняемые вычисления

п/п

или действия

 

 

1

b1 or b2 xor w1 and w2

or (d1 xor

 

b3)

 

 

 

 

2

b1 xor b2 or w1 and w2

xor (d1 xor

 

b3)

 

 

 

 

3

w1 or w2 xor b1 and b2 or (d1 xor

 

b3)

 

 

 

 

4

w1 xor w2 or b1 and b2 xor (d1

 

xor

b3)

 

 

5

w1 or b1 xor w1 and w2 or (d1

 

xor

b2)

 

 

6

w1 xor b1 or w1 and w2 xor (d1

 

xor

b2)

 

 

7

d1

or

d2 xor

b1 and b2

or (w1 xor

 

b3)

 

 

 

 

8

d1

xor

d2 or

b1 and b2 xor (w1

 

xor

b3)

 

 

9

d1

or b1 xor w1 and w2 or (w3

 

xor

b2)

 

 

10

d1

xor b1 or w1 and w2 xor (w3

 

xor

b2)

 

 

11

d1

or w1 xor b1 and b2 or (w2 xor

 

b3)

 

 

 

 

12

d1

xor w1 or b1 and b2 xor (w2

 

xor

b3)

 

 

Выполняемые вычисления

п/п

 

 

или действия

 

13

w1

and

w2

xor

(d1 xor b1) or (b2

 

or

b3)

 

 

 

 

 

 

14

w1

and

w2

or

(d1 xor

b2)

xor (b2

 

xor b3)

 

 

 

 

 

 

15

b1 and b2 xor d1 xor

b3

or

(w1 or

 

w2)

 

 

 

 

 

 

16

b1 and b2 or

d1 xor b3

xor

(w1

 

xor w2)

 

 

 

 

 

 

17

w1

and

w2

xor (d1 xor b1) or (w3

 

or

b2)

 

 

 

 

 

 

18

w1

and

w2

or (d1 xor b1) xor (w3

 

or

b2)

 

 

 

 

 

 

19

b1 and b2 xor w1 xor

b3

or

(d1 or

 

d2)

 

 

 

 

 

 

20

b1 and b2 or

w1 xor

b3

xor

(d1

 

xor d2)

 

 

 

 

 

 

21

w1

and

w2

xor (w3 xor b1) or (d1

 

or

d2)

 

 

 

 

 

 

22

w1

and

w2

or (w3 xor b1) xor (d1

 

or

b2)

 

 

 

 

 

 

23

b1 and b2 xor w1 xor

b3

or

(d1 or

 

w2)

 

 

 

 

 

 

24b1 and b2 or w1 xor b3 xor (d1 xor w2)

68

Окончание прил. 2.1

Вариант № 25 для лабораторной работы №2

Выполняемые

Х1=

Выполняемые

Х1=

Выполняемые

Х1=

вычисления

 

вычисления

 

вычисления

 

b_i or b_i+1

Х1= i+32

w_I and not(w_I+1)

Х1=I+45

d_i and d_i+1

Х1=i+58

 

 

 

 

 

 

w_i or w_i+1

Х1= i+33

b_I and not(w_I)

Х1=I+46

d_i and w_i

Х1=i+59

w_i or b_i

Х1= i+34

b_I and not(d_I)

Х1=I+47

q_i and q_i+1

Х1=i+60

d_i or d_i+1

Х1= i+35w_I and not(d_I)

Х1=I+48

q_i and d_i

Х1=i+61

 

 

 

 

 

 

d_i or b_i

Х1=i+36

w_I and not(b_I)

Х1=I+49

d_i and neg(d_i+1)

Х1=i+62

 

 

 

 

 

 

d_i or w_i

Х1=i+37

q_I and not(b_I)

Х1=I+50

b_i and neg( b_i+1)

Х1=i+63

 

 

 

 

 

 

b_i xor b_i+1

Х1=i+38

d_I and not(w_I)

Х1=I+51

w_i and neg(w_i+1)

Х1=i+64

 

 

 

 

 

 

w_i xor w_i+1

Х1=i+39

w_I and not(b_I)

Х1=I+52

b_i and neg(w_i)

Х1=i+65

 

 

 

 

 

 

w_i xor b_i

Х1=i+40

d_I and not(b_I)

Х1=I+53

d_i and neg( w_i )

Х1=i+66

 

 

 

 

 

 

d_i xor d_i+1

Х1=i+41

w_i and b_i

Х1=i+54

w_i and neg( d_i )

Х1=i+67

 

 

 

 

 

 

d_i xor b_i

Х1=i+42

d_i and b_i

Х1=i+55

w_i and neg( b_i )

Х1=i+68

 

 

 

 

 

 

d_i xor w_I

Х1=I+43

b_i and b_i+1

Х1=i+56

d_i and neg( b_i )

Х1=i+69

 

 

 

 

 

 

b_i and not(b_I+1)

Х1=I+44

w_i and w_i+1

Х1=i+57

 

 

 

 

 

 

 

 

Обозначения:

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

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

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

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

Приложение 2.2

Пример лабораторной работы №2

;==================================================================

;lb2_1bnn.asm ЛАБОРАТОРНАЯ РАБОТА №2 (модуль 1)

;РАЗРАБОТАНО (частично с использованием чужого кода конечно, но здесь его уже

;поменьше :) студентом 1 курса СибАДИ группы БИ11 БУСЛАЕВЫМ НИКОЛАЕМ

;НИКОЛАЕВИЧЕМ г.Омск, октябрь 2003 г. ;==================================================================

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

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

STACSG SEGMENT PARA STACK 'STACK' db 1024 dup(?)

STACSG ENDS

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

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

69

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

PUBLIC W1,W2,W13,W19,W21,B13,B16,REZULT

extrn FORM34:proc,FORM35:proc,FORM49:proc,FORM57:proc,FORM62:proc DATASG SEGMENT PARA 'DATA' ;начало сегмента данных

SOOB1 db 'ПРОГРАММА РАСЧЕТА ПО ФОРМУЛАМ','$' SOOBFORM1 db '#1 B1*B2*B3-D1/B3+W1+W2=','$' SOOBFORM34 db '#34 W1 OR W2','$'

SOOBFORM35 db '#35 W1 XOR W2','$' SOOBFORM49 db '#49 W13 AND B13 ','$' SOOBFORM57 db '#57 W19 AND NOT(B16)','$' SOOBFORM62 db '#62 W21 AND NEG(W2)','$'

SOOBFORMNUM db 'ВВЕДИТЕ, ПОЖАЛУЙСТА, НОМЕР ФОРМУЛЫ: $' soob_vixod db "Для выхода нажмите любую клавишу!","$" soobformnumerr db ‘Формулы с таким номером не существует!$’

X

db 1

 

 

b1

db 5

 

 

b2

db 2

 

 

b3

db 1

 

 

W1

dW 1

 

 

W2

dW 1

 

 

D1

dd 1

 

 

B13

db 1

 

 

B16

db 1

 

 

W13

dw 1

 

 

W19

dw 1

 

 

W21

dw 1

 

 

REZULT

dd 0

 

RES

dd 0

 

 

RES1W

dw 0

 

RES2 dd 0

 

 

;NAMEPAR_X LABEL BYTE

; не используется

;MAXLEN_X db 4

 

;FAKTLEN_X db ?

 

;NAMEFLD_X db 4 dup(' ')

 

NAMEPAR_b LABEL BYTE

MAXLEN_b db 4

FAKTLEN_b db ?

NAMEFLD_b db 4 dup(' ')

NAMEPAR_w LABEL BYTE

MAXLEN_w db 6

FAKTLEN_w db ?

NAMEFLD_w db 6 dup(' ')

NAMEPAR_d LABEL BYTE

MAXLEN_d db 12

70

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