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
- setx tampon,%l7,%l0 !Adresse du tampon
- stuw %i2,[%l0] !Enregistrer le nombre à l'adresse du tampon
- sub 4,%i1,%l1 !index de debut du nombre
- mov 0,%l2 !compteur de la boucle
- ldx [%i0+16],%l3 !Obtention du pointeur sur la memoire de la machine virtuelle
- empile10:
- add %l1,%l2,%l4 !index actuel du tampon
- ldub [%l0+%l4],%l4 !charger octet actuel
- lduw [%i0+4],%l5 !Obtention du pointeur de pile
- stub %l4,[%l3+%l5] !Sauvegarder l'octet
- inc %l5 !incrementer le pointeur de pile
- stuw %l5,[%i0+4] !enregistrer le nouveau pointeur de pile
- inc %l2 !incrementer le compteur de la boucle
- cmp %l2,%i1 !condition de la boucle
- bl empile10 !continuer si il rester des octets a empiler
- nop
- 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
- ret
- restore
- EmuPush:
- save %sp,-208,%sp
- mov 0,%i0
- ret
- restore
- EmuWrite:
- save %sp,-208,%sp
- mov 1,%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"
- .section "bss"
- .align 8
- tampon: .skip 4*8
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement