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
ne znam 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 :)
Copyright (C) 2001-2008 by www.elitesecurity.org. All rights reserved.