Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > определение памяти в асм под DOC


Автор: vgikys 18.6.2010, 22:02
Прошу помощи...
Кто может помочь прошу откликнуться 
Задача такая , написать программу под doc в расширении *.com в ассемблере, которая определяет размер свободной памяти дискеты вставленной в дисковод.
Прошу идей и если кто хорошо разбирается написать примерный код проги .
Заранее благодарен. 

Автор: Logree 19.6.2010, 12:21
Первый вариат:
1. Берём спецификацию на Fat12 (прото Fat);
2. Читаем и понимаем из неё, что нам нужно узнать расположение file alloc tabe (как написанно в той же спецификации);
3. в этой таблице содержаться записи о каждом кластере(кластер==сектор), по 12бит на кластер, те если кластер занят то в записи о нём будет какое-то значение иначе 0, нам нужно пройти по всей таблице и посчитать сколько кластеров занято, общая формула для вычисления свободного места:

FS = (Размер дискеты) - (1 + размер зарезервированых секторов+ размер fat *2+ размер корневого каталога) - количество занятых секторов;

ps http://sizov.boom.ru/fat.htm

Вариант два:
Функция 36h прерывания 21h:http://www.codenet.ru/progr/dos/dos_0057.php
> fasm
Код

use16
org 100h

free_space:

        mov     ax,cs
        mov     ds,ax

        xor     bx,bx
        mov     ah,36h
        xor     dl,dl
        inc     dl                        ; dl  = 1
        int     21h

        cmp     ax,0ffffh
        je      ext

        shl     bx,9                     ; bx = свободное место в байтах

ext:
        mov     ax,4ch
        int     21h  

Автор: vgikys 27.6.2010, 21:26
За неимением флоппика прошу протестить прогу ...и по возможности исправить ошибки

cseg segment 
assume cs:cseg,ss:cseg,ds:cseg
org 100h

start: jmp free_space

soob db "vstavte diskety i najmite lubyu klubishy ",10,13,'$'
er db "error",10,13,'$'
vuv db "freespace",10,13,'$'
ten db 10
rez db "00000$"
free_space:
mov ah,9
lea dx,soob
int 21h

mov ah,8
int 21h

mov ax,cs
mov dx,ax

xor bx,bx
mov ah,36h
xor dl,dl


inc dl
int 21h

cmp ax,0ffffh
je ext

mov ah,9
lea dx,vuv
int 21h 
mov ah,8
int 21h



shl bx,9
mov ax,bx

lea si,rez+4
m1:mov ah,0
div ten 
or ah,30h
mov [si],ah
dec si
cmp al,0
jne m1
mov ah,9
lea dx,rez
int 21h



ext:
mov ah,9
lea dx,er
int 21h
mov ah,8
int 21h
mov ax,4ch
int 21h


cseg ends
end start

Автор: Logree 27.6.2010, 21:33
http://lifehacker.ru/2008/02/06/virtual-floppy-drive-21-emulyator-dlya-disket/


ps посмотрите как оформлен мой код и как оформлен ваш.

Автор: vgikys 27.6.2010, 21:38
Нет мне просто надо офромить типа вставьте дискету и всё такое , я просто дополнил, есть ошибки ? 
Logree вы не могли бы подсказать, работает или нет ? 

Автор: Logree 27.6.2010, 22:01
Даже сильно не вникая в код можно сказать что НЕ БУДЕТ, запустите и ищите ошибку, а алгоритм перевода числа в строку выкладывали тыщю раз.

Автор: vgikys 30.6.2010, 06:40
Logree прошу помочь, потому что не могу справиться с этой задачей, не понимаю где ошибка. Не могли бы вы исправить мой код
Заранее благодарен.

Автор: Logree 30.6.2010, 18:57
что-то я лишканул с этим: 
Код

       shl    bx,9


число байт пустой дискеты там не уместитья так что луше заменить на 
Код

       shl    ebx,9      

или выдавать ответ в секторах, а не байтах.

пользуйте поиск.

и ещё, этот код вам не нужен, тем более что там ошибка smile
Код

    mov    ax,cs
    mov    dx,ax


Автор: vgikys 30.6.2010, 19:55
Когда заменил на EBX  пишет "undefined symbol EBX" и "Arguments types override"

Автор: Logree 1.7.2010, 00:20
Опишите подробно по какому алгоритму вы переводите число в стоку? и покажите код.

Автор: vgikys 1.7.2010, 02:13
Блин ну что никто не поможет ? Помогите с  выводом результата на экран.Очень срочно надо. 


.586
data segment use16
 
assume cs:data,ss:data,ds:data

org 100h

start: jmp free_space

soob db "vstavte diskety i najmite lubyu klubishy ",10,13,'$'
er db "error",10,13,'$'
vuv db "freespace",10,13,'$'
ten db 10
rez dw ?,'$'
s dw ?
b dw ?

free_space:
mov ah,9
lea dx,soob
int 21h

xor bx,bx
mov ah,36h
xor dl,dl
inc dl
int 21h

cmp ax,0ffffh
je ext

shl ebx,9

"СЮДА НУЖНЫ АЛГОРИТМЫ ВЫВОДА РЕЗУЛЬТАТА НА ЭКРАН !!!"



ext:
mov ah,9
lea dx,er
int 21h
mov ah,8
int 21h
mov ax,4ch
int 21h


data ends
end start

Автор: vgikys 2.7.2010, 15:42
Всё сделал вывод строки. Но почему то неправильно считает свободную память?????????


data segment 

string_bin_byt label byte
string_bin_word label word
string_bin_dword label dword
string_bin_qword dw ?
string_pack dt 0
       len_string_pack = $ - string_pack
adr_string_pack dd string_pack
string db 20 dup (0)
       len_string = $ - string 
adr_string dd string 
soob db "vstavte diskety i najmite lubyu klubishy ",10,13,'$'
er db "error",10,13,'$'
vuv db "freespace",10,13,'$'
rez dw ?


data ends

st1 segment stack
dw 256 dup (?)
st1 ends

text segment
 
assume cs:text,ds:data,es:data,ss:st1



start:
mov ax,data
mov ds,ax 
mov es,ax
mov ax,st1
mov ss,ax

jmp free_space
 


free_space:
mov ah,9
lea dx,soob
int 21h

xor bx,bx
mov ah,36h
xor dl,dl
mov dl,1
int 21h


cmp ax,0ffffh
je ext



shl bx,9


mov string_bin_qword,bx


finit
fild string_bin_qword

fbstp string_pack
lds si,adr_string_pack
add si,len_string_pack-2
les di,adr_string
mov cx,9
cycl: xor ax,ax
std
lodsb
shl ax,4 
rol al,4 
or ax,3030h
xchg ah,al
cld
stosw
loop cycl
mov bx,1
mov cx,len_string
lds dx,adr_string
mov ah,40h
int 21h
jc ext  



mov ah,8
int 21h

mov ax,4ch
int 21h

ext:
mov ah,9
lea dx,er
int 21h
mov ah,8
int 21h
mov ax,4ch
int 21h

text ends
end start

Автор: Logree 2.7.2010, 20:39
естественно ведь shl bx,9 выдвигает много бит, результат в байтах требует 4 байт, те dx:ax:

вместо
Код

shl bx,9


Код

mov ax,bx
mov dl,ah
shl  dx,1
test al,80h
jz zero
or dl,1h
zero:
shl ax,9                                   ; в dx:ax число в байтах


вроде так. но тогда алгоритм перевода нужно менять... проще выводи размер не в байтах а в секторах т е не сдвигай bx/

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)