[ Mr. Jack @ 30.11.2004. 20:14 ] @
skoro sam poceo da se bavim assemblerom pa mi je malo tesko da sve pohvatam iz tutorijala.Jel moze neko da objasni kako se konvertuje string u int i obrnuto? HVALA!!! ![]() |
[ Mr. Jack @ 30.11.2004. 20:14 ] @
[ Mr. Jack @ 30.11.2004. 21:05 ] @
Upravo sam otkrio funkcije dwtoa i atodw u masm32lib. Hvala u svakom slucaju
![]() [ Sundance @ 30.11.2004. 21:17 ] @
Meni su te emulacije C-olikih fja totalan shit.
Mislim, cemu pisati u asembleru ako ce ti 70% koda biti te ugradjene fje, invoke .if i ostali makroi...? Samo ces izgubiti vrijeme za ono sto si mogao puno lakse napraviti unutar nekog IDE-a, a ako ti treba brzina samo kriticne dijelove koda napises preko inline asm-a ili compiler intrinsics. Ovako da si recimo sam pokusao osmisliti algoritam i implemenirati ga bilo bi puno zabavnije. Recimo imas broj, dijelis ga sa 10 i ostatak (u edx) dodavas na (char)'0' i u petlji zapisujes unazad bajt po bajt sve dok je broj!=0. U obrnutom smjeru: broj=0; oduzimas (char)'0' od stringa unaprijed i mnozis sa 10 te dodajes na broj sve dok *string != NULL. [ Mr. Jack @ 03.12.2004. 21:12 ] @
Evo probao sam da napisem funkciju za pretvaranje broj -> string. Svestan sam da je ovo verovatno moglo da se napise mnogo lakse, ali ovo je sve sto sam ja do sada shvatio, pa bi mi svaka pomoc i objasnjenje u vezi koda dobro doslo.
Code: IntToText proc buffer:LPSTR,broj:DWORD push edx push ecx push ebx mov eax,broj ;broj u eax mov ebx,10 ;delilac u ebx mov ecx,buffer ;adresa buffera u ecx push ecx ;sacuvaj adresu pocetka buffera add ecx,sizeof buffer ;idi na kraj buffera petlja: xor edx,edx ;obrisi edx div ebx ;podeli eax sa ebx add edx,48 ;dodaj ostatku 48 (30h) dec ecx ;dec ecx mov byte ptr [ecx],dl ;dodaj deo broja u buffer cmp eax,0 ;da li smo stigli deljenjem do 0 jne petlja ;ako nismo nastavi petlju pop eax ;adresa pocetka buffera u eax push [ecx] ; pop [eax] ;pomeri broj na pocetak buffera pop ebx pop ecx pop edx ret IntToText endp [ Sundance @ 04.12.2004. 03:20 ] @
E tako treba razmisljati!
S vremenom ces prestati pisati nebuloze tipa cmp eax, 0, prestati razmisljati proceduralno vec linijski.. [ Vojislav Milunovic @ 04.12.2004. 15:09 ] @
or eax, eax
jz eax = 0 jnz eax != 0 eto malo linijski =) [ Sundance @ 05.12.2004. 19:48 ] @
brze je i bajt manje
Code: mov ecx, eax jecxz eax_je_0 :P [ Vojislav Milunovic @ 07.12.2004. 12:45 ] @
haha ovo je dobro =) pazi kad za ovo nisam znao uopste =)))
[ drizz @ 07.12.2004. 19:49 ] @
ali pazi:
add ecx,sizeof buffer sizeof buffer == sizeof LPSTR == 4 ,duzina pointera a ne prava duzina buffera [ drizz @ 07.12.2004. 19:51 ] @
Code: .code OPTION PROLOGUE:NONE OPTION EPILOGUE:NONE ALIGN 4 DwToStr proc dwValue:DWORD,pBuffer:DWORD mov eax,[esp+4];dwValue mov edx,[esp+8];pBuffer .if eax push edi mov ecx,0CCCCCCCDh push ebx mov edi,edx .repeat mov ebx,eax mul ecx shr edx,3 lea eax,[edx*4+edx] lea eax,[eax+eax-'0'] sub ebx,eax mov eax,edx mov [edi],bl test eax,eax lea edi,[edi+1] .until zero? mov [edi],al mov edx,[esp+8+8];pBuffer mov eax,edi .repeat dec edi mov cl,[edx] mov bl,[edi] mov [edi],cl mov [edx],bl inc edx .until (edx >= edi) pop ebx sub eax,[esp+8+4];pBuffer pop edi ret 2*4 .endif mov word ptr [edx],'0' inc eax ret 2*4 DwToStr endp OPTION PROLOGUE:PROLOGUEDEF OPTION EPILOGUE:EPILOGUEDEF [ Sundance @ 08.12.2004. 03:13 ] @
Mogao si malo komentirat kod X=)
I meni je taj sizeof odmah bio sumnjiv, pomislio sam da se radi o nekom shitu ugradjenom u MASM (ja okorjeli TASM-as :), ali kad covjek vec kaze da radi nisam se trudio ni provjeriti :) Sad mi nije jasno zasto nije provjerio kod ?! [ Mr. Jack @ 08.12.2004. 16:27 ] @
Nisam znao da je to duzina pointera, ali funkcija je radila. Bilo bi lepo komentarisati drizz-ov kod posto su to za mene na spanska sela i portugalske bandere
![]() [ drizz @ 08.12.2004. 16:52 ] @
u biti isto je sve samo sto umjesto djeljenja je mnozenje sa magic konstantom
vise procitati ovdje : [url]http://www.agner.org/assem/pentopt.pdf[/url] pod 18.7 je to djeljenje, naravno i sve ostalo procitati a gle ovo :P (nije moj kod) Code: DwToStr proc uses edi dwValue:dword,pBuffer:dword ; Made by tE! mov eax,dwValue mov edi,pBuffer push 0h ;get some additional space on stack (10 bytes min.) push 0h ;'' upper dword is 0 push eax ;'' lower dword -> 32 bit integer to convert fild qword ptr[esp] ;load 64 bit integer value on TOS fbstp real10 ptr[esp] ; store value as 80bit BCD value pop ecx pop eax mov edx,ecx mov ebx,eax shr ecx,4 shr eax,4 and ebx,0000000Fh ;mask nibbles and edx,0F0F0F0Fh ;... and ecx,0F0F0F0Fh add edx,30303030h ;build ascii numbers add ecx,30303030h ;... add eax,30h add ebx,30h mov [edi+0],al;store in buffer mov [edi+1],bl ;... mov [edi+10],ah mov [edi+8],cl mov [edi+9],dl mov [edi+6],ch mov [edi+7],dh bswap ecx ;endian conversion (486 processor needed) bswap edx ;dto. mov [edi+2],cl mov [edi+3],dl mov [edi+4],ch mov [edi+5],dh pop eax ;correct stack ret DwToStr endp i da: cmp eax,0 je je brze od mov ecx, eax jecxz :P [ Sundance @ 08.12.2004. 23:45 ] @
Eh, u vezano za to ima jedan kul proggy Magic Divider, star je vec nekoliko ljeta, ali dobra fora ostaje dobra fora, hehe.
jecxz dodje kao slozena instrukcija pa je zato sporija, jelte? Ali je 4 bajta manja, a svi znamo da je velicina vazna :) Enivej, test eax, eax je brze i od or i od cmp :P [ Vojislav Milunovic @ 09.12.2004. 01:07 ] @
da li cu ja test, or, cmp bas mi i ne znaci na Athlon 64 =>>> sabija kevu, pa nece valjda da se uspori zbog jedne instrukcije =)))))
[ Sundance @ 09.12.2004. 01:13 ] @
Hehe, jeli radis ista win64asm? :) Kako se pokazao onaj NX-bit u praksi, jeli stvar radi? Nemoj mi reci samo da si stavio 32-bitne windoze :)
A uostalom sto ce ti eax, kad imas r0 :) [ Vojislav Milunovic @ 11.12.2004. 13:21 ] @
Ma de radim u 64 asm, skinuo sam i Intel i Amd developer manuel, ali mi nisšta nije jasno =) Intel kaže da ima r0-127 a Amd kaže da ima RAX RBX RCX itd... i svi 64bitni, pa ih ništa ne razumem, a nemam vremena da detljno to prostudiram... A za ovaj NX-bit ne znam nisam toliko detaljno studirao tu arhitekturu =)
A njinblonjs je svakako 32bitni, pa di da nađem 64bitni? Da li to postoji? Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|