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"
- /**
- %i0 = Pointeur sur une structure instruction
- %i1 = Pointeur sur une structure machine state
- **/
- 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
- mov %l0,%l2
- ldub [%l0+%l1],%l0 ! Lecture du premier octet de l'instruction courante
- cmp %l0,0x40 ! Est-ce l'instruction PUSH? (0x40)
- be decodePush
- nop
- cmp %l0,0x21
- be decodeWrite
- nop
- cmp %l0,0 ! Est-ce l'instruction HALT? (0x00)
- bnz decodeError ! sinon, le reste n'est pas encore supporte: Erreur.
- nop !...
- ! Opération HALT
- stw %g0,[%i0] ! type d'instruction: systeme (0) - (MODE / machine.h)
- stw %g0,[%i0+4] ! numero d'operation: 0 (HALT) - (OPÉRATION / machine.h)
- ba decodeEnd
- nop
- decodePush:
- mov 1,%l0 ! ...
- stw %l0,[%i0] ! Met le type d'instruction: 1
- mov 0,%l0 ! ...
- stw %l0,[%i0+4] ! Met le numero d'operation: 0 (PUSH)
- mov 3,%l0 ! ...
- stw %l0,[%i0+20] ! Met la taille de l'opération push dans l'instruction
- add %l2,%l1,%l2 ! ...
- ldub [%l2 + 1],%l3 ! Charge le premier octet du chiffre
- sll %l3,4,%l3 ! Shift left
- ldub [%l2 + 2],%l0 ! Charge le deuxieme octet du chiffre
- add %l3,%l0,%l3 ! Additione les deux octets
- stw %l3,[%i0+8] ! Stock le chiffre
- ba decodeEnd
- nop
- decodeWrite:
- mov 0,%l0 ! ...
- stw %l0,[%i0] ! Met le type d'instruction: 1
- mov 4,%l0 ! ...
- stw %l0,[%i0+4] ! Met le numero d'operation: 0 (PUSH)
- mov 1,%l0 ! ...
- ! stw %l0,[%i0+20] ! Met la taille de l'opération write dans l'instruction
- ba decodeEnd
- nop
- decodeEnd:
- mov 0,%i0 ! code d'erreur 0: decodage reussi
- ret
- restore
- decodeError:
- mov 1,%i0 !code d'erreur 1: instruction illegale.
- ret
- restore
- /**
- %i0 = Adresse de la structure machine state
- %i1 = Nombre d'octet à empiler
- %i2 = Les octets à empiler placer côte à côte sur 32 bits
- Sortie:
- Aucune
- **/
- Empile:
- save %sp,-208,%sp
- setx print1,%l7,%o0
- call printf
- nop
- ret
- restore
- /**
- %i0 = Adresse de la structure machine state
- %i1 = Nombre d'octet à dépiler
- Sortie:
- %o0 = Les octets dépiler placer côte à côte sur 32 bits
- **/
- Depile:
- save %sp,-208,%sp
- ret
- restore
- EmuPush:
- save %sp,-208,%sp
- ! Doit Empiler la valeur
- ! ...
- ! lduw [%i1],%l1 ! Obtention du pointeur de la pile
- ! ! stw 5,[%l1 +] ! Met 5 dans la pile
- ! setx printPush,%l7,%o0
- ! mov %l1,%o1
- ! call printf
- ! nop
- mov 0,%i0
- ret
- restore
- EmuWrite:
- save %sp,-208,%sp
- ! Dépile et print
- !depile
- !%i0 = octet dépiler sur 32 bits (4 octets)
- 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"
- print1: .asciz "-Empile-\n"
- print2: .asciz "-Print: %d\n"
- printPush: .asciz "-Push: %s\n"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement