Задание. Написать программу для определения свободного места на дискете.
DOSSEG
.MODEL SMALL
.STACK 100h
.DATA
all_mem DP ?
free_mem DP ?
all_mem_st DB ‘000000000000h$’
free_mem_st DB ‘000000000000h$’
st1 DB ‘Ошибка диска!$’
st2 DB ‘Всего памяти на диске :$’
st3 DB 13,10,’Свободной памяти: $’
.CODE
;
; процедура умножения регистров Ax*Cx*Dx
; вход: Ax,Cx,Dx
; выход: Dx:Cx:Ax
; портится регистр Bx
MulAxCxDx PROC
push dx
mul cx
pop cx
push dx
mul cx
mov bx,ax
pop ax
push bx
push dx
mul cx
pop cx
add cx,ax
adc dx,0
pop ax
xchg dl,dh ; обменять младшие и старшие
xchg cl,ch ; разряды местами
xchg al,ah ;
ret
MulAxCxDx ENDP
;
; Процедура преобразования числа в символьном виде
; вход: cx - длина числа в байтах
; bx - адрес числа
; di - адрес числа в символьном виде
; выход: di
; портятся регисятры: ax,dx
NumInStr PROC
loop1: mov dl,0 ; новый цикл (dl=[0..1]) в цикле CX
label0: mov al,[bx] ; получить первый байт числа
cmp dl,0
jne label1 ; dl<>0
shr al,4 ; сдвиг (10111110=>00001011)
jmp label2
label1: and al,00001111b ; снять биты (10111110=>00001110)
label2: cmp al,9 ; проверить al - цифра или буква
ja label3 ; al>9 т.е. буква A,B,C,D,E,F
add al,48 ; al - цифра 0,1,2,3,4,5,6,7,8,9
jmp label4
label3: add al,55 ; al - буква
label4: mov [di],al ; результат в ячейку памяти
inc di ; следующая ячейка памяти
inc dl ; цикл DL
cmp dl,1
je label0 ; dl=1
inc bx ; следующий байт числа
loop loop1 ; цикл CX
ret
NumInStr ENDP
main: mov ax,@DATA ;
mov ds,ax ; установить адсес сегмента данных
mov ah,36h
mov dl,1
int 21h ; получить количество памяти на диске
cmp ax,0FFFFh
jne no_error ; проверить на ошибку
error:
mov ah,9
mov dx,OFFSET st1
int 21h
jmp exit
no_error:
mov word ptr free_mem,ax ; сохранить значения:
mov word ptr free_mem+2,cx ; секторов, байт на сектор,
mov word ptr free_mem+4,bx ; доступных кластеров
call MulAxCxDx ; получить значение
mov word ptr all_mem,dx ; всей памяти диска.
mov word ptr all_mem+2,cx ; сохранить в
mov word ptr all_mem+4,ax ; all_mem <- Dx:Cx:Ax
mov ax,word ptr free_mem ; установить значения для
mov cx,word ptr free_mem+2 ; перемножения
mov dx,word ptr free_mem+4 ;
call MulAxCxDx ; получить значение
mov word ptr free_mem,dx ; свободной памяти диска.
mov word ptr free_mem+2,cx ; сохранить в
mov word ptr free_mem+4,ax ; free_mem <- Dx:Cx:Ax
;-------------------------- преобразовать число в символьный вид
mov cx,6
mov bx,OFFSET all_mem
mov di,OFFSET all_mem_st
call NumInStr
mov cx,6
mov bx,OFFSET free_mem
mov di,OFFSET free_mem_st
call NumInStr
;-------------------------- вывод результата
mov ah,9
mov dx,OFFSET st2
int 21h
mov dx,OFFSET all_mem_st
int 21h
mov dx,OFFSET st3
int 21h
mov dx,OFFSET free_mem_st
int 21h
exit: mov ah,4Ch
int 21h
END main
Всем, кто часто бывает в командировке потребуется посуточная аренда квартир в любом городе.






