Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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
|
Автор: 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 | ||||||
что-то я лишканул с этим:
число байт пустой дискеты там не уместитья так что луше заменить на
или выдавать ответ в секторах, а не байтах. пользуйте поиск. и ещё, этот код вам не нужен, тем более что там ошибка ![]()
|
Автор: 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: вместо
вроде так. но тогда алгоритм перевода нужно менять... проще выводи размер не в байтах а в секторах т е не сдвигай bx/ |