News:

MASM32 SDK Description, downloads and other helpful links
MASM32.com New Forum Link
masmforum WebSite

MASM structure at the stack

Started by Gunther, September 16, 2010, 01:13:37 AM

Previous topic - Next topic

Gunther

I've some old TASM 5 sources which I would like to translate to MASM. That's mostly no problem, but the next code snippet is a bit tricky. Given the following structure for DPMI translation service:


regs            STRUC
  redi          dd      ?               ;di or edi
  resi          dd      ?               ;si or esi
  rebp          dd      ?               ;bp or ebp
  reserved      dd      0               ;reserved, should be 0
  rebx          dd      ?               ;bx or ebx
  redx          dd      ?               ;dx or edx
  recx          dd      ?               ;cx or ecx
  reax          dd      ?               ;ax or eax
  rflags        dw      ?               ;CPU status flags
  res           dw      ?               ;es
  rds           dw      ?               ;ds
  rfs           dw      ?               ;fs
  rgs           dw      ?               ;gs
  rip           dw      ?               ;ip
  rcs           dw      ?               ;cs
  rsp           dw      ?               ;sp
  rss           dw      ?               ;ss
regs            ENDS


I need that data structure only temporarily at the stack. With TASM I did it so:


SomeFunc        proc near
@@regs           = [ebp-50]
                      push     ebp
                      mov      ebp,esp
                      sub       esp,50

                     ;access structure member

                      mov       @@regs.reax,eax

                     ;load structure address

                     lea        edi,@@regs

                      mov      esp,ebp
                      pop      ebp
                      ret
SomeFunc        endp


MASM doesn't assemble that. Is there any simple solution?

Gunther
Forgive your enemies, but never forget their names.

clive

Define it as a LOCAL, and let MASM build the stack frame? Given me a second and I will try to code an example.

SomeFunc        proc near c
LOCAL foo:regs

                     ;access structure member

                      mov       foo.reax,eax

                     ;load structure address

                     lea        edi,foo

                      ret
SomeFunc        endp


Which generates this.. (note it keeps the stack DWORD aligned)

00000000                    _SomeFunc:
00000000 55                     push    ebp
00000001 8BEC                   mov     ebp,esp
00000003 83C4CC                 add     esp,0FFFFFFCCh
00000006 8945EA                 mov     [ebp-16h],eax
00000009 8D7DCE                 lea     edi,[ebp-32h]
0000000C C9                     leave
0000000D C3                     ret


Something like this might also work.

SomeFunc        proc near
                      push     ebp
                      mov      ebp,esp
                      sub       esp,50

                     ;access structure member

                      mov       [ebp-50].regs.reax,eax

                     ;load structure address

                     lea        edi,[ebp-50]

                      mov      esp,ebp
                      pop      ebp
                      ret
SomeFunc        endp
It could be a random act of randomness. Those happen a lot as well.

Gunther

Clive,

you're a devil of a fellow!  :U That helps me a lot. I'll try that immediately.

Gunther
Forgive your enemies, but never forget their names.

GregL

Clive beat me to it, here's what I had come up with.


INCLUDE \masm32\include\masm32rt.inc

regs            STRUCT
  redi          dd      ?               ;di or edi
  resi          dd      ?               ;si or esi
  rebp          dd      ?               ;bp or ebp
  reserved      dd      0               ;reserved, should be 0
  rebx          dd      ?               ;bx or ebx
  redx          dd      ?               ;dx or edx
  recx          dd      ?               ;cx or ecx
  reax          dd      ?               ;ax or eax
  rflags        dw      ?               ;CPU status flags
  res           dw      ?               ;es
  rds           dw      ?               ;ds
  rfs           dw      ?               ;fs
  rgs           dw      ?               ;gs
  rip           dw      ?               ;ip
  rcs           dw      ?               ;cs
  rsp           dw      ?               ;sp
  rss           dw      ?               ;ss
regs            ENDS

.DATA

.CODE

  start:
 
    call SomeFunc
    inkey "Press any key to exit..."
    exit
 

SomeFunc PROC

    LOCAL @@regs:regs

    ;access structure member
    mov eax, 123
    mov @@regs.reax, eax
   
    INVOKE crt_printf, SADD("%u",13,10), @@regs.reax

    ;load structure address

    lea edi, @@regs
   
    INVOKE crt_printf, SADD("%p",13,10), edi

    ret
   
SomeFunc        ENDP

END start


Dissassembly:

SomeFunc PROC
00401035  push        ebp 
00401036  mov         ebp,esp 
00401038  add         esp,0FFFFFFCCh 

    LOCAL @@regs:regs

    ;access structure member
    mov eax, 123
0040103B  mov         eax,7Bh 
    mov @@regs.reax, eax
00401040  mov         dword ptr [ebp-16h],eax 
   
    INVOKE crt_printf, SADD("%u",13,10), @@regs.reax
00401043  push        dword ptr [ebp-16h] 
00401046  push        offset ??001C (40401Ch) 
0040104B  call        dword ptr [__imp__printf (405104h)] 
00401051  add         esp,8 

    ;load structure address

    lea edi, @@regs
00401054  lea         edi,[@@regs] 
   
00401057  push        edi 
00401058  push        offset ??001D (404024h) 
0040105D  call        dword ptr [__imp__printf (405104h)] 
00401063  add         esp,8 
    INVOKE crt_printf, SADD("%p",13,10), edi

00401066  leave 
00401067  ret 
SomeFunc ENDP


Gunther

Quote from: GregL, September 16, 2010,  at 02:49:12 AM... here's what I had come up with.

Well done.

Gunther
Forgive your enemies, but never forget their names.