Técnicas de programação em assembly

 

Exercícios

 

a)
	main ()
	{  	int a, b, c;
		a=0;
		b=2;
		c=a+b;
	}

 

Resolução

 

	# a em $s0, b em $s1, c em $s2
	.text
	main:
		li $s0, 0			# a = 0
		li $s1, 2			# b = 2
		add $s2, $s0, $s1		# c = a + b
		jr $ra

 


b)
	main ()
	{	int a, b, c, d, e;
		e = (a+b) - (c+d);
	}

 


c)
	main()
	{	int a, b, c;
		if (a>b) c = a-b;
		else c = b-a;
	}

 

Resolução

 

	# a em $s0, b em $s1, c em $s2
	.text
	main:

		bge $s0, $s1, else
		sub $s2, $s0, $s1			# c = a-b
		j fim
	else:
		sub $s2, $s1, $s0			# c = b-a
	fim:
		jr $ra

 

 


d)
	main ()
	{	int a;
		while (a<20) a++;
	}

 


e) Some todos os valores de uma lista de 100 inteiros guardados em memória.

 

Resolução

 

	.data
	lista: .space 400		# reserva 100 inteiros (100*4 bytes)
	.text
	main:
		li $t0, 0		# contador
		li $t1, 0 		# acumulação da soma
		la $t2, lista	# endereço de lista
	ciclo:
		bge $t0, 100, fim
		lw $t3, 0($t2)	# $t3 = *lista
		add $t1, $t1, $t3
		addi $t3, $t3, 4	# aponta p/ o próximo
		addi $t0, $t0, 1
		j ciclo
	fim:
		jr $ra

 


f) Repita o exercício anterior, parando se algum valor for menor que 5.


g)

 

	main ()
	{	int a, b, c;
		a=10;
		b=20;
		for (c=0 ; c<b ; c++)
			if (c<a) a--;
			else b--;
	}