format ELF
use32
include 'proc32.inc'
include 'struct.inc'
include 'tinypy.inc'
extrn tp_dict
extrn tp_set
extrn tp_get
extrn tp_None
extrn tp_fnc
public testmod_init
public getsize
;Module name
modname db "testmod"
modnamelen = $-modname
debug_print_name db "debug_print"
debug_print_namelen = $-debug_print_name
testmod_dict rb sizeof.tp_obj
debug_print_obj rb sizeof.tp_obj
tmp_tp_obj rb sizeof.tp_obj
getsize:
mov eax, tp_vm.params
ret
;void debug_print(tp_vm *tp)
debug_print:
push ebp
mov ebp, esp
; Store registers
push eax
push ebx
push ecx
push edx
;Reserve space for tp_obj variable in stack
sub esp, sizeof.tp_obj
; Obtain tp_string parameter
push_tp_obj tp_None
mov eax, dword[ebp+8]
add eax, tp_vm.params
push_tp_obj_at_reg eax
push dword[ebp+8]
push tmp_tp_obj;esp+(sizeof.tp_obj*2+4)
call tp_get
;Restore stack
add esp, 56;sizeof.tp_obj*3+4;8?
;Leave if parameter is not a string. tp_raise() should be called here.
;cmp dword[esp], TP_STRING
;jne .exit
;mov ecx, dword[esp+12]
;mov edx, dword[esp+8]
;.cont:
; Print message.
; mov eax, 63
; mov ebx, 1
; push ecx
; mov cl, byte[edx]
; inc edx
; int 40h
; pop ecx
; loop .cont
;.exit:
pop edx
pop ecx
pop ebx
pop eax
mov esp, ebp
pop ebp
ret
;void testmod_init(tp_vm *tp);
testmod_init:
push ebp
mov ebp, esp
;Save registers
push eax
push ebx
push ecx
; Create module dictionary and store its address in testmod_str
mov eax, dword [ebp + 8]
push eax
push testmod_dict
call tp_dict
add esp, 4 ;Clear stack
; Push tp_obj structure pointed by testmod_dict
push_tp_obj testmod_dict
; Push modname as a tp_obj object
push modnamelen; len
push modname ; val
push 0 ;_tp_string info
push TP_STRING ; type
; Push tp_obj structure pointed by tp->modules
mov eax, dword [ebp + 8]
add eax, tp_vm.modules + 16
mov ecx, 4
.push_tpobj1:
sub eax, 4
push dword[eax]
loop .push_tpobj1
push eax
call tp_set
add esp, sizeof.tp_obj*3+4
; Register "debug_print" function
;Reserve memory for function tp_obj object
sub esp, sizeof.tp_obj
mov eax, esp
push debug_print
push dword[ebp+8]
push eax
call tp_fnc
add esp, 8; tp_obj is already in stack, adding other arguments
;Pushing function name tp_obj
;mov eax, esp
;push_tp_obj_at_reg eax
push debug_print_namelen
push debug_print_name
push 0
push TP_STRING
;Pushing module dictionary tp_obj
push_tp_obj testmod_dict
;Pushing tp_vm
push dword[ebp+8]
call tp_set
add esp, sizeof.tp_obj*3+4
; Leaving function
pop ecx
pop ebx
pop eax
mov esp, ebp
pop ebp
ret