70
Асемблерски језик и програмирање процесора MIPS Увод Регистри процесора Инструкције језика Операнди Формат инструкција

Асемблерски језик и програмирање процесора MIPS

Embed Size (px)

DESCRIPTION

Асемблерски језик и програмирање процесора MIPS. Увод Регистри процесора Инструкције језика Операнди Формат инструкција. Увод. Рачунар разуме инструкције на машинском језику , тј. низове бинарних цифара. - PowerPoint PPT Presentation

Citation preview

Page 1: Асемблерски језик и програмирање процесора  MIPS

Асемблерски језик и програмирање процесора MIPS

Увод Регистри процесора Инструкције језика Операнди Формат инструкција

Page 2: Асемблерски језик и програмирање процесора  MIPS

Увод

Рачунар разуме инструкције на машинском језику, тј. низове бинарних цифара.

Са друге стране, људима тај облик није подесан за писање и разумевање програма. Људи много лакше пишу и разумевају симболе уместо дугих низова цифара.

Page 3: Асемблерски језик и програмирање процесора  MIPS

Увод

Асемблерски језик је симболичка репрезентација бинарно кодираних инструкција машинског језика.

Асемблерски језик је много читљивији од машинског управо због коришћења симбола уместо битова.

Page 4: Асемблерски језик и програмирање процесора  MIPS

Увод Симболи означавају одређене

шаблоне битова као што су кодови операција или спецификације регистара.

Page 5: Асемблерски језик и програмирање процесора  MIPS

Увод

Уз то, асемблерски језик омогућава коришћење лабела.

Лабеле су симболичка имена појединих меморијских локација било да оне садрже инструкције програма или податке.

Page 6: Асемблерски језик и програмирање процесора  MIPS

Увод

Рачунар, међутим, и даље разуме само машински језик!

Потребно нам је средство које ће програм написан на асемблерском језику да преведе на машински.

Ова врста преводиоца назива се асемблер.

Page 7: Асемблерски језик и програмирање процесора  MIPS

Увод

Асемблер омогућава писање програма на погоднији начин.

Симболичка имена операција и локација су један вид ове презентације.

Програмска средства, као што су макрои, такође побољшавају јасноћу програма.

Page 8: Асемблерски језик и програмирање процесора  MIPS

Увод

Изворни фајл

Изворни фајл

Изворни фајл

Асемблер

Асемблер

Асемблер

Објектни фајл

Објектни фајл

Објектни фајл

Линкер Извршни фајл

Библиотекепрограма

Сл. 1. Процес настанка извршне датотеке.

Page 9: Асемблерски језик и програмирање процесора  MIPS

Увод

Асемблер чита поједине изворне фајлове и производи објектне фајлове који садрже машинске инструкције и информације које помажу комбиновању неколико објектних фајлова у програм.

Већина програма састоји се од неколико датотека или модула које се пишу и преводе независно.

Page 10: Асемблерски језик и програмирање процесора  MIPS

Увод

Модул обично садржи референце на потпрограме и податке дефинисане у другим модулима и библиотекама.

Код у модулу се не може извршити када постоје неразрешене рефе-ренце на лабелу у другим објектним датотекама или модулима.

Page 11: Асемблерски језик и програмирање процесора  MIPS

Увод

Још једно средство, линкер, комбинује колекцију објектних и библиотечких фајлова у извршни фајл који се може извршити на рачунару.

Page 12: Асемблерски језик и програмирање процесора  MIPS

Увод001001111011110111111111111000001010111110111111000000000001010010101111101001000000000000100000101011111010010100000000001001001010111110100000000000000001100010101111101000000000000000011100100011111010111000000000000111001000111110111000000000000001100000000001110011100000000000011001001001011100100000000000000000010010100100000001000000000110010110101111101010000000000000011100000000000000000001111000000100100000001100001111110010000010000100010100001000001111111111110111101011111011100100000000000110000011110000000100000100000000000010001111101001010000000000011000000011000001000000000000111011000010010010000100000001000011000010001111101111110000000000010100001001111011110100000000001000000000001111100000000000000000100000000000000000000001000000100001

Сл. 2. Машински код процесора MIPS за израчунавање суме квадрата целих бројева од 0 до 100.

Page 13: Асемблерски језик и програмирање процесора  MIPS

Увод

Уз познавање начина бинарног кодирања инструкција, могли би смо да добијемо симболички код.

Page 14: Асемблерски језик и програмирање процесора  MIPS

Уводaddiu $29, $29, -32sw $31, 20($29)sw $4, 32($29)sw $5, 36($29)sw $0, 24($29)sw $0, 28($29)lw $14, 28($29)lw $24, 24($29)multu $14, $14addiu $8, $14, 1slti $1, $8, 101sw $8, 28($29)mflo $15addu $25, $24, $15bne $1, $0, -9sw $25, 24($29)lui $4, 4096lw $5, 24($29)jal 1048812addiu $4, $4, 1072lw $31, 20($29)addiu $29, $29, 32jr $31move $2, $0

Сл. 3. Исти код на асемблерском језику али без означених регистара, меморијских локација и коментара.

Page 15: Асемблерски језик и програмирање процесора  MIPS

Увод

Међутим, много је јасније када се уведу симболичка имена за регистре и меморијске локације.

Имена која почињу тачком (.data, .globl, и др.) представљају асемблерске директиве које казују асемблеру како да преведе програм али не производе машинске инструкције.

Page 16: Асемблерски језик и програмирање процесора  MIPS

Увод

Имена праћена двотачком представљају лабеле или имена меморијских локација.

Page 17: Асемблерски језик и програмирање процесора  MIPS

Увод.text.align 2.globl main

main:subu $sp, $sp, 32sw $ra, 20($sp)sd $a0, 32($sp)sw $0, 24($sp)sw $0, 28($sp)

loop:lw $t6, 28($sp)mul $t7, $t6, $t6lw $t8, 24($sp)addu $t9, $t8, $t7sw $t9, 24($sp)addu $t0, $t6, 1sw $t0, 28($sp)ble $t0, 100, loopla $a0, strlw $a1, 24($sp)jal printfmove $v0, $0lw $ra, 20($sp)addu $sp, $sp, 32jr $ra.data.align 0

str:.asciiz "The sum from 0 .. 100 is %d\n"

Сл. 4. Исти код на асемблерском језику али са ознакама регистара и меморијских локација али без коментара.

Page 18: Асемблерски језик и програмирање процесора  MIPS

Увод

Насупрот томе, исти код на вишем програмском језику, као што је C, је концизнији и јаснији.

Page 19: Асемблерски језик и програмирање процесора  MIPS

Увод

#include <stdio.h>int main (int argc, char *argv[])

{int i;int sum = 0;for (i = 0; i <= 100; i = i + 1)

sum = sum + i * i;printf ("The sum from 0 .. 100 is %d\n", sum);}

Сл. 5. Исти код на програмском језику C.

Page 20: Асемблерски језик и програмирање процесора  MIPS

Увод У општем случају асемблерски језик има

двојаку улогу. Прва улога је да представља излазни

језик компилатора.

Сл. 6. Асеблерски програм пише програмер или је он излаз компилатора.

Page 21: Асемблерски језик и програмирање процесора  MIPS

Увод Друга улога је да представља језик на

коме се пишу програми. Ова улога је некада била доминантна! Данас то није случај, али се асемблерски

језик користи тамо где је брзина рада или величина програма критична за искоришћење хардверских средстава, а при томе не постоји одговарајући аналогон у вишем програмском језику.

Page 22: Асемблерски језик и програмирање процесора  MIPS

Увод

Зашто користимо асемблерски језик? Брзина и величина програма могу да

буду од критичне важности, као у уграђеним рачунарима (embedded computer).

У програмима где су поједни делови критични у погледу времена извршења користи се хибридни приступ.

Page 23: Асемблерски језик и програмирање процесора  MIPS

Увод Компилатори су обично бољи од

програмера, али програмери боље разумеју алгоритме и понашање програма и, за разлику од компилатора, могу да имају у виду више процедура када пишу код за једну од њих. Додуше, у будућности ће програмери мање бити у стању да овај посао обављају боље од компилатора.

Page 24: Асемблерски језик и програмирање процесора  MIPS

Увод Још једна битна предност

асемблерског језика је у могућности да се користе специјализоване инструк-ције.

Најзад, тамо где нема расположивог вишег програмског језика остаје нам само да користимо асемблерски језик.

Page 25: Асемблерски језик и програмирање процесора  MIPS

Увод

Недостаци асмеблерских језика: Машини оријентисани језици. Изворни код је много дужи него код

виших програмских језика што смањује продуктивност.

Дужи програми су тежи за читање и разумевање и могу да имају много више багова.

Page 26: Асемблерски језик и програмирање процесора  MIPS

Регистри процесора

Page 27: Асемблерски језик и програмирање процесора  MIPS

Регистри процесора

Page 28: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Да би могли да управљамо хардвером рачунара, морамо да “говоримо” његовим језиком!

Речи језика машине називају се инструкцијама.

“Речник” овог језика назива се скупом инструкција.

Page 29: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Сваки рачунар мора да буде у стању да извршава аритметичке операције.

Једна од инструкција асемблерског језика процесора MIPS

add a, b, c

налаже да се саберу променљиве b и c а резултат смести у a.

Page 30: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Свака инструкција мора да обавља само једну операцију.

Инструкција има највише три аргумента утврђеног редоследа: најпре одредишни а потом два изворна!

Page 31: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Следећа секвенца сабира четири променљивеadd a, b, c #suma b i c smesta se u aadd a, a, d #suma b, c i d je sada u aadd a, a, e #suma b, c, d, i e je u a

где речи десно од симбола # представљају коментар.

Page 32: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Свака линија садржи једну инструкцију.

Коментар се завршава крајем линије.

Page 33: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Принцип пројектовања:

Једноставност захтева регуларност.

Page 34: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Пример.Програмски сегмент на језику C

a = b + c;

d = a – e;

превести у одговарајући асемблер-ски код процесора MIPS.

Page 35: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Одговор.

add a, b, c

sub d, a, e

Page 36: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Тип Инструкција Пример Значење Коментар

Аритметички

add add a,b,c a = b + c Увек 3 операнда

subtract sub a,b,c a = b - c Увек 3 операнда

Page 37: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Пример.Нешто сложенији исказ на језику C садржи пет променљивих

f = (g+h) – (i+j);

Какав код ће произвести компилатор?

Page 38: Асемблерски језик и програмирање процесора  MIPS

Инструкције језика

Одговор.

add t0,g,h # privremena promenljiva t0# sadrzi g+h

add t1,i,j # privremena promenljiva t1# sadrzi i+j

sub f, t0, t1 # f dobija vrednost t0-t1# tj. (g+h) – (i+j)

Page 39: Асемблерски језик и програмирање процесора  MIPS

Операнди

Насупрот вишим програмским језицима, овде операнди не могу бити произвољне променљиве!

Операнди се налазе у регистрима! Величина регистара код процесора

MIPS је 32 бита. Група од 32 бита назива се реч. Постоје 32 регистра.

Page 40: Асемблерски језик и програмирање процесора  MIPS

Операнди

Принцип пројектовања:

Мање је брже.

Page 41: Асемблерски језик и програмирање процесора  MIPS

Операнди

Већи број регистара повећава тактни период, јер је потребно више времена сигналу да пређе одговарајући пут.

Додуше, не значи да 31 регистар ради брже од 32.

Page 42: Асемблерски језик и програмирање процесора  MIPS

Операнди

Мада се у инструкцијама може једноставно наводити број регистра (од 0 до 31), по конвенцији се користе два знака испред којих је знак $.

Обично ћемо регистре $s0, $s1, … користити за променљиве а $t0, $t1, … за привремене вредности приликом израчунавања.

Page 43: Асемблерски језик и програмирање процесора  MIPS

Операнди

Пример.Посао компилатора је да променљивама придружи регистре. Ако се за исказ језику C из претходног примера

f = (g+h) – (i+j);

променљиве f, g, h, i и j држе у регистрима $s0, $s1, $s2, $s3 и $s4, респективно, какав код ће произвести компилатор?

Page 44: Асемблерски језик и програмирање процесора  MIPS

Операнди

Одговор.

add $t0,$s1,$s2 # registar $t0 sadrzi g+hadd $t1,$s3,$s4 # registar $t1 sadrzi i+jsub $s0,$t0,$t1 # f dobija vrednost $t0 -

$t1

# tj. (g+h) – (i+j)

Page 45: Асемблерски језик и програмирање процесора  MIPS

Операнди

Програмски језици имају једностав-не променљиве које садрже по један податак, као у претходним примерима.

Међутим они могу да имају сложеније структуре података, ако што су поља.

Како представити те структуре и како им приступати?

Page 46: Асемблерски језик и програмирање процесора  MIPS

Операнди

Процесор У/И

Управљање

Стаза

података

Меморија

Улаз

Излаз

Page 47: Асемблерски језик и програмирање процесора  MIPS

Операнди

Процесор може да саржи само мали износ износ података у регистрима, док меморија рачунара може да садржи на милионе података.

Према томе, структуре података налазе се у меморији.

Аритметичке операције обављају се само над операндима који су у регистрима.

Page 48: Асемблерски језик и програмирање процесора  MIPS

Операнди

Скуп инструкција мора да садржи инструкције које обављају пренос података између меморије и регистара.

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

За приступ речи у меморији потребно је одредити њену адресу.

Page 49: Асемблерски језик и програмирање процесора  MIPS

Операнди

Меморија је дугачак линеаран низ меморијских локација.

Адресе заправо представљају индексе у том низу.

Адресна резолуција је један бајт.

Page 50: Асемблерски језик и програмирање процесора  MIPS

Операнди

Могуће је адресирати 232 бајта са адресама од 0 до 232-1.

...

0

1

2

3

4

5

6

8 битова

8 битова

8 битова

8 битова

8 битова

8 битова

8 битова

Адресе

Меморија...

Page 51: Асемблерски језик и програмирање процесора  MIPS

Операнди

Инструкција која преноси податке из меморије у регистар назива се load.

Како су регистри 32-битни погодније је вршити трансфер у речима.

Mогуће je адресирати 230 речи са адресама бајтова 0, 4, 8, ... 232-4.

...

Page 52: Асемблерски језик и програмирање процесора  MIPS

Операнди

Име инструкције је lw (load word).

...

0

4

8

12

...

32 бита

32 бита

32 бита

32 бита

Адресе

Меморија

Page 53: Асемблерски језик и програмирање процесора  MIPS

Операнди

Иза имена инструкције следи регистар који је одредиште, затим константа и регистар преко кога се пиступа меморији.

Меморијска адреса се формира као сума константе и садржаја другог регистра.

...

Page 54: Асемблерски језик и програмирање процесора  MIPS

Операнди Адресе речи су поравнате! Како изгледају адресе речи, тј. која

су два бита најмање тежине у адреси произвољне речи?

Уређење бајтова код процесора MIPS је Big Endian.

...

Page 55: Асемблерски језик и програмирање процесора  MIPS

Операнди

Пример.Нека је А низ од 100 речи у меморији и нека је компилатор променљивама g и h придружио регистре $s1 и $s2. Ако претпоста-вимо да је базна адреса низа у регистру $s3. Превести исказ језика C у код процесора MIPS.

g = h + A[8];

...

Page 56: Асемблерски језик и програмирање процесора  MIPS

Операнди

Одговор.lw $t0,32($s3) #registar $t0 sadrzi

A[8]add $s1,$s2,$t0 #g = h + A[8]

Константа у инструкцији за пренос података се назива офсет а регистар чији садржај се сабира да би се добила адреса операнда назива се базни регистар.

Page 57: Асемблерски језик и програмирање процесора  MIPS

Операнди

Инструкција комплементарна ин-струкцији load је инструкција store.

Формат је сличан као код load а стварно име је sw (store word).

Page 58: Асемблерски језик и програмирање процесора  MIPS

Операнди

Пример.Нека је променљива h придружена регистру и $s2 и базна адреса низа А је у регистру $s3. Превести исказ језика C у код процесора MIPS.

A[8] = h + A[8];

...

Page 59: Асемблерски језик и програмирање процесора  MIPS

Операнди

Одговор.lw $t0,32($s3) # registar $t0 sadrzi A[8]add $t1,$s2,$t0 # $t1 sadrzi h + A[8]sw $t1,32($s3) # smestanje h + A[8] u

A[8]

Page 60: Асемблерски језик и програмирање процесора  MIPS

Операнди

Пример.Ако је А низ од 100 елемената са базном адресом у $s3 и променљиве g, h и i у регистрима $s1, $s2 и $s4, како изгледа одговарајући код на асемблерском језику процесора MIPS за исказ језика C?

g = h + A[i];

...

Page 61: Асемблерски језик и програмирање процесора  MIPS

Операнди

Одговор.add $t1,$s4,$s4 # $t1 = 2*iadd $t1,$t1,$t1 # $t1 = 4*iadd $t1,$t1,$s3 # $t1 = adresa od A[i]lw $t0,0($t1) # $t0 = A[i]add $s1,$s2,$t0 # g = h + A[i]

Page 62: Асемблерски језик и програмирање процесора  MIPS

Операнди

Тип Инструкција

Пример Значење Коментар

Аритметички

add add $s1,$s2,$s3 $s1 = $s2 + $s3 3 операнда у регистрима

subtract sub $s1,$s2,$s3 $s1 = $s2 - $s3 3 операнда у регистрима

Пренос података

load word lw $s1, 100($s2) $s1 = M[$s2+100] Податак из меморије у регистар

store word sw $s1, 100($s2) M[$s2+100] = $s1 Податак из регистра у меморију

Page 63: Асемблерски језик и програмирање процесора  MIPS

Формат инструкција

op: Операција коју инструкција обавља, назива се и opcode.

rs: Први регистарски изворни операнд. rt: Други регистарски изворни операнд. rd: Одредишни регистарски операнд. shamt: Број померања (код инструкција за

померање, иначе то поље је нула). funct: Функција, тј. избор специфичне варијанте

операције из поља op, а назива се и код функције (function code).

op rs rt rd shamt funct

6 5 5 5 5 6

Page 64: Асемблерски језик и програмирање процесора  MIPS

Формат инструкција

Шта ако некој инструкцији треба дуже поље од приказаних?

Нпр. инструкција load специфицира два регистра и константу. Ако се држимо претходног формата за константу остаје 5 битова!

Page 65: Асемблерски језик и програмирање процесора  MIPS

Формат инструкција

Постоји конфликт између жеље да све инструкције буду исте дужине и жеље да имамо само један формат инструкције.

Page 66: Асемблерски језик и програмирање процесора  MIPS

Формат инструкција

Принцип пројектовања:

Добар пројекат захтева добре компромисе.

Page 67: Асемблерски језик и програмирање процесора  MIPS

Формат инструкција

Компромис направљен код процесора MIPS је да су све инструкције исте дужине, али са различитим форматима.

Формат који смо видели назива се R-формат (регистарски).

Други тип формата је I-формат (користе га инструкције за пренос података).

Page 68: Асемблерски језик и програмирање процесора  MIPS

Формат инструкција

16-битни офсет омогућава пуњење речи која је 215 бајтова (213 речи) удаљена у односу на базну адресу у регистру rs.

Код инструкције load регистар rt представља одредишни регистар.

op rs rt 16-битни број

6 5 5 16

Page 69: Асемблерски језик и програмирање процесора  MIPS

Формат инструкција

Већи број формата компликује хардвер, али се сложеност смањује због сличности ових формата.

Како разликујемо ове формате? Хардвер препознаје о ком формату

инструкције се ради на основу првог поља.

Page 70: Асемблерски језик и програмирање процесора  MIPS

Формат инструкције

Инструкција

Формат op rs rt rd shamt funct адреса

add R 0 reg reg reg 0 32 n.a.

sub R 0 reg reg reg 0 34 n.a.

lw I 35 reg reg n.a. n.a. n.a. адреса

sw I 43 reg reg n.a. n.a. n.a. адреса

reg представља број регистра 0-31адреса значи 16-битна адресаn.a. значи да се то поље не појављује у том форматуНапомена: add и sub имају исту вредност у пољу op; хардвер

користи поље funct да одреди о којој варијанти се ради.