8 Eylül 2010 Çarşamba

Biraz nostalji: Masm32 ile ilk çırpınışlar

Sene 2002, çalıştığım şirkette gece vardiyalarında bol boş vakit den kaynaklanan zaman aralıklarını faydalı bir şeylerle değerlendireyim derken tanıştım masm32 ile. Icezelion'un müthiş win32 serisini bir çırpıda okuyup yaklaşık 24 step'lik tuts larınıda example'ları ile yuttuktan sonra ilk denememi yapayım demiş ve aşağıdaki acaip şey ortaya çıkmıştı :) Arşivimden bir mp3 cutter ararken rast geldim ve paylaşayım istedim:


;Writed by StreAmeR 10.10.2002 bilgislem@hotmail.com
.386
.model flat,stdcall
option casemap:none

WinMain proto :DWORD,:DWORD,:DWORD,:DWORD

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

@UzunlukAl MACRO
push edi
mov edi,esi
xor al,al
xor ecx,ecx
scasb
pushf
inc ecx
popf
jnz $-6
mov konum,edi
pop edi
ENDM

@SatirAtla MACRO
dec edi
mov al,0ah
stosb
mov al,0dh
stosb
ENDM


asd proto :DWORD

.data
baslik db "GetEnvironmentStrings&Assembly Example",0
hata db "Hata",0
konum dd 0

.data?
hHandle HWND ?
buf db 512 dup(?)

.code
start:
invoke GetEnvironmentStrings ; Programın işletim sistemi tarafından otomatik olarak tanımlanan ortam değişken tablosuna pointer al

mov hHandle,eax ; Pointer'i sakla
mov edi,hHandle ; Pointer üzerinde işlem yapabilmeniz için bir kopyasını edi'ye çekiyoruz

; Ortam bilgisinin hafızada yer alan bilgisinin tümünü tarayıp bitis noktasini aliyoruz

; ------------ Pointerin sonu Bir sonlandırıcı 00 ve iki bitiş 00 00 ile bitiyor. Biz bu değişken tablosunun sonunu bulmalıyız
push edi ; Pointer'in base adresini stacke atıyoruz
xor ax,ax ;
scasw
jnz $-2
dec edi
mov edx,edi ;Yapının son adresini edx'e alıyoruz

;İlk bilgi yapısını alıyor ve geçersiz olduğundan dolayı tamponumuza almıyıp bize gecerli olan adresi isaretlemesini sağlıyoruz
pop edi
xor al,al
xor ecx,ecx
scasb
pushf
inc ecx
popf
jnz $-6

lea edi,buf
push edi
mov esi,hHandle
xor al,al
rep movsb
pop edi
push edi
mov ecx,20
xor al,al
rep stosb

@UzunlukAl


lea edi,buf ;tampon
rep movsb
@SatirAtla

@UzunlukAl
rep movsb
@SatirAtla

mov konum,edi
.while konum!=edx
@UzunlukAl
rep movsb
@SatirAtla
.endw

invoke MessageBox,NULL,ADDR buf,addr baslik,MB_OK

invoke FreeEnvironmentStrings,hHandle
invoke ExitProcess,NULL
ret

end start

Hiç yorum yok:

Yorum Gönder