Другие языки программирования и технологии

FASM - ассемблер

Результатом вызова winapi функции получается не то что должно быть:
<code>
section '.data' data readable writeable

sector_per_cluster dq 0
byte_per_sector dq 0
free_clusters dq 0
total_clusters dq 0
disc_name db 'D:\\',0
show_result db 30 dup(0)
title_window db "Доступное дисковое пространство",0
szformat db '%lu,%lu,%lu,%lu',0

section '.code' code readable executable

start:
invoke GetDiskFreeSpace,disc_name,sector_per_cluster,byte_per_sector,free_clusters,total_clusters

invoke wsprintf, show_result, szformat, sector_per_cluster, byte_per_sector, free_clusters, total_clusters
invoke MessageBox,0, show_result, title_window,MB_OK
</code>
В чем ошибка?
Ошибки в строке, выделенной жирным шрифтом. Функция wsprintf принимает в качестве параметров значения чисел, а вы передаёте ей адреса этих чисел.
Остальные исправления - просто неточности.

format PE GUI 4.0
entry start
include 'win32a.inc'
stack 200h

section '.data' data readable writeable

sector_per_cluster rd 1
byte_per_sector rd 1
free_clusters rd 1
total_clusters rd 1
disc_name db 'D:\',0
show_result rb 30
title_window db "Доступное дисковое пространство",0
szformat db '%u,%u,%u,%u',0

section '.code' code readable executable

start:
    invoke GetDiskFreeSpace,disc_name,sector_per_cluster,\
        byte_per_sector,free_clusters,total_clusters

    invoke wsprintf,show_result,szformat,[sector_per_cluster],\
        [byte_per_sector],[free_clusters],[total_clusters]
    invoke MessageBox,0,show_result,title_window,MB_OK

    invoke ExitProcess, NULL

section '.idata' import data readable
library kernel32,'kernel32.dll',user32,'user32.dll'
include 'api/kernel32.inc'
include 'api/user32.inc'

P.S. Почему бы вам не воспользоваться функцией GetDiskFreeSpaceEx? Она возвращет непосредственно объём свободного пространства в байтах.
Pleshakov Oleg
Pleshakov Oleg
51 590
Лучший ответ
Меня смущает двойной слэш при указании диска, это не си.
Зачем тип dq, нужно dd. желательно использовать getdiskfreespaceEx
Drag Me To Heel
Drag Me To Heel
82 902
> Зачем тип dq, нужно dd.

DD - двойное слово (32 бита)
DQ - четверное (64 бита)

> желательно использовать getdiskfreespaceEx

согласен. подробности см. http://msdn.microsoft.com/en-us/library/windows/desktop/aa364937(v=vs.85).aspx
Ереке Ереке
Ереке Ереке
11 509
>Результатом вызова winapi функции получается не то что должно быть
Начните с проверки результатов вызова функций:
документация к wsprintf:
>If the function fails, the return value is less than the length of the expected output.
>To get extended error information, call GetLastError.

GetDiskFreeSpaceEx (поддерживается с XP ;) )
> If the function fails, the return value is zero (0).
> To get extended error information, call GetLastError.

А еще: OllyDbg - отличный отладчик ;)