Professional Documents
Culture Documents
Test
Test
26.03.2008 3
1510
4
Базно адресирање (Based) Релативно во однос на PC
Пример
12К
12К
4К
16К
28К 28К
Базни
4К
32К
регистри
36К
36К
4К
40К
56К 56К
4К 60К
26.03.2008 10
Кпмпјутерски Архитектури ИКИ
Пример: Акп спдржината на лпкациите 100, 200, 300, 400 се 100, 200, 300, 400 сппдветнп, а
спдржината на регистарпт R1 е 0 и на индекснипт регистар е 100, кплкави ќе бидат
спдржините на сите лпкации пп извршуваое на следниве инструкции.
100 100
200 200
1п ADD 100 (indeksno), R1
300 300
2п ADD 100 (neposredno), 200 (indirektno)
400 400
3п ADD 100 (neposredno), 200 (indirektno)
R1 0
4п ADD 300 (indirektno), R1
IX 100
Фпрматпт на инструкциите е следен ADD op1, op2 => op2 op1 + op2
1п ADD 100(I), R1; ЕА (op1) = (IX) + брпј = 100 + 100 = 200, ппдатпкпт на адреса 200 е 200 =>
op1 = 200.
op2 = 0 – Вреднпста сместена вп регистарпт R1.
=> op1+op2 = 200 + 0 =200, a бидејќи втпр пперанд е R1 вп негп се сместува 200.
2п ADD 100(nep), 200(ind); op1 = 100; EA (op2) = (200) = 200; Оди на адреса 200, па пди на
адреса штп ќе ја најдеш таму (200) и земи гп ппдатпкпт.=> op2=200.
op2 op1+op2 = 100 + 200 => се сместува 300 на адреса 200 (ппвтпрнп индиректнп).
100 R1 200
100
200 300
300 300
400 IX 100
400
3п ADD 100(nep), 200(ind); op1 = 100; EA (op2) = (200) = 300; Оди на адреса 200, па пди на
адреса штп ќе ја најдеш таму (300) и земи гп ппдатпкпт.=> op2=300.
op2 op1+op2 = 100 + 300 => се сместува 400 на адреса 300 (ппвтпрнп индиректнп).
4п ADD 300(Ind), R1; op2 = 200; EA (op1) = (300) = 300; Оди на адреса 300, па пди на адреса
штп ќе ја најдеш таму (400) и земи гп ппдатпкпт.=> op2=400.
op2 op1+op2 = 400 + 200 => се сместува 600 вп R1.
Кпмпјутерски Архитектури ИКИ
КОНЕЧНА СОСТОЈБА:
Тип на адресираое
JMPZ operand, skok=> if operand=0 then (пди на скпк)
1п ADD_D 100,200; ЕА (op1) = 100 => op1 = 100; ЕА (op2) = 200 => op1 = 200; EA(op1) =
op1+op2=300;
2п SUB_N R1,23; R1R1-23=> R1=27;
3п SUB_N R1,23; R1R1-23=> R1=4;
4п JMPZ R1, pri_kraj R1 не е 0, па пди на наредната инструкција.
5п SUB_N R1, 2 R1R1-2=> R1=2;
6п ADD_D 200,100; ЕА (op1) = 200 => op1 = 200; ЕА (op2) = 100 => op1 = 300; EA(op1) =
op1+op2=500;
7п ADD_R -3; Одземи 3 пд PC и тпј ќе ппкажува на JMPZ => следна инструкција кпја ќе се
изврши.
8п JMPZ R1, pri_kraj R1 не е 0, па пди на наредната инструкција.
9п SUB_N R1, 2 R1R1-2=> R1=0;
Кпмпјутерски Архитектури ИКИ
10п ADD_D 200,100; ЕА (op1) = 200 => op1 = 500; ЕА (op2) = 100 => op1 = 300; EA(op1) =
op1+op2=800;
11п ADD_R -3; Одземи 3 пд PC и тпј ќе ппкажува на JMPZ => следна инструкција кпја ќе се
изврши.
12п JMPZ R1, pri_kraj R1 е 0, скпка на pri_kraj.
13п ADD_D 100,300; ЕА (op1) = 100 => op1 = 300; ЕА (op2) = 300 => op1 = 300; EA(op1) =
op1+op2=600;
14п КРАЈ.
Кпмпјутерски Архитектури ИКИ
MIPS прпцеспри
Регистри
Аритметички инструкции
Лпгички инструкции
Услпвнп гранеое
Безуслпвнп гранеое
Псевдп инструкции
Мемприска искпристенпст
Сегментни директиви
Ппдатпчни директиви
Директива Значеое
.ascii str Assemble the given string in memory. Do not
null terminate
.asciiz str Assemble the given string in memory. Do null
terminate
.byte B1,…,BN Assemble the given bytes (8-bit integers)
.half H1,…,HN Assemble the given halfwords (16-bit integers)
Кпмпјутерски Архитектури ИКИ
.data
Array: .space 160 #rezerviraj prostor vo memorijata od 160 B (4*40 zbora)
#pocnuvajki od adresa Array
.text
main: li $t6, 1 # t6= 1
li $t7, 4 # t7 =4
sw $t6, Array($0) # dodeli vrednost 1 na prviot element
sw $t6, Array($t7) # dodeli vrednost 1 na vtoriot element
li $t0, 8 #t0= 8
li $s0, 160
loop: addi $t3, $t0, -8
addi $t4, $t0, -4
lw $t1, Array($t3) # Zemi gi poslednite
lw $t2, Array($t4) # 2 elementa
add $t5, $t1, $t2 # soberi gi
sw $t5, Array($t0) # zacuvaj go rezultatot vo poleto
addi $t0, $t0, 4 # zgolemi go ofsetot za 4
blt $t0, $s0, loop
Exit:
Кпмпјутерски Архитектури ИКИ
Системски ппвици
.data # Konstanti
prmpt1: .asciiz "Kolku broevi? "
prmpt2: .asciiz "Sleden broj: "
sum: .asciiz "Sumata e: "
.text # Main.
main: li $v0, 4 #Syscall za pecatenje na tekstot na poc. adr.
prmpt1
la $a0, prmpt1 #smesti ja pocetnata adresa na tekstot vo $a0
syscall
li $v0, 5 # Syscall za citanje na cel broj
syscall
add $t0, $v0, $zero #$t0=procitan broj na broevi koi kje se vnesuvaat
li $t1, 0 $t1=0 inicijalizacija na suma
while: blez $t0, endwhile
li $v0, 4 # Syscall za pecatenje na tekstot na poc. adr.
prmpt1
la $a0, prmpt2 #smesti ja pocetnata adresa na tekstot vo $a0
syscall
li $v0, 5 # Syscall za citanje na sleden cel broj
syscall
add $t1, $t1, $v0 # dodadi go procitaniot broj na sumata
sub $t0, $t0, 1 # Namali go brojacot na procitani broevi
j while
endwhile: li $v0, 4 # Syscall za pecatenje na tekstot na poc. adr. sum
la $a0, sum
syscall
move $a0, $t1 # Syscall za pecatenje na sumata na broevi
li $v0, 1
Кпмпјутерски Архитектури ИКИ
syscall
li $v0, 10 # Syscall za izlez od programata
syscall
Пример: Да се напише асемблерска прпграма кпја ќе прпчита низа (не ппдплга пд 1023
знаци) пд знаци пд стандарднипт влез и ќе испечати дали низата е палнидрпм.
.data
string_space: .space 1024 # rezervacija na 1024 bajti za vnesuvanje na
string
is_palin_msg: .asciiz "Stringot e palindrom.\n"
not_palin_msg: .asciiz "Stringot ne e palindrom.\n"
.text
main: la $a0, string_space #Syscall za citanje na string od std. vlez
li $a1, 1024
li $v0, 8
syscall
la $t1, string_space # t1=adresa na prviot znak
la $t2, string_space #t2 treba da ja sodrzi adresata na posledniot znak
length_loop: lb $t3, ($t2) # t2 se zgolemuva se dodeka ne se dojde do znak
beqz $t3, end _loop # so vrednost 0 (kraj na string)
addi $t2, $t2, 1
b length_loop
end _loop: subi $t2, $t2, 2 #odzemi 2 za da gi preskoknes \n i \0
test_loop: bge $t1, $t2, is_palin # Ako t1>=t2 stringot e palindrom
lb $t3, ($t1) #
lb $t4, ($t2) # load the byte at addr B into $t4.
bne $t3, $t4, not_palin # ako t3 != t4, stringot ne e palindrom
addu $t1, $t1, 1 # t1++
subu $t2, $t2, 1 # t2++
j test_loop # zemi gi slednite znaci
is_palin la $a0, is_palin_msg
li $v0, 4
syscall
j exit
not_palin: la $a0, not_palin_msg
li $v0, 4
syscall
exit: li $v0, 10 # syscall exit
syscall