[ turncoat @ 22.08.2002. 01:12 ] @
Pokusavam da napisem HelloWorld program koji ce da se izvrsava pod Windows-om i koji ce da otvori konzolu i u njoj da napise poruku. Znaci, bez pravljenja prozora.
Treba mi i komandna linija za LINK.EXE posto treba da mu saopstim da otvori konzolu. Sta da koristim umesto int 21? Svi primeri koje sam nalazio ili prave prozor i u njemu ispisuju poruku, ili su pravljeni za dos, tj. koriste INT 21. Windows Me se srusi svaki put kada pokrenem program koji poziva INT 21.
[ lucky luciano @ 24.08.2002. 23:15 ] @
Neznam koji assembler koristis. Zovi GetStdHandle koji ce da ti vrati handle tj pointer za stdio tj. DOS screen. Korist WriteFile za output na screen ili ReadFile da ucitas.
[ turncoat @ 28.08.2002. 01:29 ] @
U pitanju je masm asembler. Ja koristim onaj koji ide uz masm32 (sa bibliotekama za 32-bit windows programe).

Evo ga i kod koji koristi WriteFile:
--------------------- zdravo.asm -----------
.386
.model flat, stdcall

include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib

.data
poruka db 'ZDRAVO SVETE!' ,0dh,0ah ;0dh-13 (cr), 0ah-10(lf) novi red

.code
main:
push -11 ;stdout
call GetStdHandle ;handle za izlaz na konzolu
push 0 ;lpOverlapped
push esp ;broj bajtova koji su ispisani
push 15 ;velicina string
push offset poruka ;adresa stringa
push eax ;handle
call WriteFile ;stampa string
push 0 ;code za izlaz
call ExitProcess ;izlaz
end main
-------------------- zdravo.asm ---------------------
Ovo asemblujem i linkujem komandama:
ml /c /coff zdravo.asm
link /SUBSYSTEM:CONSOLE zdravo.obj
Dobijam zdravo.exe koji se izvrsava u konzoli, tako da je sve u redu.
Marko
[ Mikky @ 28.08.2002. 23:49 ] @
hm ti izgleda volis tezi nacn
sto ne koristis invoke makro koji veoma ubrzava pisanje a i citanje koda
pritom i proverava parametre koje dajes funkciji da li su istog tipa kao sto je definisano u prototipu funkcije
umesto sto rucnu nabacujes parametre na stack
takodje ovo push -11.... koristi vec definisane konstante umesto literal vrednosti
[ turncoat @ 29.08.2002. 19:27 ] @
Pa, slusaj, asembler i ucim da bih znao nacin na koji kompjuter (os) obavlja stvari, a ne da bih stvari radio na laksi nacin. Mislim, za to cu da koristim neki hll (ili mozda high level assembler - hla). Nekako mi je bezveze da koristim npr. mov eax,edx, a ovamo imam .if eax==12 ili tako neke konstrukcije. Hocu da znam sta procesor moze da izvrsava.
[ Mikky @ 30.08.2002. 00:30 ] @
ok ako si jos u fazi ucenja ali kasnije ces sigurno preci na koriscenje tih makroa koji su ti tu da bi ti olaksali posao a ne otezali
a drugo oni mogu da ti i malo optimizuju kod
recimo to .if sto si spomenuo
koliko se secam .if eax==0 ce se prevesti u or eax,eax
dok bi 90% ljudi koristilo cmp eax,0
ove instrukcije rade istu stvar samo sto je ona sa OR manja za 2 ili 3 bajta (ne znam tacno) itd
[ ŠargarepaMen @ 11.04.2005. 21:45 ] @
Ne zaboravi da "cmp" ne menja odredišni operand, a "or" ga menja.
[ Sundance @ 12.04.2005. 07:02 ] @
Mislim da je u zadnje 3 godine to već sam shvatio :>
[ ŠargarepaMen @ 12.04.2005. 10:06 ] @
Ma to sam ionako rekao sam da bih se pravio važan ;) A nisam ni video datum poruke :(
[ Vojislav Milunovic @ 12.04.2005. 16:23 ] @
Pa or eax, 0 ne menja sadrzaj registra :)
jmp far lesson_bit_operations :)))
[ Sundance @ 12.04.2005. 18:03 ] @
Ma jebeš or, koristi se test eax, eax koji je mrvu brži ili xchg eax, ecx; jecxz __nula koji je i još bajt manji i još brži :>
[ Vojislav Milunovic @ 12.04.2005. 19:07 ] @
Ma da bre :)
Kod izgleda lepse kad imas test nego or :)