Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .global Decode
- .global EmuPush
- .global EmuWrite
- .global EmuPop
- .global EmuRead
- .global EmuAdd
- .global EmuSub
- .global EmuMul
- .global EmuDiv
- .global EmuBz
- .global EmuBn
- .global EmuJmp
- .section ".text"
- Decode:
- save %sp,-208,%sp
- lduw [%i1],%l1 !Obtention du compteur ordinal
- ldx [%i1+16],%l0 !Obtention du pointeur sur la memoire de la machine virtuelle
- ldub [%l0+%l1],%l0 !Lecture du premier octet de l'instruction courante
- nop
- cmp %l0,0 !Est-ce l'instruction HALT? (0x00)
- be decodeHalt
- nop
- srl %l0, 2, %l2
- sll %l2, 2, %l2
- ! mov %l1,%o1 !Lecture du premier octet de l'instruction courante
- ! setx txt,%l7, %o0
- ! call printf
- ! nop
- cmp %l2, 0x40
- be decodePush
- nop
- cmp %l2, 0x20
- be decodeWrite
- nop
- cmp %l2, 0x48
- be decodeAdd
- nop
- cmp %l2, 0x4c
- be decodeSub
- nop
- cmp %l2, 0x50
- be decodeMul
- nop
- cmp %l2, 0x54
- be decodeDiv
- nop
- !mov %l0,%o1 !Lecture du premier octet de l'instruction courante
- !call printf
- !nop
- !bnz decodeError !sinon, le reste n'est pas encore supporte: Erreur.
- !nop
- decodeSuccess:
- mov 0,%i0 !code d'erreur 0: decodage reussi
- ret
- restore
- decodeHalt:
- stw %g0,[%i0] !type d'instruction: systeme (0)
- stw %g0,[%i0+4] !numero d'operation: 0 (HALT)
- ba decodeSuccess
- nop
- decodeWrite:
- mov 0,%l2
- stw %l2,[%i0] !mode 00
- mov 4,%l2 !4 = 100 binaire
- stw %l2,[%i0+4] !operation = 100 (WHRITE)
- sll %l0,29,%l2
- srl %l2,29,%l2 !va chercher les 3 dernier bit de format (001 ou 011)
- stw %l2,[%i0+8] !operande %d(001) 0u %f(011)
- !cc non utiliser
- !fl non utiliser
- mov 1,%l2
- stw %l2,[%i0+20] !Size 1
- ba decodeSuccess
- nop
- decodePush:
- mov 1,%l2
- stw %l2,[%i0] !mode 01
- mov 0,%l2
- stw %l2,[%i0+4] !operation: 0 (PUSH)
- !CC est toujours 0
- sll %l0,31,%l2
- srl %l2,31,%l2 !va chercher si un int ou float
- cmp %l2,0 !Si cest un int
- be decodePush10
- nop
- !FLOAT
- mov 1,%l2
- stw %l2,[%i0+16] !FL = 1 (FLOAT)
- lduw [%i1],%l1 !Obtention du compteur ordinal
- ldx [%i1+16],%l0 !Obtention du pointeur sur la memoire de la machine virtuelle
- add %l0,%l1,%l2 !l2 adresse courante
- ldub [%l2+1],%l3 ! Charge premier octet du chiffre
- sll %l3,24,%l3 ! Shift left plus significatif
- ldub [%l2+2],%l4 ! Charge deuxieme octet du chiffre
- sll %l4,16,%l4 ! Shift left plus significatif
- add %l3,%l4,%l3 !add les deux premier octet dans l3
- ldub [%l2+3],%l4 ! Charge 3ieme octet du chiffre
- sll %l4,8,%l4 ! Shift left plus significatif
- add %l3,%l4,%l3 !add les 3 premier octet dans l3
- ldub [%l2+4],%l4 ! Charge 4ieme octet du chiffre
- add %l3,%l4,%l3 !add les 4 premier octet dans l3
- !ldub [%l2+2],%l4 !charge deuxieme octet
- !add %l3,%l4,%l3 !add les octets
- stw %l3,[%i0+8] !add operand
- mov 5,%l2
- stw %l2,[%i0+20] !Size 5
- ba decodeSuccess
- nop
- decodePush10:!INT
- mov 0,%l2
- stw %l2,[%i0+16] !FL = 0 (INT)
- lduw [%i1],%l1 !Obtention du compteur ordinal
- ldx [%i1+16],%l0 !Obtention du pointeur sur la memoire de la machine virtuelle
- add %l0,%l1,%l2 !l2 adresse courante
- ldub [%l2+1],%l3 ! Charge premier octet du chiffre
- sll %l3,8,%l3 ! Shift left plus significatif
- ldub [%l2+2],%l4 !charge deuxieme octet
- add %l3,%l4,%l3 !add les octets
- stw %l3,[%i0+8] !add operand
- mov 3,%l2
- stw %l2,[%i0+20] !Size 3
- ba decodeSuccess
- nop
- decodeAdd:
- setx addtxt,%l7, %o0
- call printf
- nop
- mov 2,%l2
- stw %l2,[%i0] !mode 10
- mov 2,%l2
- stw %l2,[%i0+4] !operation: 0010 (ADD)
- sll %l0,31,%l2
- srl %l2,31,%l2 !va chercher si un int ou float
- stw %l2,[%i0+16] !FL = int ou float
- mov 1,%l2
- stw %l2,[%i0+20] !Size 1
- ba decodeSuccess
- nop
- decodeSub:
- setx subtxt,%l7, %o0
- call printf
- nop
- mov 2,%l2
- stw %l2,[%i0] !mode 10
- mov 3,%l2
- stw %l2,[%i0+4] !operation: 0011 (SUB)
- sll %l0,31,%l2
- srl %l2,31,%l2 !va chercher si un int ou float
- stw %l2,[%i0+16] !FL = int ou float
- mov 1,%l2
- stw %l2,[%i0+20] !Size 1
- ba decodeSuccess
- nop
- decodeMul:
- setx multxt,%l7, %o0
- call printf
- nop
- mov 2,%l2
- stw %l2,[%i0] !mode 10
- mov 4,%l2
- stw %l2,[%i0+4] !operation: 0100 (MUL)
- sll %l0,31,%l2
- srl %l2,31,%l2 !va chercher si un int ou float
- stw %l2,[%i0+16] !FL = int ou float
- mov 1,%l2
- stw %l2,[%i0+20] !Size 1
- ba decodeSuccess
- nop
- decodeDiv:
- setx divtxt,%l7, %o0
- call printf
- nop
- mov 2,%l2
- stw %l2,[%i0] !mode 10
- mov 5,%l2
- stw %l2,[%i0+4] !operation: 0101 (DIV)
- sll %l0,31,%l2
- srl %l2,31,%l2 !va chercher si un int ou float
- stw %l2,[%i0+16] !FL = int ou float
- mov 1,%l2
- stw %l2,[%i0+20] !Size 1
- ba decodeSuccess
- nop
- decodeError:
- mov 1,%i0 !code d'erreur 1: instruction illegale.
- ret
- restore
- !---------------------------------------------------------------------------------
- /*
- Entrées : %i0 : adresse de la structure machineState
- %i1 : nombre d’octets à empiler
- %i2 : les octets à empiler (placés côte à côte sur 32 bits).
- Sorties : aucune.
- */
- Empile:
- save %sp,-208,%sp
- lduw [%i0+4],%l1 !Obtention du pointeur de pile
- ldx [%i0+16],%l2 !Obtention du pointeur sur la memoire de la machine virtuelle
- cmp %i1,2 !Si cest un int (2 octets)
- be empile10 !branchement vers int
- nop !...
- !FLOAT (4 octets)
- sll %i2,24,%l0 !Obtenir l'octet le moins significatif, partie 1
- srl %l0,24,%l0 !Obtenir l'octet le moins significatif, partie 2
- stub %l0,[%l2+%l1] !Empiler l'octet
- inc %l1 !Incrementer le pointeur de pile
- sll %i2,16,%l0 !Obtenir l'octet le deuxieme moins significatif, partie 1
- srl %l0,24,%l0 !Obtenir l'octet le deuxieme moins significatif, partie 2
- stb %l0,[%l2+%l1] !Empiler l'octet
- inc %l1 !Incrementer le pointeur de pile
- sll %i2,8,%l0 !Obtenir l'octet le deuxieme plus significatif, partie 1
- srl %l0,24,%l0 !Obtenir l'octet le deuxieme plus significatif, partie 2
- stub %l0,[%l2+%l1] !Empiler l'octet
- inc %l1 !Incrementer le pointeur de pile
- srl %i2,24,%l0 !Obtenir l'octet le plus significatif
- stb %l0,[%l2+%l1] !Empiler l'octet
- inc %l1 !Incrementer le pointeur de pile
- ba empileFin
- nop
- empile10:!INT (2 octets)
- sll %i2,24,%l0 !Obtenir l'octet le moins significatif, partie 1
- srl %l0,24,%l0 !Obtenir l'octet le moins significatif, partie 2
- stub %l0,[%l2+%l1] !Empiler l'octet
- inc %l1 !Incrementer le pointeur de pile
- setx printint,%l7,%o0
- mov %l0,%o1
- call printf
- nop
- sll %i2,16,%l0 !Obtenir l'octet le moins significatif, partie 1
- srl %l0,24,%l0 !Obtenir l'octet le moins significatif, partie 2
- stub %l0,[%l2+%l1] !Empiler l'octet
- inc %l1 !Incrementer le pointeur de pile
- setx printint,%l7,%o0
- mov %l0,%o1
- call printf
- nop
- empileFin:
- stuw %l1,[%i0+4] !enregistrer le nouveau pointeur de pile
- ret
- restore
- !---------------------------------------------------------------------------------
- /*
- Entrées : %i0 : adresse de la structure machineState
- %i1 : nombre d’octets à dépiler
- Sorties : %o0 : les octets dépilés (placés côte à côte sur 32 bits).
- */
- Depile:
- save %sp,-208,%sp
- lduw [%i0+4],%l1 !Obtention du pointeur de pile
- ldx [%i0+16],%l2 !Obtention du pointeur sur la memoire de la machine virtuelle
- cmp %i1,2 !Si cest un int (2 octets)
- be depile10 !branchement vers int
- nop !...
- !FLOAT (4 octets)
- dec %l1 ! decrementer le pointeur de pile
- ldub [%l2+%l1],%o0 ! Charge premier octet du chiffre
- sll %o0,24,%o0 ! Shift left plus significatif
- dec %l1 ! decrementer le pointeur de pile
- ldub [%l2+%l1],%l3 ! Charge deuxieme octet du chiffre
- sll %l3,16,%l3 ! Shift left plus significatif
- add %o0,%l3,%o0 !add les deux premiers octets dans o0
- dec %l1 ! decrementer le pointeur de pile
- ldub [%l2+%l1],%l3 ! Charge 3ieme octet du chiffre
- sll %l3,8,%l3 ! Shift left plus significatif
- add %o0,%l3,%o0 !add les 3 premiers octets dans o0
- dec %l1 ! decrementer le pointeur de pile
- ldub [%l2+%l1],%l3 ! Charge 4ieme octet du chiffre
- add %o0,%l3,%o0 !add les 4 premier octet dans o0
- ba depileFin
- nop
- depile10:!INT (2 octets)
- dec %l1 ! decrementer le pointeur de pile
- ldub [%l2+%l1],%o0 ! Charge premier octet du chiffre
- mov %o0,%l5
- sll %l5,8,%l5 ! Shift left plus significatif
- setx printint,%l7,%o0
- mov %l5,%o1
- call printf
- nop
- dec %l1 ! decrementer le pointeur de pile
- ldub [%l2+%l1],%l3 !charge deuxieme octet
- add %l5,%l3,%l5 !add les octets
- setx printint,%l7,%o0
- mov %l5,%o1
- call printf
- nop
- mov %l5,%i0
- setx tampon,%l7,%l0
- stw %l5,[%l0]
- depileFin:
- stuw %l1,[%i0+4] !enregistrer le nouveau pointeur de pile
- ret
- restore
- !---------------------------------------------------------------------------------
- /*
- POUR les EMU
- Entrées : %i0 : adresse de la structure instruction
- %i1 : adresse de la structure machineState
- */
- EmuPush:
- save %sp,-208,%sp
- mov %i1,%o0 !Premier param de empile = mache state
- lduw [%i0+8],%o2 !3 paramatre = les octect a empiler sur 32 biit
- lduw [%i0+16],%l1 !Obtention du fl
- cmp %l1,0
- be EmuPush10 !Branche is cest un int
- nop
- mov 4,%o1 !si cest un float Param2 = 4 octect
- ba EmuPushFin
- nop
- EmuPush10:
- mov 2,%o1 !si cest un int Param2 = 2 octect
- EmuPushFin:
- call Empile !Empile la valeur
- nop
- mov 0,%i0
- ret
- restore
- !---------------------------------------------------------------------------------
- EmuWrite:
- save %sp,-208,%sp
- mov %i1,%o0 !Premier param de depile = mache state
- lduw [%i0+8],%l1 !Obtention du type float ou int
- cmp %l1,1
- be EmuWrite10 !Branche is cest un int
- nop
- ba EmuWrite20 !Si cest un float
- nop
- EmuWrite10:
- mov 2,%o1 !param 2 2 octet si un int
- call Depile !Depile la val a imprimer
- nop
- !mov %i0,%l1 !l1 = valeur depiler
- setx tampon,%l7,%l1
- lduw [%l1],%o1
- setx printint,%l7,%o0
- !mov %i0,%o1
- call printf
- nop
- ba EmuWriteFin !
- nop
- EmuWrite20:
- mov 4,%o1 !param 2 4 octet si un float
- call Depile !Depile la val a imprimer
- nop
- !mov %i0,%l1 !l1 = valeur depiler
- setx printfloat,%l7,%o0
- mov %i0,%o1
- call printf
- nop
- EmuWriteFin:
- mov 0,%i0
- ret
- restore
- !---------------------------------------------------------------------------------
- EmuPop:
- save %sp,-208,%sp
- mov 1,%i0
- ret
- restore
- !---------------------------------------------------------------------------------
- EmuRead:
- save %sp,-208,%sp
- mov 1,%i0
- ret
- restore
- !---------------------------------------------------------------------------------
- EmuAdd:
- save %sp,-208,%sp
- mov 1,%i0
- ret
- restore
- !---------------------------------------------------------------------------------
- EmuSub:
- save %sp,-208,%sp
- mov 1,%i0
- ret
- restore
- !---------------------------------------------------------------------------------
- EmuMul:
- save %sp,-208,%sp
- mov 1,%i0
- ret
- restore
- !---------------------------------------------------------------------------------
- EmuDiv:
- save %sp,-208,%sp
- mov 1,%i0
- ret
- restore
- !---------------------------------------------------------------------------------
- EmuBz:
- save %sp,-208,%sp
- mov 1,%i0
- ret
- restore
- !---------------------------------------------------------------------------------
- EmuBn:
- save %sp,-208,%sp
- mov 1,%i0
- ret
- restore
- !---------------------------------------------------------------------------------
- EmuJmp:
- save %sp,-208,%sp
- mov 1,%i0
- ret
- restore
- .section ".rodata" !Section Read Only Data
- !Chaînes de caractères et constantes
- txt: .asciz "%d\n"
- subtxt: .asciz "SUB\n"
- multxt: .asciz "MUL\n"
- addtxt: .asciz "ADD\n"
- pushtxt: .asciz "PUSH\n"
- divtxt: .asciz "DIV\n"
- printint: .asciz "-Print: %d\n"
- printfloat: .asciz "-Print: %f\n"
- .section "bss"
- .align 8
- tampon: .skip 4*8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement