mips-101
in this repository you will find codes in C and their equivalence in MIPS Assembly
Assembly★ 62⑂ 3 forksMITupdated 3 weeks ago
git clone https://github.com/zakarialaoui10/mips-101.gitzakarialaoui10/mips-101README.mdfork it — it’s yours
This repository contains C code examples along with their MIPS Assembly equivalents.
- 1-Hello World
- 2-Print an integer
- 3-Print an float
- 4-Read and print an integer
- 5-Addition of 2 integers
- 6-Substraction of 2 integers
- 7-If else statement
- 8-nested if
hello world
C
#include<stdio.h>
int main(){
printf("hello world");
return 0;
}
MIPS Assembly
.data msg: .asciiz "hello world" .text li $v0,4 la $a0,msg syscall
print an integer
C
#include<stdio.h>
int main(){
int number=2;
printf("%d",number);
return 0;
}
MIPS Assembly
.data number: .word 2 .text li $v0,1 lw $a0,number syscall
print a float
C
#include<stdio.h>
int main(){
float number=2.5;
printf("%f",number);
return 0;
}
MIPS Assembly
.data number: .float 2.5 .text li $v0,2 lwc1 $f12,number syscall
read and print an integer
C
#include<stdio.h>
int main(){
int a;
printf("enter an integer : ");
scanf("%d",&a);
printf("your integer is : ");
printf("%d",a);
return 0;
}
MIPS Assembly
.data
msg1: .asciiz "enter an integer : "
msg2: .asciiz "your integer is : "
.text
print_msg1:li $v0,4
la $a0,msg1
syscall
read_integer:li $v0,5
syscall
la $s0,($v0) #save_integer_in_s0:
print_msg2:li $v0,4
la $a0,msg2
syscall
print_integer:li $v0,1
la $a0,($s0)
syscall
addition_of_2_integers
C
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d%d",&a,&b);
c=a+b;
printf("%d",c);
return 0;
}
MIPS Assembly
li $v0,5 syscall move $s0,$v0 li $v0,5 syscall move $s1,$v0 add $s2,$s1,$s0 li $v0,1 move $a0,$s2 syscall
substraction of 2 integers
C
#include<stdio.h>
int main()
{
int a,b,c;
scanf("%d%d",&a,&b);
c=a-b;
printf("%d",c);
return 0;
}
MIPS Assembly
li $v0,5 syscall move $s0,$v0 li $v0,5 syscall move $s1,$v0 sub $s2,$s0,$s1 li $v0,1 move $a0,$s2 syscall
if else statement
C
#include<stdio.h>
int main(){
int a=5,b=3,c=0;
if(a==b) c=a+b;
else c=a-b;
printf("%d",c);
return 0;
}
MIPS Assembly
li $t0,5 #a li $t1,3 #b li $t2,3 #c beq $t0,$t1,if j else if:add $t2,$t0,$t1 else:sub $t2,$t0,$t1 print: li $v0,1 move $a0,$t2 syscall
nested if
C
#include<stdio.h>
int main(){
int a=1;
int b=4;
int c;
if(a==1)
{
c=a;
if(b!=3){
c+=b;
}
}
printf("%d",c);
}
MIPS Assembly
li $t0,1 #a li $t1,4 #b beq $t0,1,if j print if: la $t2,($t0) #c beq $t1,3,print add $t2,$t2,$t1 print: li $v0,1 move $a0,$t2 syscall
switch statement
C
#include<stdio.h>
int main(){
int a;
int b=0;
scanf("%d",&a);
switch(a){
case 0:b=-1; break;
case 1:b=0; break;
default :b=1; break;
}
printf("%d",b);
}
MIPS Assembly
# a====>$s0
# b====>$s1
read_a:li $v0,5
syscall
la $s0,($v0)
switch:
beq $s0,0,case0
beq $s0,1,case1
j default
case0:li $s1,-1
j print
case1:li $s1,0
j print
default:li $s1,1
print:
li $v0,1
move $a0,$s1
syscall
Power
C
#include<stdio.h>
int main(){
int x,n;
scanf("%d%d",&x,&n);
int i=0;
int p=1;
for(i=0;i<n;i++)
p*=x;
printf("%d",p);
}
MIPS Assembly
read_x:li $v0,5
syscall
la $s0,($v0)
read_n:li $v0,5
syscall
la $s1,($v0)
li $s2,1 #p
li $t0,0
loop:
beq $t0,3,print
mult $s2,$s0
mflo $s2
addi $t0,$t0,1
j loop
print:
li $v0,1
move $a0,$s2
syscall
Factorial
C
#include<stdio.h>
int main(){
int x;
scanf("%d",&x);
int i;
int f=1;
for(i=x;i>1;i--)
f*=i;
printf("%d",f);
}
MIPS Assembly
li $v0,5 syscall la $s0,($v0) li $s2,1 la $t0,($s0) loop: beq $t0,1,print mult $s2,$t0 mflo $s2 subi $t0,$t0,1 j loop print : li $v0,1 la $a0,($s2) syscall
the parity of a number using the rest of the division
C
#include<stdio.h>
int main(){
int number;
read:scanf("%d",&number);
if(number%2==0){
printf("even\n");
goto read;
}
else printf("odd\n");
goto read;
}
MIPS Assembly
.data
even : .asciiz "even\n"
odd : .asciiz "odd\n"
.text
read:li $v0,5
syscall
move $s0,$v0
li $t0,2
div $s0,$t0
mfhi $t1
beq $t1,0,iseven
li $v0,4
la $a0,odd
syscall
j read
iseven: li $v0,4
la $a0,even
syscall
j read
the parity of a number using bitwise and operator
C
#include<stdio.h>
int main(){
int number,c;
read:scanf("%d",&number);
if((number & 1)==0){
printf("even\n");
goto read;
}
else printf("odd\n");
goto read;
}
MIPS Assembly
.data
even : .asciiz "even\n"
odd : .asciiz "odd\n"
.text
read:li $v0,5
syscall
move $s0,$v0
li $t0,2
andi $t0,$s0,1
beq $t0,0,iseven
li $v0,4
la $a0,odd
syscall
j read
iseven: li $v0,4
la $a0,even
syscall
j read
swap 2 numbers using auxiliary variable
C
#include<stdio.h>
int main(){
int a=3,b=7,c;
c=a;
a=b;
b=c;
print("%d\n%d",a,b);
return 0;
}
MIPS Assembly
li $s0,3 #a li $s1,7 #b la $t0,($s0) la $s0,($s1) la $s1,($t0) li $v0,1 la $a0,($s0) syscall li $v0,1 la $a0,($s1) syscall
swap 2 numbers using addition and subtraction
C
#include<stdio.h>
int main(){
int a=3,b=7;
a=a+b;
b=a-b;
a=a-b;
print("%d\n%d",a,b);
return 0;
}
MIPS Assembly
li $s0,3 li $s1,7 add $s0,$s0,$s1 sub $s1,$s0,$s1 sub $s0,$s0,$s1 li $v0,1 la $a0,($s0) syscall li $v0,1 la $a0,($s1) syscall
swap 2 numbers using bitwise xor operator
C
#include<stdio.h>
int main(){
int a=3,b=7;
a=a^b;
b=a^b;
a=a^b;
printf("%d\n%d",a,b);
return 0;
}
MIPS Assembly
li $s0,3 li $s1,7 xor $s0,$s0,$s1 xor $s1,$s0,$s1 xor $s0,$s0,$s1 li $v0,1 la $a0,($s0) syscall li $v0,1 la $a0,($s1) syscall
Read and Print elements of an array
C
#include<stdio.h>
int main(){
int arr[5];
int i=0;
//read
for(i=0;i<5;i++){
scanf("%d",&arr[i]);
}
//print
for(i=0;i<5;i++){
printf("%d",arr[i]);
printf(" ");
}
}
MIPS Assembly
.data arr: .space 20 #(20=5*4(Size of word)) space: .asciiz " " .text li $t0,0 read: li $v0,5 syscall sw $v0,arr($t0) addi $t0,$t0,4 blt $t0,20,read la $s0,arr li $t0,0 print: li $v0,1 lw $a0,($s0) syscall addi $t0,$t0,4 addi $s0,$s0,4 li $v0,4 la $a0,space syscall blt $t0,20,print
Array's elements somme
C
#include<stdio.h>
int main(){
int tab[10]={0,1,2,3,4,5,6,7,8,9};
int s=0;
int i=0;
while(i<10){
s+=*(tab+i); // s=s+tab[i]
i++;
}
printf("%d",s);
return 0;
}
MIPS Assembly
.data tab: .byte 0,1,2,3,4,5,6,7,8,9 .text main: la $t0, tab li $a0,0 #compteur li $s0,0 #somme loop: lb $t1,($t0) add $s0,$s0,$t1 addi $t0,$t0,1 addi $a0,$a0,1 bne $a0,10,loop
Print a random integer belongs to the interval 0,10
C
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
int main(){
srand(time(NULL));
int r = rand()%10;
printf("%i", r);
return 0;
}
MIPS Assembly
In order to get a random number we have to assign the register $v0 with the value 42. The value stored in $a1 represent the upper value of the generated random number.
.text #get random int belongs to the interval 0,10 li $v0,42 li $a1,10 syscall print: li $v0,1 syscall
more like this
smb-vanilla-port
A C and C++ decompilation of the NES games "Super Mario Bros" and "Super Mario Bros: The Lost Levels"
C★ 51
ML-MCU
Code for IoT Journal paper 'ML-MCU: A Framework to Train ML Classifiers on MCU-based IoT Edge Devices'
C★ 51