You are on page 1of 6

Архитектура и организација на компјутери

Лабораториска вежба бр. 3 – запознавање со


инструкциското множество MIPS

Разгледајте ги и анализирајте ги дадените примери.


Пример 1
C МИПС
.data
int a = 5; a: .word 5
int b = 2021; b: .word 2021

int main() { .text


la $t0, a #adresata na a smesti ja vo t0
lw $t1, 0($t0)
la $t0, b #adresata na b smesti ja vo t0
int c = a - b; lw $t2, 0($t0)
sub $t3, $t1, $t2
printf("%d", c); add $a0, $t3, $zero
li $v0, 1 #ispecati ja sodrzinata na a0
syscall

return 0; li $v0, 10 #izlez od main


} syscall

Пример 2
C МИПС
.data
int niza[6] = {123, 456, 789, numbers: .word 123, 456, 789, 987,654,
987,654, 321}; 321
int main() {
int z; .text
#lokalna promenliva koja ke bide
#smesetna vo nekoj registar
la $t1, numbers # procitaj ja poc.
niza[2] = niza[0] + niza[4]; Addrna
# nizata
z = niza[2]; lw $t0, 0($t1)
lw $t2, 16($t1)
add $t3, $t0, $t2
printf("%d", z); sw $t3, 8($t1)

addi $a0, $t3, $zero

li $v0, 1
return 0; syscall
}
li $v0, 10
syscall
Архитектура и организација на компјутери

Пример 3
C МИПС

int main(void) { .data


int a; .text
scanf("%d", &a); # прочитај цел број
li $v0, 5
syscall
# прочитаниот број се внесува во $а0
// помести на лево
a = (a << 4); sll $a0, $a0, 4 #помножи со 2^4=16
// помести на десно srl $a0, $a0, 3 #подели со 2^3=8
a = (a >> 3);

li $v0, 1 # испечати на екран


printf("%d", a); syscall

li $v0, 10 # крај на програмата


syscall
return 0;
}

Пример 4
C МИПС
.data
int a = 123456; a: .word 123456
int b = 56; b: .word 56
int c = 3; c: .word 3

int main(void) { .text


int proiz, kol, ost; la $t0, c
lw $t1, 0($t0)
la $t0, b
lw $t2, 0($t0)
proiz = c * b; la $t0, a
lw $t6, 0($t0)
mult $t1, $t2
kol = a/b; mflo $t3
ost = a%b;

div $t6, $t2 #t6 se deli so t2


printf("%d", proiz); mflo $t4 #smesti kolicnik vo t4
mfhi $t5 #smesti ostatok vo t5

li $v0, 1
printf("%d", kol + ost); add $a0, $t3, $zero
syscall
return 0;
} add $a0, $t4, $t5
syscall
Архитектура и организација на компјутери

li $v0, 10
syscall

Пример 5
C МИПС
.data
.text
int main() { li $v0, 5
int z; syscall
scanf("%d", &z);
add $t0, $v0, $zero
//apsolutna vrednost
if (z < 0) { bge $t1, $zero, else #branch
z = -z; # greater or equal
} sub $t0, $zero, $t0
else j nadvor
z=z-4; else:
printf("%d", z); addi $t0, $t0, -4
nadvor:
return 0;
} add $a0, $t0, $zero
li $v0, 1
syscall

li $v0, 10
syscall

Решете ги слдните задачи:

Задача 1) Преведете ја програмата од пример 1 (од асемблер во машински јазик), и


извршете ја чекор по чекор.
a) Анализирајте ја содржината на регистрите $a0, $t0, $t1, $t2 и $t3 (внесете ги
сите чекори до завршување на програмата).

Чекор a0 t0 t1 t2 t3

7
Архитектура и организација на компјутери

b) Променете ја задачата така што b=-100 и во $a0 ќе ја сместите вредноста


16a+4b (користете поместување) и прикажете ја истата на екран. Преведете ја и
извршете ја модифицираната програма чекор по чекор.
Програма

Задача 2) Извршете ја ја програмата од пример 2 чекор по чекор.


c) Анализирајте ја содржината на податочниот дел од меморијата. Која е
почетната адреса на полето?

d) Напишете ја содржината на податочниот дел од меморијата при извшување на


првата инструкција и по извршувањето на последната инструкција.

e) Напишете ја содржината на регистрите $t0, $t1, $t2 и $t3.

Чекор t0 t1 t2 t3

5
Архитектура и организација на компјутери

Задача 3) Кој е соодветниот C израз за следните МИПС изрази, ако се претпостави


дека а, b,c и d се сместени во регистрите $s1, $s2, $s3, $s4 соодветно?
addi $s1, $s2, 5
addi $s3, $s4, -2
div $s1, $s3
mfhi $s2
Програма

Дополнете ја програмата, така што на регистрите $s1, $s2, $s3, $s4 ќе им дадете
почетни вредности 4, 9, 10 и 7. Која е нивната вредност по завршување на
програмата?

Програма

Вредности на регистрите
Архитектура и организација на компјутери

Задача 4) За следниот код во C напишете соодветна асемблерска програма, под


претпоставка дека почетната адреса на А е сместена во $s1.
int A[10] = {1,3,5,7,9,10,11,12,13,15};
int i=5 (i и j да се внесат како променливи во податочниот сегмент)
int j=12;
j=j & 3
A[i+2] = A[i/2] + j%5;
printf(“%d”,j)
int s = A[i+1];
printf(“%d”,s)

Програма

You might also like