forked from KolibriOS/kolibrios
136 lines
2.9 KiB
ArmAsm
136 lines
2.9 KiB
ArmAsm
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
|