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 |
; в примере |
;w1 |
dw 64 |
; не используются |
63
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 |
|
|
||
Пример 2.5
64
;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 |
|
в старший разряд отбрасывается) |
|
; |
х1 |
х2 |
у |
|
|
; |
|
|
|||
; |
0 |
0 |
0 |
|
|
|
|
|
|
|
65 |