.data
$$a: .space 4
$$b: .space 4
.text
__start:
jal main
li $v0, 10
syscall
pgcd :
subi $sp, $sp, 4
sw $fp, 0($sp)
move $fp, $sp
subi $sp, $sp, 4
sw $ra, 0($sp)
subi $sp, $sp, 4
lw $t0, 8($fp) #variable argument $a
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, 8($fp) #variable argument $a
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, 4($fp) #variable argument $b
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t2, 0($sp)
addi $sp, $sp, 4
lw $t1, 0($sp)
addi $sp, $sp, 4
div  $t1, $t2
mflo $t0
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, 4($fp) #variable argument $b
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t2, 0($sp)
addi $sp, $sp, 4
lw $t1, 0($sp)
addi $sp, $sp, 4
mult  $t1, $t2
mflo $t0
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t2, 0($sp)
addi $sp, $sp, 4
lw $t1, 0($sp)
addi $sp, $sp, 4
sub $t0, $t1, $t2
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, 0($sp)
addi $sp, $sp, 4
sw $t0, -8($fp) #variable locale
lw $t0, -8($fp) #variable locale
subi $sp, $sp, 4
sw $t0, 0($sp)
li $t0, 0
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t2, 0($sp)
addi $sp, $sp, 4
lw $t1, 0($sp)
addi $sp, $sp, 4
li $t0, 1
beq $t1, $t2 e0
li $t0, 0
e0:
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, 0($sp)
addi $sp, $sp, 4
beq $t0 $zero e1
lw $t0, 4($fp) #variable argument $b
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, 0($sp)
addi $sp, $sp, 4
sw $t0 12($fp) #Adresse de retour
addi $sp, $sp 4 # desallocation variables locales
lw $ra, 0($sp)
addi $sp, $sp, 4
lw $fp, 0($sp)
addi $sp, $sp, 4
jr $ra
j e2
e1:
subi $sp, $sp, 4 #Val Retour
lw $t0, 4($fp) #variable argument $b
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, -8($fp) #variable locale
subi $sp, $sp, 4
sw $t0, 0($sp)
jal pgcd
addi $sp, $sp, 8 #désalocation des arguments
lw $t0, 0($sp)
addi $sp, $sp, 4
sw $t0 12($fp) #Adresse de retour
addi $sp, $sp 4 # desallocation variables locales
lw $ra, 0($sp)
addi $sp, $sp, 4
lw $fp, 0($sp)
addi $sp, $sp, 4
jr $ra
e2:
addi $sp, $sp 4 # desallocation variables locales
lw $ra, 0($sp)
addi $sp, $sp, 4
lw $fp, 0($sp)
addi $sp, $sp, 4
addi $sp, $sp, 4 #ignore valeur de retour
jr $ra
main :
subi $sp, $sp, 4
sw $fp, 0($sp)
move $fp, $sp
subi $sp, $sp, 4
sw $ra, 0($sp)
li $v0 5
syscall
move $t0, $v0
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, 0($sp)
addi $sp, $sp, 4
sw $t0, $$a
li $v0 5
syscall
move $t0, $v0
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, 0($sp)
addi $sp, $sp, 4
sw $t0, $$b
lw $t0, $$b
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, $$a
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t2, 0($sp)
addi $sp, $sp, 4
lw $t1, 0($sp)
addi $sp, $sp, 4
li $t0, 1
blt $t1, $t2 e3
li $t0, 0
e3:
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, 0($sp)
addi $sp, $sp, 4
beq $t0 $zero e4
subi $sp, $sp, 4 #Val Retour
lw $t0, $$a
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, $$b
subi $sp, $sp, 4
sw $t0, 0($sp)
jal pgcd
addi $sp, $sp, 8 #désalocation des arguments
lw $t0, 0($sp)
addi $sp, $sp, 4
move $a0, $t0
li $v0, 1
syscall
li  $a0, '\n'
li  $v0, 11
syscall
j e5
e4:
subi $sp, $sp, 4 #Val Retour
lw $t0, $$b
subi $sp, $sp, 4
sw $t0, 0($sp)
lw $t0, $$a
subi $sp, $sp, 4
sw $t0, 0($sp)
jal pgcd
addi $sp, $sp, 8 #désalocation des arguments
lw $t0, 0($sp)
addi $sp, $sp, 4
move $a0, $t0
li $v0, 1
syscall
li  $a0, '\n'
li  $v0, 11
syscall
e5:
addi $sp, $sp 0 # desallocation variables locales
lw $ra, 0($sp)
addi $sp, $sp, 4
lw $fp, 0($sp)
addi $sp, $sp, 4
addi $sp, $sp, 4 #ignore valeur de retour
jr $ra
