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

54
Асемблерски језик и програмирање процесора MIPS (2) Инструкције за управљање током програма Подршка процедурама Рад са знаковима Рад са непосредним операндима Адресирање код гранања и скокова Адресни начини рада

description

Асемблерски језик и програмирање процесора MIPS (2). Инструкције за управљање током програма Подршка процедурама Рад са знаковима Рад са непосредним операндима Адресирање код гранања и скокова Адресни начини рада. Инструкције за управљање током програма. - PowerPoint PPT Presentation

Transcript of Асемблерски језик и програмирање процесора MIPS (2)

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

Асемблерски језик и програмирање процесора MIPS (2) Инструкције за управљање током програма Подршка процедурама Рад са знаковима Рад са непосредним операндима Адресирање код гранања и скокова Адресни начини рада

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

Инструкције за управљање током програма Инструкције за управљање током програма

могу бити Условна гранања, Безусловна гранања и скокови.

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

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

Инструкције за управљање током програма Пример инструкције условног гранања је

beq reg1, reg2, L1

Ова инструкција значи да се врши скок на инструкцију са лабелом L1 ако су садржаји регистара reg1 и reg2 једнаки.

Мнемоник beq значи branch if equal (гранај се ако је једнако).

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

Инструкције за управљање током програма Слично, инструкција

bne reg1, reg2, L1

значи да се врши скок на инструкцију са лабелом L1 ако су садржаји регистара reg1 и reg2 различити.

Мнемоник bne значи branch if not equal (гранај се ако није једнако).

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

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

реализује се инструкцијом jump чија је синтакса

ј Lab

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

Инструкције за управљање током програма Тест једнакости или неједнакости се често

јавља у програмима! Често корисно и утврдити да ли је

вредност неке променљиве мања од неке ненулте вредност!!!

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

Инструкције за управљање током програма Такав тест се може обавити помоћу

инструкције set on less than

slt $t0,$s3,$s4

која поставља вредност регистра $t0 на 1 ако је вредност у регистру $s3 мања од вредности у регистру $s4; иначе се $t0 поставља на 0.

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

Инструкције за управљање током програма MIPS не користи гранање на услов “мање

од”, јер таква инструкција компликује хардвер. Једноставније је употребити две брже инструкције као што су slt и bne.

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

Инструкције за управљање током програма

Пример

Какав код треба написати да се тестира да ли је променљива a, која је у регистру $s0, мања од променљиве b, која је у регистру $s1, и изврши гранање на лабелу Manje ако услов важи.

Одговорslt $t0,$s0,$s1bne $t0,$zero,Manje

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

Инструкције за управљање током програма Већина програмских језика поседује исказе

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

Један од начина да се имплементира овакав исказ је помоћу секвенце if-then-else исказа, односно низа условних гранања.

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

Инструкције за управљање током програма Међутим, ово се ефикасније може

кодирати ако се користи табела адреса секвенци инструкција које се извршавају за одговарајуће алтернативе а која се назива табела адреса скока (jump address table).

Ова табела је у ствари низ који садржи адресе које одговарају лабелама у коду.

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

Инструкције за управљање током програма За подршку оваквој ситуацији MIPS има на

располагању инструкцију jump register (jr), која представља безусловни скок на адресу специфицирану у регистру.

jr reg

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

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

Аритметички 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 Податак из регистра у меморију

Условно гранање

branch on equal beq $s1,$s2, L if ($s1== $s2) go to L Гранање ако је једнако

branch on not equal bne $s1,$s2, L if ($s1!= $s2) go to L Гранање ако није једнако

set on less then slt $s1,$s2,$s3 if ($s2<$s3) $s1=1;

else $s1=0

Тест да ли је мање; користи се са beq, bne

Безусловни скок

jump j 2500 go to 10000 Скок на циљну адресу

jump register jr $t1 go to $t1 За switch исказ

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

Подршка процедурама Приликом извршавања процедуре програм

мора да обави следећих шест акција:1. Смештање параметара на место где

процедура може да им приступи.

2. Пренос управљања процедури.

3. Захтевање меморијских ресурса потребних процедури.

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

Подршка процедурама4. Обављање жељеног задатка.

5. Смештање резултујуће вредности на место где позивајући програм може да им приступи.

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

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

Подршка процедурама Како су регистри најбржи меморијски

медијум, користићемо их што је више могуће.

Од 32 регистра MIPS за позив процедура користи следеће: $a0-$a3: четири аргумент регистра за пренос

параметара потпрограма. $v0-$v1: два регистра за повратне вредности. $ra: један регистар за адресу повратка.

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

Подршка процедурама MIPS има и посебну инструкцију за позив

поцедуре која врши скок на почетну адресу потпрограма и смешта адресу наредне инструкције у $ra.

Ова инструкција је jump-and-link (jal) и има облик

jal AdresaProcedure

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

Подршка процедурама Адреса која се смешта у $ra назива се

аgреса повратка.

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

Подршка процедурама Инструкција jal заправо смешта PC+4 у

$ra а повратак из потпрограма се обавља инструкцијом

jr $ra

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

Подршка процедурама Уколико је за процедуру потребно више од

четири аргумент регистра и два регистра за повратне вредности, онда морамо да водимо рачуна о томе да сваки употребљени регистар мора да има исте вредности по повратку као и у моменту позива.

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

Подршка процедурама Ово је ситуација када ћемо садржаје неких

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

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

Подршка процедурама Магацин је погодна структура података за

ову намену. Регистар $sp (stack pointer) представља

указатељ магацина. Магацин, по конвенцији “расте” ка нижим

адресама!

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

Подршка процедурама MIPS регистре дели у две категорије:

$t0-$t9: 10 привремених регистара чије се вредности не чувају од стране позваног потпрограма.

$s0-$s7: 8 регистара чије се вредности морају очувати приликом позива процедуре.

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

Подршка процедурама Магацин се такође користи за смештање

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

Део магацина који садржи запамћене садржаје регистара и локалне променљиве назива се оквир процеgуре или активациони запис.

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

Подршка процедурама MIPS користи указатељ оквира $fp који

показује на прву реч оквира процедуре.

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

Подршка процедурама

$fp

$sp

Више адресе

Ниже адресе

$fp

$sp

$fp

$sp

Запамћени аргумент регистри (ако их има)

Адреса повратка

Запамћени s регистри (ако их има)

Локални низови и структуре (ако их има)

Сл. 1. Магацин пре, за време и после позива процедуре.

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

Подршка процедурама Променљива у језику C може бити

статичка или аутоматска. Аутоматске променљиве су локалне

променљиве процедура и њихов досег је само у оквиру процедуре у којој су декларисане.

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

Подршка процедурама Променљиве декларисане ван свих

процедура или оне које су декларисане помоћу static декларације су статичке.

За олакшавање приступа статичким променљивама MIPS користи глобални указатељ ($gp).

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

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

Аритметички 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 Податак из регистра у меморију

Условно гранање

branch on equal beq $s1,$s2, L if ($s1== $s2) go to L Гранање ако је једнако

branch on not equal bne $s1,$s2, L if ($s1!= $s2) go to L Гранање ако није једнако

set on less then slt $s1,$s2,$s3 if ($s2<$s3) $s1=1;

else $s1=0

Тест да ли је мање; користи се са beq, bne

Безусловни скок

jump j 2500 go to 10000 Скок на циљну адресу

jump register jr $ra go to $ra За switch исказ или повратак из процедуре

Jump an link jal 2500 $ra = PC+4; go to 10000

За позив процедуре

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

Рад са знаковима У програмима се често манипулише

алфанумеричким подацима који су обима 1 бајт, па MIPS има инструкције за учитавање и смештање бајта.

lb $t0,0($sp)#procitaj bajt iz izvora

sb $t0,0($gp)#upisi bajt u odrediste

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

Рад са знаковима Знаци се обично комбинују у стрингове

који имају променљив број елемената.

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

Рад са знаковима Постоје три могућности да се представи

стринг:1. Прва позиција у стрингу резервисана је за

дужину стринга.

2. Постоји променљива која садржи дужину стринга и са самим стрингом чини структуру.

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

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

Рад са знаковима У језику C користи се трећи приступ и

стринг се завршава бајтом са вредношћу 0 (Null у ASCII табели, тј. ‘\0’).

У новије време јавља се и UNICODE који је 16-битни код. МIPS има и инструкције које могу да раде са полуречима (тј. 16-битним речима).

Језик Java користи UNICODE.

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

Рад са непосредним операндима Код великог браја наредби у програму

користе се константе. Константе су садржане у самој

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

гранања (I-формат у ствари потиче од immediate – непосредни).

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

Рад са непосредним операндима Инструкција сабирања са непосредним

операндом назива се add immidiate или addi.addi $sp,$sp,4# $sp = $sp + 4

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

8 29 29 4

op rs rt immediate

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

Рад са непосредним операндимаПринцип пројектовања

Оно што се често јавља направите брзим.

Како се константе често јављају боље је учинити их делом инструкције него их учитавати из меморије.

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

Рад са непосредним операндима Иако су константе често мале и могу да

стану у 16-битно поље, понекад је потребно користити и 32-битне константне вредности.

У ту сврху користи се инструкција load upper immediate (lui).

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

Рад са непосредним операндимаПример

Какав је асемблерски код процесора MIPS за пуњење 32-битне константе

0000 0000 0011 1101 0000 1001 0000 0000

у регистар $s0?

Одговорlui $s0,61addi $s0,$s0,2304

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

Рад са непосредним вредностима Опрез, addi врши знаковно проширење! Стога се користе друге инструкције са

непосредним oперандом, као што је ori.

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

Адресирање код гранања и скокова Најједноставније адрсирање је код

инструкције скока. Формат ове инструкције је Ј-формат

op 26-битна адреса

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

Адресирање код гранања и скокова За инструкцију

ј 10000 # go to 10000

формат је

2 10000

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

Адресирање код гранања и скокова Насупрот инструкцији скока, инструкција

условног гранања мора да, поред адресе гранања, специфицира два операнда

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

bne $s0,$s1,Izlaz #if $s0 != $s1 goto Izlaz

асемблира у

5 16 17 Izlaz

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

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

16 битова то би значило да ниједан програм не може бити већи од 216 што је мало за реалне програме.

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

Питање је који регистар употребити?

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

Адресирање код гранања и скокова Већина гранања односи се на циљну

инструкцију која није далеко од инструкције гранања (if структуре, петље и слично).

Пошто програмски бројач PC садржи адресу текуће инструкције, онда ако њега изаберемо, можемо се гранати на инстгрукције које су на 215 удаљене од те позиције.

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

Адресирање код гранања и скокова Овај облик адресирања назива се PC

релативно аgресирање. У ствари, хардверу више одговара да PC

указује на наредну инструкцију, тако да је овај облик адресирања релативан на (PC+4) ако је PC адреса текуће инструкције.

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

Адресирање код гранања и скокова Са друге стране, инструкција jal позива

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

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

Адресирање код гранања и скокова Обзиром да су све MIPS инструкције дуге

4 бајта, офсет код PC-релативног адресирања се односи на речи а не на бајтове!

Из тог разлога, прави офсет у односу на садржај PC-a се множи са четири.

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

Адресни начини рада Различити начини адресирања, тј.

израчунавања ефективне адресе називају се аgресни начини раgа.

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

Адресни начини рада Постоји 5 адресних начина рада код

процесора MIPS:1. Регистарско адресирање.

2. Базно адресирање са размештајем.

3. Непосредно адресирање.

4. PC-релативно адресирање.

5. Псеудодиректно адресирање.

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

Адресни начини рада

Byte Halfword Word

Registers

Memory

Memory

Word

Memory

Word

Register

Register

1. Immediate addressing

2. Register addressing

3. Base addressing

4. PC-relative addressing

5. Pseudodirect addressing

op rs rt

op rs rt

op rs rt

op

op

rs rt

Address

Address

Address

rd . . . funct

Immediate

PC

PC

+

+

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

Адресни начини рада

Byte Halfword Word

Registers

Memory

Memory

Word

Memory

Word

Register

Register

1. Immediate addressing

2. Register addressing

3. Base addressing

4. PC-relative addressing

5. Pseudodirect addressing

op rs rt

op rs rt

op rs rt

op

op

rs rt

Address

Address

Address

rd . . . funct

Immediate

PC

PC

+

+

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

Адресни начини рада

Byte Halfword Word

Registers

Memory

Memory

Word

Memory

Word

Register

Register

1. Immediate addressing

2. Register addressing

3. Base addressing

4. PC-relative addressing

5. Pseudodirect addressing

op rs rt

op rs rt

op rs rt

op

op

rs rt

Address

Address

Address

rd . . . funct

Immediate

PC

PC

+

+

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

Адресни начини радаByte Halfword Word

Registers

Memory

Memory

Word

Memory

Word

Register

Register

1. Immediate addressing

2. Register addressing

3. Base addressing

4. PC-relative addressing

5. Pseudodirect addressing

op rs rt

op rs rt

op rs rt

op

op

rs rt

Address

Address

Address

rd . . . funct

Immediate

PC

PC

+

+

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

Адресни начини рада

Byte Halfword Word

Registers

Memory

Memory

Word

Memory

Word

Register

Register

1. Immediate addressing

2. Register addressing

3. Base addressing

4. PC-relative addressing

5. Pseudodirect addressing

op rs rt

op rs rt

op rs rt

op

op

rs rt

Address

Address

Address

rd . . . funct

Immediate

PC

PC

+

+