fis-gtm/sr_i386/op_mprofexfun.s

122 lines
2.3 KiB
ArmAsm

#################################################################
# #
# Copyright 2001, 2002 Sanchez Computer Associates, Inc. #
# #
# This source code contains the intellectual property #
# of its copyright holder(s), and is made available #
# under a license. If you do not know the terms of #
# the license, please stop and do not read further. #
# #
#################################################################
# PAGE ,132
.title op_mprofexfun.s
# .386
# .MODEL FLAT, C
.include "linkage.si"
.INCLUDE "g_msf.si"
.sbttl op_mprofexfun
# PAGE +
# call op_mprofexfun with the following stack:
#
# return PC
# ret_value address
# mask
# actualcnt
# actual1 address
# actual2 address
# ...
.DATA
.extern ERR_GTMCHECK
.extern dollar_truth
.extern frame_pointer
.text
.extern exfun_frame_sp
.extern push_parm
.extern rts_error
JMP_Jb = 0x0eb
JMP_Jv = 0x0e9
actual1 = 20
act_cnt = 16
mask_arg = 12
ret_val = 8
rtn_pc = 4
sav_esi = -4
sav_ebx = -8
sav_msf = -12
# PUBLIC op_mprofexfun
ENTRY op_mprofexfun
pushl %ebp
movl %esp,%ebp
pushl %esi
pushl %ebx
leal sav_msf(%ebp),%esp # establish space for locals
movl act_cnt(%ebp),%eax
addl $3,%eax
negl %eax
leal (%esp,%eax,4),%esp # establish space for temps
movl frame_pointer,%edx
movl rtn_pc(%ebp),%eax
cmpb $JMP_Jv,(%eax)
je long
cmpb $JMP_Jb,(%eax)
je byte_off
error: pushl ERR_GTMCHECK
pushl $1
call rts_error
addl $8,%esp
jmp retlab
byte_off:
movl %eax,msf_mpc_off(%edx)
addl $2,msf_mpc_off(%edx)
jmp cont
long: movl %eax,msf_mpc_off(%edx)
addl $5,msf_mpc_off(%edx)
cont: call exfun_frame_sp
movl frame_pointer,%edx
movl msf_old_frame_off(%edx),%eax
movl %eax,frame_pointer
movl %edx,sav_msf(%ebp)
leal ret_val(%ebp),%esi
movl %esp,%edi
movl act_cnt(%ebp),%eax
movl %eax,%ecx
addl $3,%ecx
REP
movsl
movl dollar_truth,%ecx
andl $1,%ecx
pushl %ecx # push $T
addl $4,%eax
pushl %eax # push total count
call push_parm # push_parm ($T, ret_value, mask, argc [,arg1, arg2, ...]);
done: movl sav_msf(%ebp),%eax
movl %eax,frame_pointer
orw $SFT_EXTFUN,msf_typ_off(%eax)
movl msf_temps_ptr_off(%eax),%edi
retlab: leal sav_ebx(%ebp),%esp
movl rtn_pc(%ebp),%edx
movl act_cnt(%ebp),%eax
addl $4,%eax
popl %ebx
popl %esi
popl %ebp
leal (%esp,%eax,4),%esp
pushl %edx
ret
# op_mprofexfun ENDP
# END