flat assembler
Message board for the users of flat assembler.
![]() Goto page Previous 1, 2, 3 |
Author |
|
pearlz 17 Oct 2010, 05:39
you can use api wsprintf
like: szTextOut rb 100 number dd invoke wsprintf,strTextOut,"number =%d",dword[number] |
|||
![]() |
|
shoorick 18 Oct 2010, 05:16
cinvoke, as wsprintf is c-call function (or you may get problems with stack)
|
|||
![]() |
|
avcaballero 20 Oct 2010, 10:58
They are the digits number in its numerical system, its basis. All number are composed by lineal combinations of its basis power.
For example, 5013 decimal: 5013 = 5*10^3 + 0*10^2 + 1*10^1 + 3*10^0 = 5000 + 0 + 10 +3 In order to express a number into another numerical system, you must expres it as lineal combinations of its new basis power. Numbers in memory are not ascii, what is really displayed. In order to display a number (one digit) you must do: " or 30h" it to convert it to ascii. You can probe it with this tricky: cmd -> holding alt key, press into the number keypad 49 49d = 31h. You will se a "1" into the screen. Are we agree? Is this what you mean? cheers |
|||
![]() |
|
baldr 20 Oct 2010, 13:06
avcaballero,
You've explained how number is composed from digits, not the inverse. ![]() ----8<---- Overflowz, Let's assume that ecx==10 and convert eax==123==1×10²+2×10+3×1==(1×10+2)×10+3 to its decimal ASCII representation. As a first step, eax is decomposed into 12×10+3 by div ecx instruction (eax==12; edx==3), then remainder in edx is converted to corresponding ASCII value for digit 3, namely 33h (add edx, '0' or or edx, '0'). The result of our conversion ![]() ![]() Second step takes eax (which was set to 12 by div) and splits it again (1×10+2). Now add edx, '0' yields '2', another ASCII digit for the result. Store it appropriately (while more significant bytes in multi-byte values have greater addresses, for string representing decimal number it's quite contrary). Third step breaks down eax again, now as 0×10+1. '1' is stored, then this step is considered as final due to eax==0. P.S. For rigorists (as I am): xor edx, edx is assumed before each div ecx. ![]() |
|||
![]() |
|
Overflowz 20 Oct 2010, 19:55
avcaballero, I guess that short time ago ty for reply.
baldr, you wrote very nice tutorial but I have so many questions about that.. topic will be bombed if i'll ask.. but can you write with source code and very very basic comments ? ![]() Code: format PE GUI include 'WIN32AX.INC' entry main section '.data' data readable writeable buffer rb 20 szLib db 'kernel32.dll',0 szFnc db 'Sleep',0 smsg db 'Hello World!',0 fmsg dd 10 section '.text' code readable executable proc main invoke LoadLibrary,szLib invoke GetProcAddress,eax,szFnc mov [fmsg],eax mov ecx,10 mov edi,[fmsg] div ecx add edi,0 mov dword[buffer],edi invoke MessageBox,0,buffer,buffer,MB_OK ;invoke MessageBox,0,msg,msg,MB_OK invoke ExitProcess,0 endp section '.idata' import data readable library user32,'user32.dll',kernel32,'kernel32.dll' include 'API\USER32.INC' include 'API\KERNEL32.INC' section '.reloc' fixups data discardable just guessing.. |
|||
![]() |
|
baldr 21 Oct 2010, 05:57
Overflowz,
Here you go: Code: include "Win32AX.Inc" .code here: invoke GetProcAddress, <invoke LoadLibrary, _kernel32>, _Sleep mov ecx, 10 ; we're converting to decimal mov edi, _bufend ; edi points to NUL terminator, buffer is filled backwards .repeat xor edx, edx div ecx ; split eax==10·A+B into eax==A and edx==B add dl, '0' ; convert dl to corresponding ASCII dec edi ; pre-decrement pointer mov [edi], dl ; store ASCII code .until eax=0 invoke MessageBox, HWND_DESKTOP, edi, NULL, MB_OK; edi points to first (most significant) digit ret .data _kernel32 db "kernel32.dll", 0 _Sleep db "Sleep", 0 _buffer db 10 dup ' '; this buffer will hold the result _bufend db 0 .end here |
|||
![]() |
|
shoorick 21 Oct 2010, 06:27
it is hard to learn everything at once. a newbie needs a "frame" - minimal application which is able to run, has input and output, and the place in the source where to put own code. when there is no good tutorial/explanations/etc. newbie tries to get first met source and modifies it in own way to get a result. sometime he uses constructions without understanding their sense - it is normal, even if isn't good. to reduce newbie puzzling we need to give him examples or easy to understand at whole, or where "supporting frame" is separated from tested code. from other side the newbie by himself has to look into as many examples as he can, and select most simple and clear for him to use it as such kind of "frame". this may increase "learning efficiency"
![]() |
|||
![]() |
|
Overflowz 21 Oct 2010, 09:15
baldr, very useful source with comments thank you very much. and I dont understand 1 thing, when trying to 'div ecx' its dividing eax and edx same time or some of them ? like only eax/ecx or edx/ecx.. and btw about headers.. I dont know much about section '.xxx' things and writing where I saw someone's src and everytime I'm doing that..
shoorick, you're right. I can't find any tutorials and I am not so skilled to learn things like that in 1 day.. I started learning assembly on 1 sep I think. I'm also teenager I'm not adult. my brain is not too big to understand things like that and I'm also learning at school etc etc.. ![]() |
|||
![]() |
|
shoorick 21 Oct 2010, 09:41
if you do not understand how does certain command work, you must just read about it in intel manuals or somewhere else similar. yes, a 64 bit number in edx/eax pair is divided on 32 bit number in specified register when "div" command executed.
of course, i would wish to have a brain like teenagers have ![]() ![]() |
|||
![]() |
|
Overflowz 21 Oct 2010, 10:17
Ahh I guess now I think.. for example
EDX has value 12 EAX has value 34 ECX has value 10 when div ecx command executed its like 1234/10 am i right ? |
|||
![]() |
|
shoorick 21 Oct 2010, 10:31
very close, but you have to know some details:
if you mean 12 and 34 are hex values, then edx/eax pair will contain 1200000034h. if you mean 12 and 34 as decimal, then edx/eax pair will contain 12*(2^32)+34 decimal number |
|||
![]() |
|
Overflowz 25 Oct 2010, 20:12
I'm kinda stuck about moving.. I'm close to do this function!
![]() ![]() Code: format PE GUI 4.0 include 'WIN32AX.INC' entry main section '.data' data readable writeable buffer db 50 section '.text' code readable executable proc main mov ecx,10 mov eax,123 .here: xor edx,edx div ecx add edx,0 mov [buffer],dl dec [buffer] test eax,eax jnz .here invoke MessageBox,0,buffer,buffer,MB_OK invoke ExitProcess,0 endp section '.idata' import data readable library user32,'user32.dll',kernel32,'kernel32.dll' include 'API\USER32.INC' include 'API\KERNEL32.INC' section '.reloc' fixups data discardable |
|||
![]() |
|
Overflowz 25 Oct 2010, 21:38
almost.. but what difference between my post and baldr's ? here's mine code:
Code: format PE GUI 4.0 include 'WIN32AX.INC' entry main section '.data' data readable writeable buffer db 0 _Kernel32 db "kernel32.dll",0 _Sleep db "Sleep",0 section '.text' code readable executable proc main invoke GetProcAddress,<invoke LoadLibrary,_Kernel32>, _Sleep mov ecx,10 mov edi,buffer .here: xor edx,edx div ecx add dl,'0' dec edi mov [edi],dl test eax,eax jnz .here invoke MessageBox,0,edi,0,MB_OK invoke ExitProcess,0 endp section '.idata' import data readable library user32,'user32.dll',kernel32,'kernel32.dll' include 'API\USER32.INC' include 'API\KERNEL32.INC' section '.reloc' fixups data discardable |
|||
![]() |
|
Overflowz 26 Oct 2010, 10:17
I got it! Fixed now. I didn't imagined that after buffer will be buffend with null-terminated string and when decreasing buffend its going on buffer.. fixed and I know now what logic are here and thank you all!
|
|||
![]() |
|
mindcooler 26 Oct 2010, 12:57
I just wrote my first piece of MMX, perhaps you could give me some pointers
![]() Code: int2hex32: ; >eax <hexbuffer push eax pxor mm4,mm4 movd mm0,eax punpcklbw mm0,mm4 movq mm1,mm0 psllw mm0,12 psrlw mm1,4 psrlw mm0,12 packuswb mm0,mm4 packuswb mm1,mm4 punpcklbw mm0,mm1 movq mm2,mm0 pcmpgtb mm2,[hexcmp] paddb mm0,[hexadd] pand mm2,[hexalpha] paddb mm0,mm2 movd eax,mm0 bswap eax mov dword [hexbuffer+4],eax psrlq mm0,32 movd eax,mm0 bswap eax mov dword [hexbuffer],eax emms pop eax retn align 16 hexcmp dq $0909090909090909 hexadd dq $3030303030303030 hexalpha dq $2727272727272727 hexbuffer rq 1 _________________ This is a block of text that can be added to posts you make. |
|||
![]() |
|
Goto page Previous 1, 2, 3 < Last Thread | Next Thread > |
Forum Rules:
|
Copyright © 1999-2025, Tomasz Grysztar. Also on GitHub, YouTube.
Website powered by rwasa.