rss
twitter
facebook

Home

Divisão

#--------------------------------------------------
# LINGUAGEM C PARA CONTA DE DIVISAO
#--------------------------------------------------
#int main(void)
#{
# char str[20];
# int dividendo, divisor, quociente, resto;
# print_str("Insira o dividendo: "); /* syscall */
# read_str(str, 20); /* syscall */
# dividendo = atoi(str);
# print_str("Insira o divisor: ");
# read_str(str, 20);
# divisor = atoi(str);
# quociente = dividendo / divisor;
# resto = dividendo % divisor;
# print_str("Quociente = ");
# print_int(quociente); /* syscall */
# print_str("Resto = ");
# print_int(resto);
# return 0;
#}
#--------------------------------------------------------
.data
string: .space 20
texto1: .asciiz"\n\n\tInsira o dividendo: "
texto2: .asciiz"\n\tInsira o divisor: "
texto3: .asciiz"\n\tQuociente= "
texto4: .asciiz"\n\tResto= "
prompt1: .asciiz"\n\t****************************"
prompt2: .asciiz"\n\t**"
prompt3: .asciiz"\n\t* Copyrirght by Entroncamento*"
prompt4:: .asciiz"\n\t**"
prompt5: .asciiz"\n\t***********"


#--------------------------------------------------------
# ESCREVER O CABECALHO
#--------------------------------------------------------
.text
.globl main
main: la $a0,prompt1
li $v0,4
syscall
la $a0,prompt2
li $v0,4
syscall
la $a0,prompt3
li $v0,4
syscall
la $a0,prompt4
li $v0,4
syscall
la $a0,prompt5
li $v0,4
syscall
#--------------------------------------------------------
# FIM DO CABECALHO
#--------------------------------------------------------



la $a0,texto1
li $v0,4
syscall # Faz um print string para o ecrã do "insira o dividendo"

la $a0,string
li $v0,8
li $a1,20
syscall

jal atoi # Chama a função "Atoi"
move $s0,$v0 # s0 fica com o valor devolvido pela fução "Atoi"
la $a0,texto2
li $v0,4
syscall # Faz um print string para o ecrã do " Insira o divisor: "

la $a0,string
li $v0,8
li $a1,20
syscall

jal atoi # jal para armazenar o endereço de retorno das subrotinas
move $s1,$v0 # s1 toma o valor devolvido pela fucção ATOI
div $s0,$s1 # Divisao s0/s1
mfhi $s2 # copia o resto da divisão para dentro de $s2 para ficar guardado
mflo $s3 # copia o quociente da divisao para dentro de $s3 para ficar guardado
move $a0,$s3
la $a1,string

jal pointer
la $a0,texto3
li $v0,4
syscall
la $a0,string
li $v0,4
syscall # print quociente

move $a0,$s2
la $a1,string
jal pointer
la $a0,texto4
li $v0,4
syscall

la $a0,string
li $v0,4
syscall # resto
li $v0,10
syscall

############# ATOI ########################
atoi: li $v0,0 # num=0
add $t1,$0,$a0 # p=s
add $t2,$a0,$a1 # s+n


Enquanto: lb $t3,0($t1) # Lê da memória *p
bgeu $t1,$t2,sair # Salta para o endereço Label if (p>=s+n) go to exit1
blt $t3,'0',sair # Salta para o endereço Label se o conteúdo do registo Rsrc1 é menor que quantidade Src2if (*p<'0') go to sair
bgt $t3,'9',sair # if (*p>'9') go to exit1
sub $t4,$t3,'0' # digito= *p-'0'
mul $v0,$v0,10 # num=10*num
add $v0,$v0,$t4 # num=10*num+digito
addiu $t1,$t1,1 # Incrementa de 1 em 1 p++
j Enquanto
sair: jr $ra

pointer : add $sp,$sp,-4
sw $ra,0($sp)
li $t1,10
li $t5,0 # i=0
move $t3,$a0 # n
move $t4,$a1 # *s
do: div $t3,$t1 # n/10
mfhi $t2 # resto
mflo $t0 # quociente
add $t2,$t2,'0' # resto=resto+'0'
sb $t2,0($t4) # &s[0[=resto
addiu $t4,$t4,1 # *(s+1)
addi $t5,$t5,1 # i++
move $t3,$t0
bnez $t0,do # enquanto (quociente!=0)
sb $0,0($t4) # colocar caracter nulo

move $t1,$t4 # ponteiro para o fim da lista
addi $t1,$t1,-1
move $t2,$a1 # ponteiro para o inicio da lista
if: ble $t1,$t2,Fim
lb $t4,0($t1)
lb $t5,0($t2)
sb $t5,0($t1)
sb $t4,0($t2)
addi $t2,$t2,1
addi $t1,$t1,-1
j if
Fim: lw $ra,0($sp)
addi $sp,$sp,4
jr $ra

0 comentários:

 
Powered by Blogger