Задание. Написать программу для определения свободного места на дискете.

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

Всем, кто часто бывает в командировке потребуется посуточная аренда квартир в любом городе.