Примеры (тексты) программ
Пример П.1.1
;lab3pr1.asm |
|
; Примеры |
|
mov al,b1 |
|
sar al,1 |
; арифметический сдвиг байта вправо |
mov byte ptr rezult,al |
|
; ---------------------------------------- |
|
mov al,b1 |
|
rol al,1 |
; циклический сдвиг байта влево |
mov byte ptr rezult,al |
|
; ---------------------------------------- |
|
mov al,b1
ror al,1 ; циклический сдвиг байта вправо mov byte ptr rezult,al
=================================================================
Пример П.1.2
; lab3pr2.asm COM-программа создания файла на диске и вывода в файл
codesg segmentPARA 'Code' |
|
|||
|
assume cs:codesg,ds:codesg,ss:codesg,es:codesg |
|||
|
org |
100h |
|
; обход PSP |
begin: |
|
jmp |
main |
;обход через данные |
; --------------------------------------------------- |
|
|
|
|
flda |
dw |
250 |
|
;определение данных |
fldb |
dw |
125 |
|
|
fldc |
dw |
? |
|
|
soob1 |
db |
'Привет!','$',0ah,0dh |
||
soob2 |
db |
'Error |
|
','$',0ah,0dh |
fcbrec label byte |
|
|
||
fcbdriv db |
03 |
|
;диск С |
|
fcbname db |
'file1 |
' |
|
|
fcbext |
db |
'dat' |
|
|
fcbblk dw |
0000 |
|
|
|
fcbrcsz dw |
? |
|
|
|
fcbflsz dd |
? |
|
|
|
|
dw |
? |
|
|
|
dt |
? |
|
|
fcbsqrc db |
00 |
|
|
|
; |
dd |
? |
|
|
|
|
|
|
|
Main |
proc |
near |
|
|
|
mov ah,09 |
|
|
|
|
lea dx, soob1 |
|
|
|
int 21h ---------------------------------------------------
mov ah,16h lea dx,fcbrec
int 21h ---------------------------------------------------
61
cmp al,00 jnz error mov fcbrcsz,1 mov ah,1ah lea dx,soob2
int 21h ---------------------------------------------------
mov ah,15h lea dx,fcbrec
int 21h ---------------------------------------------------
jmp exit
error:
mov ah,09 lea dx, soob2
int 21h ---------------------------------------------------
exit: |
|
ret |
;возврат в DOS |
main endp |
|
codesg |
ends |
end |
begin |
=================================================================
Пример П.1.3
formula3 proc
;lab3pr3.asm, АБП(1), ЦСЛ(10), СДП(11)П, СДЛ(12)
;Примеры:
cmp x1,3 jz fabp_1 cmp x1,4 jz fcsl_10 cmp x1,5 jz fsdr_11 cmp x1,6 jz fsdl_12
;Вычислительная часть!
fabp_1: |
;АБП(1) |
mov al,b1 |
|
sar al,1 |
|
mov byte ptr rezult,al |
|
ret |
|
fcsl_10: |
;ЦСЛ(10) |
mov ax,w1 |
|
mov cx,10 |
|
csl_10: |
|
rol ax,1 |
|
loop csl_10 |
|
mov word ptr rezult,ax |
|
ret |
|
fsdr_11: |
;СДП(11)П |
mov ax,word ptr d1 |
|
mov dx,word ptr d1[2] |
|
mov cx,11 |
|
|
62 |
|
cmp cf,0 |
|
|
jnz cf1 |
|
cf0: |
clc |
|
|
jmp sdr_11 |
|
cf1: |
stc |
|
sdr_11: |
|
|
|
rcr dx,1 |
|
|
rcr ax,1 |
|
|
loop sdr_11 |
|
|
jc rcf1 |
|
|
jnc rcf0 |
|
rcf1: |
mov cf,1 |
|
|
jmp next |
|
rcf0: |
mov cf,0 |
|
next: |
mov word ptr rezult,ax |
|
|
mov word ptr rezult[2],dx |
|
|
ret |
|
fsdl_12: |
;СДЛ(12) |
|
|
mov ax,word ptr d1 |
|
|
mov dx,word ptr d1[2] |
|
|
mov cx,12 |
|
sdl_12: clc |
|
|
|
rcl ax,1 |
|
|
rcl dx,1 |
|
|
clc |
|
|
loop sdl_12 |
|
|
mov word ptr rezult,ax |
|
|
mov word ptr rezult[2],dx |
|
|
ret |
|
formula3 |
endp |
|
=================================================================
Пример П.1.4
; lab3pr4.asm использование блока управления файлом FCB для создания файла
;----------------------------------------------------------
codesg segment para 'Code'
assume cs:codesg,ds:codesg,ss:codesg,es:codesg
org |
100h |
|
; обход PSP |
begin: jmp |
main |
|
;обход через данные |
; --------------------------------------------------- |
|
||
reclen equ |
32 |
|
|
namepar |
label |
byte |
;список параметров: |
maxlen |
db |
reclen |
; макс.длина имени |
namelen |
db |
? |
; число введенных символов |
namedta |
db |
reclen dup(' ') |
; область передачи (DTA) |
fcbrec |
label |
byte |
;FCB для дискового файла |
fcbdriv |
db |
04 |
; дисковод D |
fcbname |
db |
'namefile' |
; имя файла |
fcbext |
db |
'dat' |
; тип файла |
fcbblk |
dw |
0000 |
; номер текущего блока |
|
|
|
63 |
fcbrcsz |
dw |
? |
|
; размер логической записи |
|
fcbflsz |
|
dd |
? |
|
; размер файла (DOS) |
|
dw |
? |
|
|
; дата (DOS) |
|
dt |
? |
|
|
; зарезервировано (DOS) |
fcbsqrc |
db |
00 |
|
; номер текущей записи |
|
|
dd |
? |
|
|
; относительный номер |
crlf |
db |
13,10,'$' |
|
|
|
errcde |
|
db |
00 |
|
|
prompt |
db |
'Name? ','$' |
|
|
|
row |
db |
01 |
|
|
|
opnmsg |
db |
'*** Open error ***', '$' |
|||
wrtmsg |
db |
'*** Write error ***', '$' |
|||
; --------------------------------------------------------- |
|||||
main |
proc |
far |
|
|
|
|
mov |
ax,0600h |
|
|
|
|
call |
q10scr |
|
|
;очистить экран |
|
call |
q20curs |
|
;установить курсор |
|
|
call |
c10open |
|
;открыть, установить DTA |
|
|
cmp |
errcde,00 |
|
;есть место на диске? |
|
|
jz |
a20loop |
; |
да - продолжить, |
|
|
ret |
|
|
; |
нет - вернуться в DOS |
a20loop: |
|
|
|
|
|
|
call |
d10proc |
|
|
|
|
cmp |
namelen,00 |
|
;конец ввода? |
|
|
jne |
a20loop |
; |
нет продолжить, |
|
|
call |
g10clse |
; |
да закрыть файл |
|
|
ret |
|
|
; |
и вернуться в DOS |
main |
endp |
|
|
|
|
;Открытие дискового файла:
c10open |
proc near |
|
mov |
ah,16h |
;функция создания файла |
lea |
dx,fcbrec |
|
int |
21h |
|
cmp |
al,00 |
;есть место на диске? |
jnz |
c20 |
; нет ошибка |
mov |
fcbrcsz,reclen |
;размер записи (EQU) |
lea |
dx,namedta |
;загрузить адрес DTA |
mov |
ah,1ah |
|
int |
21ah |
|
ret |
|
|
c20: |
|
|
lea |
dx,opnmsg |
;сообщение об ошибке |
call |
x10err |
|
ret |
|
|
c10open |
endp |
|
;Ввод с клавиатуры:
d10proc |
proc |
near |
mov |
ah,09 |
;функция вывода на экран |
|
|
64 |
lea |
dx,prompt |
|
;выдать запрос |
int |
21h |
|
|
mov |
ah,0ah |
|
;функция ввода |
lea |
dx,namepar |
|
;ввести имя файла |
int |
21h |
|
|
call |
e10disp |
|
;прокрутка на экране |
cmp |
namelen,00 |
|
;имя введено? |
jne |
d20 |
; |
да продолжить, |
ret |
|
; |
нет выйти |
d20: |
|
|
|
mov |
bh,00 |
|
;заменить символ Return |
mov |
bl,namelen |
|
|
mov |
namedta[bx],' ' |
|
;записать пробел |
call |
f10writ |
|
;вызвать подпрограмму записи |
; |
|
|
|
cld |
|
|
|
lea |
di,namedta |
|
;очистить |
mov |
cx,reclen/2 |
|
; поле |
mov |
ax,2020h |
|
; имени |
rep |
stosw |
|
|
ret |
|
|
;выйти |
d10proc |
endp |
|
|
;Прокрутка и установка курсора:
e10disp |
proc near |
|
|
mov |
ah,09 |
|
;функция вывода на экран |
lea |
dx,crlf |
|
;CR/LF |
int |
21h |
|
;вызов DOS |
cmp |
row,18 |
|
;последняя строка экрана? |
jae |
e20 |
; |
да обойти, |
inc |
row |
; |
нет увеличить строку |
ret |
|
|
|
e20: |
|
|
|
mov |
ax,0601h |
|
;прокрутка на 1 строку |
call |
q10scr |
|
|
call |
q20curs |
|
;установить курсор |
ret |
|
|
|
e10disp |
endp |
|
|
;Запись на диск:
f10writ |
proc near |
|
|
mov |
ah,15h |
;функция записи |
|
lea |
dx,fcbrec |
|
|
int |
21h |
|
|
cmp |
al,00 |
;запись без ошибок? |
|
jz |
f20 |
; |
да |
lea |
dx,wrtmsg |
; |
нет |
call |
x10err |
; выдать сообщение |
|
mov |
namelen,00 |
|
|
65