program function square(x : integer) : integer ; begin square := x*x end ; begin writeln(square(3)) end. |
square: subu $sp, $sp, square_f move $107, $ra move $108, $s0 move $105, $a0 mul $109, $105, $105 move $104, $109 square_end: move $v0, $104 move $ra, $107 move $s0, $108 addu $sp, $sp, square_f j $ra main: subu $sp, $sp, main_f move $110, $ra move $111, $s0 li $112, 3 move $a0, $112 jal square move $106, $v0 move $a0, $106 jal println_int main_end: move $ra, $110 move $s0, $111 addu $sp, $sp, main_f j $ra |
$XXX
qui trainent. En revanche, par « ./zyvas -4 -spill a.p > a.spill,
on aura le code a.spill qui lui est exécutable par le
simulateur spim.
(*****************************) (* Point d'entrée principal *) (*****************************) type procedure = { frame : Frame.frame ; (* frame de la procédure *) code : Ass.instr list ; (* Code proprement dit *) (* Instruction a enlever si la fonction n'alloue pas en pile (oublier) *) remove_ifzero : string list ; } type program = { prelude : Ass.instr; (* A emettre avant tout le reste *) main : procedure; (* Code de main *) procedures : procedure list; (* Code des proce'dures *) } val program : Code.code Trans.program -> program |
emit_stm
) et la selection
des appels de fonction (fonction emit_call
).
(selection des appels de fonction).emit_fun
, dont la mission est d'émettre le code
du corps d'une fonction (avec prologue et épilogue), est complètement
donnée. Toutefois, elle fait l'hypothèse que
tous les arguments sont passés en registres.
Plus précisément, emit_fun
échoue si la fonction à compiler
prend plus d'arguments qu'il y a de registres consacrés aux arguments
(quatre en mode normal, un seul en mode « -4 »).
Dans un premier temps,
vous pourrez adopter le même comportement pour votre fonction
emit_call
.Ce document a été traduit de LATEX par HEVEA.