ASM and parameters

Everything else that doesn't fall into one of the other PB categories.
eriansa
Enthusiast
Enthusiast
Posts: 277
Joined: Wed Mar 17, 2004 12:31 am
Contact:

ASM and parameters

Post by eriansa »

From the manual :
The available volatile registers are: eax, edx and ecx. All others must be always preserved

I am not using inline asm, but direct asm.

In PB394 I always referenced parameters by [ESP+...]
In PB400 The new way is [p.v_parm]

I need to preserve EBP,EBX,EDI since I need to use those registers in my Asm procedure.

Example :

Code: Select all

Procedure.l MyProc(a.l,b.l,c.l,d.l,e.l,f.l)
  !MOV Eax, [p.v_a]
  !MOV Ecx, [p.v_b]
  !MOV Edx, [p.v_c]
  ;Now I want to move the other parms to registers which I have to reserve first
  ;How????
  ProcedureReturn
EndProcedure

a.l=1:b.l=1:c.l=1:d.l=1:e.l=1:f.l=1
a=MyProc(a,b,c,d,e,f)
Debug a
Is there any problem in the future if I do it this way :

Code: Select all

Procedure.l MyProc(a.l,b.l,c.l,d.l,e.l,f.l)
  !PUSH Ebp
  !PUSH Edi
  !PUSH Ebx
  
  !MOV Eax, [p.v_a+12]
  !MOV Ecx, [p.v_b+12]
  !MOV Edx, [p.v_c+12]
  ;...
  !POP Ebx
  !POP Edi
  !POP Ebp
  ProcedureReturn
EndProcedure

a.l=1:b.l=1:c.l=1:d.l=1:e.l=1:f.l=1
a=MyProc(a,b,c,d,e,f)
Debug a
Trond
Always Here
Always Here
Posts: 7446
Joined: Mon Sep 22, 2003 6:45 pm
Location: Norway

Post by Trond »

No, but remember to put +12, and PB code using local variables won't work inside the block.
User avatar
Psychophanta
Always Here
Always Here
Posts: 5153
Joined: Wed Jun 11, 2003 9:33 pm
Location: Anare
Contact:

Post by Psychophanta »

Or u can do this way:

Code: Select all

Procedure.l MyProc(a.l,b.l,c.l,d.l,e.l,f.l) 
  !PUSH Ebp Edi Ebx 
  !add esp,12
  ;...
  !MOV Eax, [p.v_a] 
  !MOV Ecx, [p.v_b] 
  !MOV Edx, [p.v_c] 
  Debug a+b+c+d+e+f
  ;... 
  !sub esp,12
  !POP Ebx Edi Ebp 
  ProcedureReturn a
EndProcedure 

a.l=1:b.l=2:c.l=3:d.l=4:e.l=5:f.l=6 
a=MyProc(a,b,c,d,e,f) 
Debug a
http://www.zeitgeistmovie.com

while (world==business) world+=mafia;
Trond
Always Here
Always Here
Posts: 7446
Joined: Mon Sep 22, 2003 6:45 pm
Location: Norway

Post by Trond »

That can be dangerous.

Code: Select all

Procedure.l MyProc(a.l,b.l,c.l,d.l,e.l,f.l) 
  !push ebp edi ebx 
  !add esp, 12

  I = 0 ; Oups, ebp, ebx and edi is gone!
  
  !sub esp,12 
  !pop ebx edi ebp 
  ProcedureReturn a 
EndProcedure 
Fred
Administrator
Administrator
Posts: 18162
Joined: Fri May 17, 2002 4:39 pm
Location: France
Contact:

Post by Fred »

The '!MOV Eax, [p.v_a+12]' way is the prefered one and should work with any future version.
josku_x
Addict
Addict
Posts: 997
Joined: Sat Sep 24, 2005 2:08 pm

Post by josku_x »

THanks for the info Fred
gebe
User
User
Posts: 56
Joined: Thu Mar 22, 2007 9:39 pm
Location: South Africa

Post by gebe »

This post might be stupid after the real specialist has spoken.
Please treat it more as a question than anything else...

For what it is worth: (I am far ,far from beeing a specialist).
I tried the following to be able to follow up the stack easily.
I cannot stop in the debugger with the < !code >
(correct ? Or have I missed something as usual ?).

Code: Select all

;This time I use the inline ASM
;do not forget to select in CONFIG compiler
;This way one can follow perfectly with the debugger
;I dont seem to stop in the debugger in pure ASM (with <!>)
;with <in line> OK ,debug stops on break points
Procedure StrL(l.l,p.l) 
;here p.l is a dummy as it is not used by the code
; but it was necessary to pass the variable on the stack
 
Debug "@st   "+Hex(p) 
Debug "l.l   "+Hex(l) 
;maybe there is another way ?
   :?: 
  
  MOV eax,l 
 ;in LIST.ASM p.v_p is declared as an EQUATE    
 ; esp+pso+4 (return pushed +4 ? what is pso ?)I dont know 
   ;PUSH edi;uncomment to save edi 
   MOV edi,[esp+8];dword[p.v_p+4];the pointer value    
  ;mov edi,[esp+12];uncomment if edi is pushed 
  ;to compensate for the push
  ;I traced the positions with the stack in the debugger
  
  
  
       MOV dl ,255     ;end mark 
      PUSH edx      ;save<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
      MOV ecx ,10   ;the divider 
! x0: 
      MOV edx ,0 
       DIV ecx       ; divide eax by 10 
        PUSH edx    ; save the rest <<<<<<<<<<<<<<<<<<<<<<< 
         CMP eax ,0; result of division 
          JA x0     ;  eax = 0 ? finished ? 
!x2: 
          POP eax   ;get results of divisions>>>>>>>>>>>> 
          CMP al ,255   ;until end mark (result order reversed ) 
                    JE x9 
          ADD al ,'0' 
          STOSB 
          JMP x2 
! x9:;! are needed for the labels 
          MOV al,0; 
          STOSB    ; put a zero for end string mark 
   ;uncomment if edi is save
   ; POP edi  ;   restore edi>>>>>>>>>>>>>>>>>>>>>>>>>  
EndProcedure 

;ALLOCATION of spce 
st.s="00000000000000" 
Debug "Before conversion   :  " +st 
b.l=19191919;here the  number to convert****************** 
 Debug @st    
Strl(b,@st); 

Debug " Conversion Ended   :  "+ st 
End 


; Reading from debug output
; Before conversion   :  00000000000000
; 9307752
; @st   8E0668
; l.l   124D86F
;  Conversion Ended   :  19191919


;gebe :) 
:?:
Post Reply