Valhalla Legends Forums Archive | Assembly Language (any cpu) | Help with basic ASM

AuthorMessageTime
Ringo
Hmmm, im trying to learn the basics of ASM, but this following function ASM has me a little confused:
[code]
DLLIMPORT unsigned char __stdcall *GamePacketSize(unsigned char *data,
                             unsigned int *size,
                             unsigned int *offset)
{
   unsigned int a;
   if (data[0] < 0xF0) {
       *size = data[0] - 1;
       *offset = 1;
       return &data[1];
   }
   a = (data[0] & 0xF) << 8;
   *size = a + data[1] - 2;
   *offset = 2;
   return &data[2];
}
[/code]


This is my current understanding of the ASM, but i dont think i fully understand it :(
Could anyone explain anything i might have missed?
[code]
.text:6B5011A0 ; Exported entry   6. GamePacketSize
.text:6B5011A0 ; Exported entry   7. GamePacketSize@12
.text:6B5011A0
.text:6B5011A0 ; ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦ S U B R O U T I N E ¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦
.text:6B5011A0
.text:6B5011A0 ; Attributes: bp-based frame
.text:6B5011A0
.text:6B5011A0                 public GamePacketSize@12
.text:6B5011A0 GamePacketSize@12 proc near
.text:6B5011A0
.text:6B5011A0 var_8           = dword ptr -8
.text:6B5011A0 var_4           = dword ptr -4
.text:6B5011A0 Data            = dword ptr  8
.text:6B5011A0 Size            = dword ptr  0Ch
.text:6B5011A0 Offset          = dword ptr  10h
.text:6B5011A0
.text:6B5011A0                 push    ebp             ; GamePacketSize
.text:6B5011A1                 mov     ebp, esp        ; store stack base pointer?
.text:6B5011A3                 sub     esp, 8          ; preserve 8 byts on the stack?
.text:6B5011A6                 mov     eax, [ebp+Data] ; move stack+8 to eax?
.text:6B5011A9                 cmp     byte ptr [eax], 0EFh ; compare eax to 0xEF
.text:6B5011AC                 ja      short loc_6B5011D0 ; if greater than goto?
.text:6B5011AE                 mov     edx, [ebp+Size] ; move stack+12 to edx?
.text:6B5011B1                 mov     eax, [ebp+Data] ; move stack+8 to eax?
.text:6B5011B4                 mov     al, [eax]       ; set 1st byte of eax to eax?
.text:6B5011B6                 and     eax, 0FFh       ; and off the end 3 bytes?
.text:6B5011BB                 dec     eax             ; subtract 1 from eax?
.text:6B5011BC                 mov     [edx], eax      ; move eax to address of edx?
.text:6B5011BE                 mov     eax, [ebp+Offset] ; set eax to address of stack+16?
.text:6B5011C1                 mov     dword ptr [eax], 1 ; set address of stack+16 (eax) to 1?
.text:6B5011C7                 mov     eax, [ebp+Data] ; move address of stack+8 to eax?
.text:6B5011CA                 inc     eax             ; add 1 to eax
.text:6B5011CB                 mov     [ebp+var_8], eax ; set stack-8 to eax? func vairable return space?
.text:6B5011CE                 jmp     short loc_6B50120B ; go to
.text:6B5011D0 ; ---------------------------------------------------------------------------
.text:6B5011D0
.text:6B5011D0 loc_6B5011D0:
.text:6B5011D0                 mov     eax, [ebp+Data] ; move stack+8 to eax? again?
.text:6B5011D3                 mov     al, [eax]       ; set 1st byte of eax to eax?
.text:6B5011D5                 and     eax, 0Fh        ; and eax by 0x0F
.text:6B5011D8                 and     eax, 0FFh       ; and eax by 0xFF? (huh?)
.text:6B5011DD                 shl     eax, 8          ; shift eax left 8 bits
.text:6B5011E0                 mov     [ebp+var_4], eax ; move eax into address of stack-4 (tmp variable)?
.text:6B5011E3                 mov     edx, [ebp+Size] ; move stack+12 to edx?
.text:6B5011E6                 mov     eax, [ebp+Data] ; move stack+8 to eax?
.text:6B5011E9                 inc     eax             ; add 1 to eax
.text:6B5011EA                 mov     al, [eax]       ; set 1st byte of eax to eax?
.text:6B5011EC                 and     eax, 0FFh       ; and eax by 0xFF
.text:6B5011F1                 add     eax, [ebp+var_4] ; add stack-4 variable to eax?
.text:6B5011F4                 sub     eax, 2          ; subtract 2 from eax?
.text:6B5011F7                 mov     [edx], eax      ; move eax to address of edx (stack+12)?
.text:6B5011F9                 mov     eax, [ebp+Offset] ; more stack+16 to eax?
.text:6B5011FC                 mov     dword ptr [eax], 2 ; set stack+16 (eax) to 2?
.text:6B501202                 mov     eax, [ebp+Data] ; move stack+8 to eax?
.text:6B501205                 add     eax, 2          ; add 2 to stack+8 (eax)?
.text:6B501208                 mov     [ebp+var_8], eax ; move stack+8 (eax) to stack-8, func return?
.text:6B50120B
.text:6B50120B loc_6B50120B:
.text:6B50120B                 mov     eax, [ebp+var_8] ; move stack-8 func return to eax?
.text:6B50120E                 leave                   ; hm whats this do?
.text:6B50120F                 retn    0Ch             ; return, poping 12 byets off the stack?
.text:6B50120F GamePacketSize@12 endp
[/code]
thanks in advance


edit: woopsy, posted in the wrong forum, was ment to post it in Assembly Language forum ><
Can somone move it please? :P

edit#2: n/m spoke to rob@useast who verifyed a few things i was unsure of. can trash this if not usefull.
Still not sure what the op code "leave" does tho :p
March 9, 2008, 3:00 PM
Kp
leave reverses the changes made by enter.  See the Intel x86 instruction manual for details.
March 12, 2008, 12:17 AM
iago
enter wasn't actually called, was it?

I always understood it as undoing what the standard prefix (push ebp / mov ebp, esp) does.
March 12, 2008, 12:36 AM
Ringo
ah neat, thanks :)
March 13, 2008, 1:36 AM

Search