Witam moze ktos rozgarniety znajdzie w tym programie blad. Nie tworzy katalogu i pliku. Ja juz nie mam pomyslow. Dziekuje za pomoc.
.586P
.MODEL flat, STDCALL
;--- stale z pliku .\include\windows.inc ---
STD_INPUT_HANDLE equ -10
STD_OUTPUT_HANDLE equ -11
GENERIC_READ equ 80000000h
GENERIC_WRITE equ 40000000h
CREATE_NEW equ 1
CREATE_ALWAYS equ 2
OPEN_EXISTING equ 3
OPEN_ALWAYS equ 4
TRUNCATE_EXISTING equ 5
FILE_FLAG_WRITE_THROUGH equ 80000000h
FILE_FLAG_OVERLAPPED equ 40000000h
FILE_FLAG_NO_BUFFERING equ 20000000h
FILE_FLAG_RANDOM_ACCESS equ 10000000h
FILE_FLAG_SEQUENTIAL_SCAN equ 8000000h
FILE_FLAG_DELETE_ON_CLOSE equ 4000000h
FILE_FLAG_BACKUP_SEMANTICS equ 2000000h
FILE_FLAG_POSIX_SEMANTICS equ 1000000h
FILE_ATTRIBUTE_READONLY equ 1h
FILE_ATTRIBUTE_HIDDEN equ 2h
FILE_ATTRIBUTE_SYSTEM equ 4h
FILE_ATTRIBUTE_DIRECTORY equ 10h
FILE_ATTRIBUTE_ARCHIVE equ 20h
FILE_ATTRIBUTE_NORMAL equ 80h
FILE_ATTRIBUTE_TEMPORARY equ 100h
FILE_ATTRIBUTE_COMPRESSED equ 800h
FORMAT_MESSAGE_ALLOCATE_BUFFER equ 100h
FORMAT_MESSAGE_IGNORE_INSERTS equ 200h
FORMAT_MESSAGE_FROM_STRING equ 400h
FORMAT_MESSAGE_FROM_HMODULE equ 800h
FORMAT_MESSAGE_FROM_SYSTEM equ 1000h
FORMAT_MESSAGE_ARGUMENT_ARRAY equ 2000h
FORMAT_MESSAGE_MAX_WIDTH_MASK equ 0FFh
;--- funkcje API Win32 z pliku .\include\user32.inc ---
CharToOemA PROTO :DWORD,:DWORD
;--- z pliku .\include\kernel32.inc ---
GetStdHandle PROTO :DWORD
ReadConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
WriteConsoleA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
ExitProcess PROTO :DWORD
wsprintfA PROTO C :VARARG ;; int wsprintf(LPTSTR lpOut,// pointer to buffer for output
;; LPCTSTR lpFmt,// pointer to format-control string
;; ... // optional arguments );
lstrlenA PROTO :DWORD
GetCurrentDirectoryA PROTO :DWORD,:DWORD
;;nBufferLength, lpBuffer; zwraca length
CreateDirectoryA PROTO :DWORD,:DWORD
;;lpPathName, lpSecurityAttributes; zwraca 0 jeśli bład
lstrcatA PROTO :DWORD,:DWORD
;; lpString1, lpString2; zwraca lpString1
CreateFileA PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
;; LPCTSTR lpszName, DWORD fdwAccess,
;; DWORD fdwShareMode, LPSECURITY_ATTRIBUTES lpsa, DWORD fdwCreate,
;; DWORD fdwAttrsAndFlags, HANDLE hTemplateFile
lstrcpyA PROTO :DWORD,:DWORD
;;LPTSTR lpString1 // address of buffer, LPCTSTR lpString2 // address of string to copy
CloseHandle PROTO :DWORD
;; BOOL CloseHandle(HANDLE hObject)
WriteFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
;; BOOL WriteFile(
;; HANDLE hFile, // handle to file to write to
;; LPCVOID lpBuffer, // pointer to data to write to file
;; DWORD nNumberOfBytesToWrite, // number of bytes to write
;; LPDWORD lpNumberOfBytesWritten, // pointer to number of bytes written
;; LPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O
;;);
ReadFile PROTO :DWORD,:DWORD,:DWORD,:DWORD,:DWORD
;;BOOL ReadFile(
;;HANDLE hFile, // handle of file to read
;;LPVOID lpBuffer, // address of buffer that receives data
;;DWORD nNumberOfBytesToRead, // number of bytes to read
;;LPDWORD lpNumberOfBytesRead, // address of number of bytes read
;;LPOVERLAPPED lpOverlapped // address of structure for data
;;);
CopyFileA PROTO :DWORD,:DWORD,:DWORD
;; BOOL CopyFile(
;;LPCTSTR lpExistingFileName, // pointer to name of an existing file
;;LPCTSTR lpNewFileName, // pointer to filename to copy to
;;BOOL bFailIfExists // flag for operation if file exists
;;);
GetLastError PROTO
GetFileSize PROTO :DWORD, :DWORD
;--- z pliku .\include\masm32.inc ---
nrandom PROTO :DWORD
;--- funkcje----------------
includelib .\lib\user32.lib
includelib .\lib\kernel32.lib
includelib .\lib\masm32.lib
;-------------------------------------------------
_DATA SEGMENT
;-------------------------------------------------------
consoleOut DD ?
sth DB 0
dir DB 128 dup(?)
align 4
dirSize DD 128
bufor DB 128 dup(?)
align 4
buforSize DD 128
liczbaLosowa DD 32,32,32,32,32,32,13,10
newDirName DB "C:\dane",0
align 4
newDirNameSize DD $ - newDirName
testFile DB "C:\dane\test.txt",0
align 4
testFilePath DB 128 dup(?)
align 4
hfile DD ?
temp DB "%d " ,0Dh,0Ah,0
align 4
zPliku DB 128 dup(?)
align 4
zPlikuSize DD ?
asd DB "%d",0Dh,0Ah,0
align 4
odczytanaLiczba DD ?
licznik1 DD ?
licznik2 DD ?
_DATA ENDS
_TEXT SEGMENT
ScanInt PROC
;; funkcja ScanInt przekształca ciąg cyfr do liczby, którą jest zwracana przez EAX
;; argument - zakończony zerem wiersz z cyframi
;; rejestry: EBX - adres wiersza, EDX - znak liczby, ESI - indeks cyfry w wierszu, EDI - tymczasowy
;--- początek funkcji
push EBP
mov EBP, ESP ; wskaźnik stosu ESP przypisujemy do EBP
;--- odkładanie na stos
push EBX
push ECX
push EDX
push ESI
push EDI
;--- przygotowywanie cyklu
mov EBX, [EBP+8]
push EBX
call lstrlenA
mov EDI, EAX ;ilość znaków
mov ECX, EAX ;ilość powtórzeń = ilość znaków
xor ESI, ESI ; wyzerowanie ESI
xor EDX, EDX ; wyzerowanie EDX
xor EAX, EAX ; wyzerowanie EAX
;--- cykl --------------------------
@@pocz:
cmp BYTE PTR [EBX+ESI], 02Dh ;porównanie z kodem -
jne @@et1
mov EDX, 1
jmp @@nast
@@et1:
cmp BYTE PTR [EBX+ESI], 030h ;porównanie z kodem 0
jae @@et2
jmp @@nast
@@et2:
cmp BYTE PTR [EBX+ESI], 039h ;porównanie z kodem 9
jbe @@et3
jmp @@nast
;----
@@et3:
push EDX ; do EDX procesor może zapisać wynik mnożenia
mov EDI, 10
mul EDI ;mnożenie EAX * EDI
mov EDI, EAX ; tymczasowo z EAX do EDI
xor EAX, EAX ;zerowani EAX
mov AL, BYTE PTR [EBX+ESI]
sub AL, 030h ; korekta: cyfra = kod znaku - kod 0
add EAX, EDI ; dodanie cyfry
pop EDX
@@nast: inc ESI
loop @@pocz
;--- wynik
or EDX, EDX ;analiza znacznika EDX
jz @@et4
neg EAX
@@et4:
;--- zdejmowanie ze stosu
pop EDI
pop ESI
pop EDX
pop ECX
pop EBX
;--- powrót
pop EBP
ret
ScanInt ENDP
start:
;pobieranie uchwytów wyjśćiowych konsoli
push STD_OUTPUT_HANDLE
call GetStdHandle ; wywołanie funkcji GetStdHandle
mov consoleOut, EAX ; deskryptor wyjściowego bufora konsoli
;pobieranie aktualnego katalogu
invoke GetCurrentDirectoryA, dirSize,offset dir
;przygotowanie adresu nowego katalogu
invoke lstrcatA, offset dir, offset newDirName
;pobieranie dlugosci
invoke lstrlenA, offset dir
mov dirSize, EAX
;tworzenie nowego katalogu
invoke CreateDirectoryA, offset dir, 0
;przygotowywanie adresu do pliku test.txt
invoke lstrcpyA, offset testFilePath, offset dir
invoke lstrcatA, offset testFilePath, offset testFile
;tworzenie nowego pliku:
invoke CreateFileA,OFFSET bufor, GENERIC_WRITE OR GENERIC_READ, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0
mov hfile, EAX
;losowanie liczb calkowitych z zakresu od -99 do 99
mov EBX, 0
petla:
;losowanie liczby od 0 do 99
invoke nrandom, 199
sub eax,100
mov liczbaLosowa, EAX
invoke wsprintfA, offset bufor, offset temp, liczbaLosowa
mov buforSize, EAX
invoke WriteFile, hfile, offset bufor, buforSize, offset sth, 0
mov [bufor], 0
inc EBX
cmp EBX, 100
jne petla
invoke CloseHandle, hfile
invoke ExitProcess, 0
_TEXT ENDS
END start