0,0 → 1,135 |
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 |