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