Асемблерски језик и програмирање процесора mips
DESCRIPTION
Асемблерски језик и програмирање процесора MIPS. Увод Регистри процесора Инструкције језика Операнди Формат инструкција. Увод. Рачунар разуме инструкције на машинском језику , тј. низове бинарних цифара. - PowerPoint PPT PresentationTRANSCRIPT
Асемблерски језик и програмирање процесора MIPS
Увод Регистри процесора Инструкције језика Операнди Формат инструкција
Увод
Рачунар разуме инструкције на машинском језику, тј. низове бинарних цифара.
Са друге стране, људима тај облик није подесан за писање и разумевање програма. Људи много лакше пишу и разумевају симболе уместо дугих низова цифара.
Увод
Асемблерски језик је симболичка репрезентација бинарно кодираних инструкција машинског језика.
Асемблерски језик је много читљивији од машинског управо због коришћења симбола уместо битова.
Увод Симболи означавају одређене
шаблоне битова као што су кодови операција или спецификације регистара.
Увод
Уз то, асемблерски језик омогућава коришћење лабела.
Лабеле су симболичка имена појединих меморијских локација било да оне садрже инструкције програма или податке.
Увод
Рачунар, међутим, и даље разуме само машински језик!
Потребно нам је средство које ће програм написан на асемблерском језику да преведе на машински.
Ова врста преводиоца назива се асемблер.
Увод
Асемблер омогућава писање програма на погоднији начин.
Симболичка имена операција и локација су један вид ове презентације.
Програмска средства, као што су макрои, такође побољшавају јасноћу програма.
Увод
Изворни фајл
Изворни фајл
Изворни фајл
Асемблер
Асемблер
Асемблер
Објектни фајл
Објектни фајл
Објектни фајл
Линкер Извршни фајл
Библиотекепрограма
Сл. 1. Процес настанка извршне датотеке.
Увод
Асемблер чита поједине изворне фајлове и производи објектне фајлове који садрже машинске инструкције и информације које помажу комбиновању неколико објектних фајлова у програм.
Већина програма састоји се од неколико датотека или модула које се пишу и преводе независно.
Увод
Модул обично садржи референце на потпрограме и податке дефинисане у другим модулима и библиотекама.
Код у модулу се не може извршити када постоје неразрешене рефе-ренце на лабелу у другим објектним датотекама или модулима.
Увод
Још једно средство, линкер, комбинује колекцију објектних и библиотечких фајлова у извршни фајл који се може извршити на рачунару.
Увод001001111011110111111111111000001010111110111111000000000001010010101111101001000000000000100000101011111010010100000000001001001010111110100000000000000001100010101111101000000000000000011100100011111010111000000000000111001000111110111000000000000001100000000001110011100000000000011001001001011100100000000000000000010010100100000001000000000110010110101111101010000000000000011100000000000000000001111000000100100000001100001111110010000010000100010100001000001111111111110111101011111011100100000000000110000011110000000100000100000000000010001111101001010000000000011000000011000001000000000000111011000010010010000100000001000011000010001111101111110000000000010100001001111011110100000000001000000000001111100000000000000000100000000000000000000001000000100001
Сл. 2. Машински код процесора MIPS за израчунавање суме квадрата целих бројева од 0 до 100.
Увод
Уз познавање начина бинарног кодирања инструкција, могли би смо да добијемо симболички код.
Увод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. Исти код на асемблерском језику али без означених регистара, меморијских локација и коментара.
Увод
Међутим, много је јасније када се уведу симболичка имена за регистре и меморијске локације.
Имена која почињу тачком (.data, .globl, и др.) представљају асемблерске директиве које казују асемблеру како да преведе програм али не производе машинске инструкције.
Увод
Имена праћена двотачком представљају лабеле или имена меморијских локација.
Увод.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. Исти код на асемблерском језику али са ознакама регистара и меморијских локација али без коментара.
Увод
Насупрот томе, исти код на вишем програмском језику, као што је C, је концизнији и јаснији.
Увод
#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.
Увод У општем случају асемблерски језик има
двојаку улогу. Прва улога је да представља излазни
језик компилатора.
Сл. 6. Асеблерски програм пише програмер или је он излаз компилатора.
Увод Друга улога је да представља језик на
коме се пишу програми. Ова улога је некада била доминантна! Данас то није случај, али се асемблерски
језик користи тамо где је брзина рада или величина програма критична за искоришћење хардверских средстава, а при томе не постоји одговарајући аналогон у вишем програмском језику.
Увод
Зашто користимо асемблерски језик? Брзина и величина програма могу да
буду од критичне важности, као у уграђеним рачунарима (embedded computer).
У програмима где су поједни делови критични у погледу времена извршења користи се хибридни приступ.
Увод Компилатори су обично бољи од
програмера, али програмери боље разумеју алгоритме и понашање програма и, за разлику од компилатора, могу да имају у виду више процедура када пишу код за једну од њих. Додуше, у будућности ће програмери мање бити у стању да овај посао обављају боље од компилатора.
Увод Још једна битна предност
асемблерског језика је у могућности да се користе специјализоване инструк-ције.
Најзад, тамо где нема расположивог вишег програмског језика остаје нам само да користимо асемблерски језик.
Увод
Недостаци асмеблерских језика: Машини оријентисани језици. Изворни код је много дужи него код
виших програмских језика што смањује продуктивност.
Дужи програми су тежи за читање и разумевање и могу да имају много више багова.
Регистри процесора
Регистри процесора
Инструкције језика
Да би могли да управљамо хардвером рачунара, морамо да “говоримо” његовим језиком!
Речи језика машине називају се инструкцијама.
“Речник” овог језика назива се скупом инструкција.
Инструкције језика
Сваки рачунар мора да буде у стању да извршава аритметичке операције.
Једна од инструкција асемблерског језика процесора MIPS
add a, b, c
налаже да се саберу променљиве b и c а резултат смести у a.
Инструкције језика
Свака инструкција мора да обавља само једну операцију.
Инструкција има највише три аргумента утврђеног редоследа: најпре одредишни а потом два изворна!
Инструкције језика
Следећа секвенца сабира четири променљиве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
где речи десно од симбола # представљају коментар.
Инструкције језика
Свака линија садржи једну инструкцију.
Коментар се завршава крајем линије.
Инструкције језика
Принцип пројектовања:
Једноставност захтева регуларност.
Инструкције језика
Пример.Програмски сегмент на језику C
a = b + c;
d = a – e;
превести у одговарајући асемблер-ски код процесора MIPS.
Инструкције језика
Одговор.
add a, b, c
sub d, a, e
Инструкције језика
Тип Инструкција Пример Значење Коментар
Аритметички
add add a,b,c a = b + c Увек 3 операнда
subtract sub a,b,c a = b - c Увек 3 операнда
Инструкције језика
Пример.Нешто сложенији исказ на језику C садржи пет променљивих
f = (g+h) – (i+j);
Какав код ће произвести компилатор?
Инструкције језика
Одговор.
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)
Операнди
Насупрот вишим програмским језицима, овде операнди не могу бити произвољне променљиве!
Операнди се налазе у регистрима! Величина регистара код процесора
MIPS је 32 бита. Група од 32 бита назива се реч. Постоје 32 регистра.
Операнди
Принцип пројектовања:
Мање је брже.
Операнди
Већи број регистара повећава тактни период, јер је потребно више времена сигналу да пређе одговарајући пут.
Додуше, не значи да 31 регистар ради брже од 32.
Операнди
Мада се у инструкцијама може једноставно наводити број регистра (од 0 до 31), по конвенцији се користе два знака испред којих је знак $.
Обично ћемо регистре $s0, $s1, … користити за променљиве а $t0, $t1, … за привремене вредности приликом израчунавања.
Операнди
Пример.Посао компилатора је да променљивама придружи регистре. Ако се за исказ језику C из претходног примера
f = (g+h) – (i+j);
променљиве f, g, h, i и j држе у регистрима $s0, $s1, $s2, $s3 и $s4, респективно, какав код ће произвести компилатор?
Операнди
Одговор.
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)
Операнди
Програмски језици имају једностав-не променљиве које садрже по један податак, као у претходним примерима.
Међутим они могу да имају сложеније структуре података, ако што су поља.
Како представити те структуре и како им приступати?
Операнди
Процесор У/И
Управљање
Стаза
података
Меморија
Улаз
Излаз
Операнди
Процесор може да саржи само мали износ износ података у регистрима, док меморија рачунара може да садржи на милионе података.
Према томе, структуре података налазе се у меморији.
Аритметичке операције обављају се само над операндима који су у регистрима.
Операнди
Скуп инструкција мора да садржи инструкције које обављају пренос података између меморије и регистара.
Такве инструкције се називају инструкције за пренос података.
За приступ речи у меморији потребно је одредити њену адресу.
Операнди
Меморија је дугачак линеаран низ меморијских локација.
Адресе заправо представљају индексе у том низу.
Адресна резолуција је један бајт.
Операнди
Могуће је адресирати 232 бајта са адресама од 0 до 232-1.
...
0
1
2
3
4
5
6
8 битова
8 битова
8 битова
8 битова
8 битова
8 битова
8 битова
Адресе
Меморија...
Операнди
Инструкција која преноси податке из меморије у регистар назива се load.
Како су регистри 32-битни погодније је вршити трансфер у речима.
Mогуће je адресирати 230 речи са адресама бајтова 0, 4, 8, ... 232-4.
...
Операнди
Име инструкције је lw (load word).
...
0
4
8
12
...
32 бита
32 бита
32 бита
32 бита
Адресе
Меморија
Операнди
Иза имена инструкције следи регистар који је одредиште, затим константа и регистар преко кога се пиступа меморији.
Меморијска адреса се формира као сума константе и садржаја другог регистра.
...
Операнди Адресе речи су поравнате! Како изгледају адресе речи, тј. која
су два бита најмање тежине у адреси произвољне речи?
Уређење бајтова код процесора MIPS је Big Endian.
...
Операнди
Пример.Нека је А низ од 100 речи у меморији и нека је компилатор променљивама g и h придружио регистре $s1 и $s2. Ако претпоста-вимо да је базна адреса низа у регистру $s3. Превести исказ језика C у код процесора MIPS.
g = h + A[8];
...
Операнди
Одговор.lw $t0,32($s3) #registar $t0 sadrzi
A[8]add $s1,$s2,$t0 #g = h + A[8]
Константа у инструкцији за пренос података се назива офсет а регистар чији садржај се сабира да би се добила адреса операнда назива се базни регистар.
Операнди
Инструкција комплементарна ин-струкцији load је инструкција store.
Формат је сличан као код load а стварно име је sw (store word).
Операнди
Пример.Нека је променљива h придружена регистру и $s2 и базна адреса низа А је у регистру $s3. Превести исказ језика C у код процесора MIPS.
A[8] = h + A[8];
...
Операнди
Одговор.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]
Операнди
Пример.Ако је А низ од 100 елемената са базном адресом у $s3 и променљиве g, h и i у регистрима $s1, $s2 и $s4, како изгледа одговарајући код на асемблерском језику процесора MIPS за исказ језика C?
g = h + A[i];
...
Операнди
Одговор.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]
Операнди
Тип Инструкција
Пример Значење Коментар
Аритметички
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 Податак из регистра у меморију
Формат инструкција
op: Операција коју инструкција обавља, назива се и opcode.
rs: Први регистарски изворни операнд. rt: Други регистарски изворни операнд. rd: Одредишни регистарски операнд. shamt: Број померања (код инструкција за
померање, иначе то поље је нула). funct: Функција, тј. избор специфичне варијанте
операције из поља op, а назива се и код функције (function code).
op rs rt rd shamt funct
6 5 5 5 5 6
Формат инструкција
Шта ако некој инструкцији треба дуже поље од приказаних?
Нпр. инструкција load специфицира два регистра и константу. Ако се држимо претходног формата за константу остаје 5 битова!
Формат инструкција
Постоји конфликт између жеље да све инструкције буду исте дужине и жеље да имамо само један формат инструкције.
Формат инструкција
Принцип пројектовања:
Добар пројекат захтева добре компромисе.
Формат инструкција
Компромис направљен код процесора MIPS је да су све инструкције исте дужине, али са различитим форматима.
Формат који смо видели назива се R-формат (регистарски).
Други тип формата је I-формат (користе га инструкције за пренос података).
Формат инструкција
16-битни офсет омогућава пуњење речи која је 215 бајтова (213 речи) удаљена у односу на базну адресу у регистру rs.
Код инструкције load регистар rt представља одредишни регистар.
op rs rt 16-битни број
6 5 5 16
Формат инструкција
Већи број формата компликује хардвер, али се сложеност смањује због сличности ових формата.
Како разликујемо ове формате? Хардвер препознаје о ком формату
инструкције се ради на основу првог поља.
Формат инструкције
Инструкција
Формат 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 да одреди о којој варијанти се ради.