Professional Documents
Culture Documents
компјутерите
Поглавје 2
Вовед
• Ќе го обработиме инструкциското
множество развиено од MIPS Technologies
Пазари на MIPS
Основни операции
• Секој компјутер мора да може да извршува
аритметички операции
• Секоја MIPS аритметичка инструкција
извршува една операција врз точно две
променливи
• Пример (со нотација од MIPS асемблерскиот
јазик)
add a, b, c #sumata od b i c stavi ja vo a
ПОМАЛОТО Е ПОБРЗО
• MIPS конвенција за претставување на
регистрите
$s0, $s1, …
$t0, $t1, … - привремени регистри
$0, $1 , $2 ... , $31
• Пример
add $t0, $s1, $s2
Операнди
Име Пример Коментар
32 регистри $s0–$s7, $t0– Брзи локации за податоците. Во МИПС
$t9,$zero, $a0– податоците мора секогаш да
$a3, $v0–$v1, бидат сместени во регистри, за да
$gp, $fp, може врз нив да се изврши одредена
$sp,$ra, $at операција, регистарот $zero секогаш
е еднаков на нула, и регистарот
$at е резервиран од асемблерот за
соочување со големи константи.
Меморија Меморија
Голем Мал
ендијанец ендијанец
• Одговор:
0 17 18 8 0 32
$s1 $s2 $t0 машински
јазик
000000 10001 10010 01000 00000 100000
• Идеално сакаме:
– сите инструкции да бидат со една должина
– да постои само еден инструкциски формат
I-тип
Големата слика
• Денешните компјутери се базираат на два
фундаментални принципи:
1. Инструкциите може да се претстават како броеви
2. Програмите, како и броевите, може да се читаат
од и запишуваат во меморија
• Овие принципи доведоа до концептот
програми зачувани во меморија
• Уште повеќе, програмите се испорачуваат како
готови датотеки од бинарни броеви
• Компјутерите може да го користат готовиот
софтвер само ако се компатибилни со
инструкциското множество
• Затоа во индустријата егзистираат само мал
број на архитектури
Логички операции
• Резултатот во $t0 е
else Else:
f = g – h; sub $s0,$s1,$s2
Exit:
Јамки (while, for, repeat,…)
C израз MIPS код
Loop: sll $t1,$s3,2 # $t1= i*4
i+=1;
bne $t0,$s5, Exit
Exit:
Инструкции за споредување
• Од процедурата се враќаме до
повикувачкото место со jump register
jr $ra
Повик на процедура
• Program Counter (PC) е регистер каде се
чува адресата на инструкцијата што
моментално се извршува
• Се извршува процедурата X
• Можно решение
– Повикувачката процедура се грижи за регистрите
$a0-$a3 и $t0-$t9. Доколку и се потребни ги прелева
во стекот
– Повиканата процедура се грижи за регистрите
$s0-$s7 и $ra
Вгнездени процедури
fact:
addi $sp, $sp, –8
Зачувај $ra и
sw $ra, 4($sp) $a0 на стек
sw $a0, 0($sp) Дали n<1,
int fact(int n) slti $t0,$a0,1 Ако n≥1, оди на
{ beq $t0,$zero,L1 L1
if (n<1) addi $v0,$zero,1 Ако n<1 врати
return (1); addi $sp,$sp,8 1 ($v0), врати
else jr $ra од стек и назад
return (n*fact(n–1)); L1: addi $a0,$a0,–1 n=n-1 ($a0),
} jal fact повик fact
lw $a0, 0($sp)
Враќање од jal,
lw $ra, 4($sp) празни стек
addi $sp, $sp, 8
mul $v0,$a0,$v0 n*fact (n – 1)
jr $ra ($v0) и назад
Глобален покажувач
• Променливите во програмскиот јазик C
имаат тип (int, double,…) и магацинска
класа (automatic и static)
• Automatic променливите се локални за
процедурата и се уништуваат кога таа
завршува
• Static променливите се дефинираат надвор
од сите процедури и постојат независно од
нив
• За пристап до статичките променливи во
MIPS се користи глобален покажувач $gp
Алокација на големи податоци
• Стекот се користи и за чување на големи податочни
објекти (низи и структури) што се локални за
процедурата