Zapis temp do nowo utworzonego pliku.

0

Napisałem sobie programik który ma zapisać zmienną temp do nowo utworzonego pliku. Udało mi się utworzyć nowy plik, jednak jest problem z zapisem do niego zmiennej temp :/ Kod programu: http://ideone.com/tuIhW
Bedę wdzięczny za pomoc.

0

Kompilować to się kompiluje (ideone nie wie co to INVOKE) ale aby coś zapisać do pliku nie wystarczy zmienić nazw funkcji z ReadFile na WriteFile zobacz jakich parametrów oczekuje ta funkcja a co ty podajesz.
EDIT//
Jak chcesz się uczyć to nie zgaduj i o najdrobniejsze rzeczy pytaj na forum tylko zacznij od jakiegoś kursu np. http://edu.i-lo.tarnow.pl/inf/prg/002_winasm/index.php

0

Właśnie z tej strony http://edu.i-lo.tarnow.pl/inf/prg/002_winasm/0013.php znalazłem i na podstawie tego mam INVOKE WriteFile, hFile, OFFSET temp, fSize, OFFSET readBytes, 0
Ale coś podałem źle i nie wiem .. :/

0

nie pamiętam a w tej chwili ideone coś nie działa w każdym razie na pewno miałeś źle bo (minimum) zamiast tego co chciałeś zapisać jako drugi parametr szedł rejestr eax.

0

OK tamten problem udało mi się rozwiązać :) Teraz mam kłopot taki, że nie potrafie kontrolować parametrów, tzn. jak podam więcej niż 2 parametry, albo w ogóle to ma mi wyświetlić txt6. Od kilku godzin kombinuje z warunkami if .. else, ale już sam nie wiem jak to ułożyć najlepiej :/ Aktualny kod programu: http://ideone.com/WekvV#view_edit_box
Będę wdzięczny za pomoc!

0

masz funkcję zwracającą liczbę podanych parametrów:

GetCLCount PROC uses ecx
	LOCAL szTempBuff[128]:BYTE
	mov ecx, 1
	@@:
	push ecx
	INVOKE GetCL, ecx, ADDR szTempBuff
	pop ecx
	cmp eax, 1
	jne @F
	inc ecx
	jmp @B
	@@: 
	dec ecx
	mov eax, ecx
	ret 
GetCLCount ENDP

i wywołujesz przed pobraniem parametrów

INVOKE GetCLCount
.IF eax == 0 
;tu to co ma zrobic jak nie ma parametrow
.ELSEIF eax > 2
;tu jak jest wiecej niz 2
.ENDIF
0

Dzięki serdeczne! :D Kłopot z parametrami rozwiązany. Mam teraz kłopot, nie wiedzieć dlaczego, z poprawnym odczytaniem zawartości pliku. Np.
program.exe para1.txt
i w konsoli wypisuje mi '???u' zamiast 'miau miau' :/

0

Zapodaje jeszcze akutalny kod: http://ideone.com/dcIeg

0

Bo użyłeś WriteConsoleW zamiast WriteConsole

a tak przy okazji kilka porad:

  1. Często stosujesz coś takiego:
INVOKE lstrlen, OFFSET cos
INVOKE WriteConsole, hInstance, OFFSET cos, eax, NULL, NULL

Lepiej napisać sobie funkcję:

PrintConsole PROC lpText: DWORD
    INVOKE lstrlen, lpText
    INVOKE WriteConsole, hInstance, lpText, eax, NULL, NULL
    ret
PrintConsole ENDP

i wywoływać np:
INVOKE PrintConsole, OFFSET txt6

  1. Łam długie linie:
    Głupio wygląda (a już o próbie wydruku nie wspomnę):
    INVOKE CreateFile,ADDR fName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, CREATE_NEW,FILE_ATTRIBUTE_ARCHIVE,0

Lepiej napisać (znak \ służy do łamania linii):

INVOKE CreateFile,ADDR fName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or \
	FILE_SHARE_WRITE, NULL, CREATE_NEW,FILE_ATTRIBUTE_ARCHIVE,0
  1. Tu masz dość dziwne:
.IF eax == 0 
        jmp @errp
.ELSEIF eax > 2
        jmp @errp
.ELSEIF eax == 1
        jmp @p1
.ELSEIF eax == 2
        jmp @p2
.ENDIF

Skoro przy eax równym 0 i większym od 2 robi to samo to czemu nie napisać:

.IF eax == 0 || eax > 2
        jmp @errp
.ELSEIF eax == 1
        jmp @p1
.ELSEIF eax == 2
        jmp @p2
.ENDIF

Chyba tak lepiej. Można też użyć makra SWITCH (gdzieś w przykładach jest) ale skoro tego używasz 1 miejscu to za bardzo się nie opłaca.

0

Teraz wszysko gra :) Jeszcze raz dziękuje Ci bardzo! Twoja pomoc jest dla mnie dużym wsparciem.

1 użytkowników online, w tym zalogowanych: 0, gości: 1