@watmag

Ассемблер, свободное место на жестком диске?

Программа должна выводить свободное пространство на выбранном жестком диске, но этого делать не хочет. В программе использовал прерывание int 21h, функцию 36h.
Выводит 976 мб, непонятно, что это такое?. Хотя свободное пространство составляет в районе 8гб . Все это делалось в виртуал бокс, виндовс xp.
.MODEL SMALL
.386
STACK 256h
DATASEG
CODESEG 
 
start: 
  mov eax,@data 
  mov ds,eax ; Data Segment
  xor eax,eax
  mov ah, 36h
  mov dl, 0
  int 21h
 
  mul ebx        
  mov ebx,edx
  shl ebx, 16
  add eax,ebx
  mul ecx
  
cnvrt: 
xor ecx,ecx ;счетчик десятичных цифр
mov ebx,10 ;основание сист. счисления
ckl:
xor edx,edx ;расширим делимое
div ebx
push edx ;получаемые цифры кладем в стек
inc cx
test eax,eax ;делитель - ноль ?
jnz ckl ;еще нет, продолжим
 
outpt: ;вывод числа на экран
 
pop eax
add al,'0' ;десятичную цифру -> в ASCII
int 29h ;вывод цифры
 
loop outpt
 
 
 mov ah,10h
 int 16h
end start
  • Вопрос задан
  • 349 просмотров
Решения вопроса 1
0) нет гарантии, что для Вашего реального диска все параметры ответа AX, BX, CX умещаются в 16 бит (возможно, конечно DOS для совместимости что-нибудь обманывает, но гарантии опять же нет);

Теперь собственно ASM :
1) уверены ли Вы в чистоте верхнего слова ebx на первом умножении ?
2) абсолютно непонятен смысл манипуляций
mov ebx,edx
  shl ebx, 16
  add eax,ebx

3) уверены ли Вы в чистоте верхнего слова eсx на втором умножении ?
4) вот тут Вы напрочь убили верхние 32 бита значимой информации (а ведь 8 Гб уже не помещаются в младшие 32 бита) :
xor edx,edx ;расширим делимое
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@sisn
https://ru.wikipedia.org/wiki/FAT#.D0.A5.D0.B0.D1....

Для FAT32 применяются другие вызовы.
Для API ориентированного под возможности FAT16 вы никогда не получите таких больших величин, как ожидаете.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы