2591
.pdfmul 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