You are on page 1of 41

Оперативни системи 1

Вежбе 1
Увод и архитектура RISC-V

Листа предмета:
ir2os1@lists.etf.rs
Оперативни системи 1, ЕТФ 2022.
Системске услуге
• Системски услуге представљају рутине које
обављају операције са хардверским уређајима
у рачунарском систему; налазе се у меморији и доступне су
корисничким процесима као услуге кроз механизам системских
позива.
• Примери системских услуга које могу бити позване
из корисничких програма написаних на језику C/C++
јесу завршавање извршавања (exit), рад са улазно излазним
токовима (getc, putc), рад са датотекама итд.
• Све ове системске услуге су програмеру доступне кроз
стандардне библиотеке језика C/C++ (stdio.h, stdlib.h, ...)
у виду функција које само позива, а саме функције врше
интеракцију са хардверским уређајима
користећи системске услуге.

Оперативни системи 1, ЕТФ 2022. 2


Командна линија (CLI, console)

Оперативни системи 1, ЕТФ 2022. 3


Командна линија (CLI, console)
• Командна линија представља кориснички интерфејс.
• Тастатура је улазни уређај, док је екран излазни уређај.
• Команде се задају уносом текста преко тастатуре,
командна линија потом интерпретира задату команду и
затим је извршава уколико је унета у исправном облику
(назив команде и њени параметри су исправни).
• Команда током или непосредно након извршавања
може да пошаље неки испис на излазни уређај (екран) и
након тога је спремна за задавање нове команде.

Оперативни системи 1, ЕТФ 2022. 4


Командна линија (CLI, console)
• Примери неких команди и механизама командне линије
Command Prompt на Windows оперативним системима:
– cd
– dir, mkdir, rmdir
– del, copy, rename
– tasklist, taskkill
– echo
– механизам цевовода (pipe |)
– преусмеравање стандардног улаза (<) и излаза (>)
• Сличне ствари доступне су и код других оперативних система,
само се неке од њих можда другачије називају
(Linux командна линија се обрађује на предмету ПОС).

Оперативни системи 1, ЕТФ 2022. 5


Увод у архитектуру RISC-V
• Микропроцесор RV64IMA са 64-битном load/store архитектуром
• Троадресна машина (инструкције имају три операнда)
• Адресибилна јединица је један бајт
• Подаци величине 1, 2, 4 или 8 бајтова
• Нижи бајт на нижој меморијскокј локацији (little endian)
• Кориснички и супервизорски (привилеговани) режим рада
• Регистри:
 програмски бројач (pc) указује на текућу инструкцију
 општенамeнски регистри (x0..x31) (доступни у оба режима)
 супервизорски регистри
• Стек је пун опадајући (расте ка нижим адресама и sp показује
на последње заузету локацију која треба да буде дељива са 16)

Оперативни системи 1, ЕТФ 2022. 6


Општенаменски регистри
• Сви општенаменски регистри су равноправни из угла процесора
• Регистри имају посебну намену са становишта преводиоца
– zero ожичен на нулу (x0)
– ra повратна адреса функције (x1)
– sp показивач на врх стека (x2)
– a0..a7 пренос аргумената и повратне вредности функције
– s0..s11 чувају се приликом позива функције
(за рад са локалним променљивима и параметрима функције
користи се s0 који представља frame pointer fp)
– t0..t6 не чувају се приликом позива функције
(привремене вредности израза или локалне променљиве)
– gp и tp су global pointer и thread base pointer

Оперативни системи 1, ЕТФ 2022. 7


Супервизорски регистри
• Доступни су само у супервизорском режиму рада
(генерише се изузетак при приступу из корисничког режима)
• Супервизорским регистрима приступа се помоћу
наменских инструкција csr (control and status registers)
– sstatus статусни регистар
– sip пристигли захтеви за прекид (pending)
– sie омогућени прекиди (enabled)
– sscratch привремени регистар за потребе супервизора
– sepc вредност која се налазила у програмском бројачу (pc)
приликом јављања изузетка
– scause опис разлога за прелазак у супервизорски режим
– stvec конфигурација базне адресе вектора прекидне рутине

Оперативни системи 1, ЕТФ 2022. 8


Преглед неких инструкција (1/6)
• Целобројне инструкције (регистар и непосредна вредност):
– opcode rd, rs1, imm12
– opcode rd, imm20
• Доступне операције:
– addi : rd <= rs1 + sgnEx(imm12);
– slti : rd <= (rs1 < sgnEx(imm12)) ? 1 : 0;
– andi : rd <= rs1 & sgnEx(imm12);
– xori : rd <= rs1 ^ sgnEx(imm12);
– ori : rd <= rs1 | sgnEx(imm12);
– slli : rd <= rs1 << sgnEx(imm5);
– srli : rd <= rs1 >>log sgnEx(imm5);
– srai : rd <= rs1 >>ari sgnEx(imm5);
– lui : rd <= (imm20 << 12);
– auipc: rd <= pc + (imm20 << 12);

Оперативни системи 1, ЕТФ 2022. 9


Преглед неких инструкција (2/6)
• Целобројне инструкције (два регистра):
– opcode rd, rs2, rs1
• Доступне операције:
– add : rd <= rs2 + rs1;
– sub : rd <= rs2 – rs1;
– slt : rd <= (rs1 < rs2) ? 1 : 0;
– and : rd <= rs2 & rs1;
– xor : rd <= rs2 ^ rs1;
– or : rd <= rs2 | rs1;
– sll : rd <= rs1 << (rs2 & 0x1f);
– srl : rd <= rs1 >>logic (rs2 & 0x1f);
– sra : rd <= rs1 >>arith (rs2 & 0x1f);

Оперативни системи 1, ЕТФ 2022. 10


Преглед неких инструкција (3/6)
• Инструкцијa безусловног скока jal rd, offset
– rd <= pc; pc <= pc + sgnEx(offset);
• Инструкцијa безусловног скока jalr rd, offset(rs1)
– rd <= pc; pc <= rs1 + sgnEx(offset);

• Псеудо инструкција безусловног скока j offset


– jal x0, offset
• Псеудо инструкција безусловног скока jr rs
– jalr x0, 0(rs)
• Псеудо инструкција позива функције call offset
– auipc & jalr
• Псеудо инструкција повратка из функције ret
– jalr x0, 0(ra)

Оперативни системи 1, ЕТФ 2022. 11


Преглед неких инструкција (4/6)
• Инструкције условног скока
– opcode rs1, rs2, offset
• Доступне операције:
– beq: pc <= (rs1==rs2) ? pc + sgnEx(offset) : pc;
– bne: pc <= (rs1!=rs2) ? pc + sgnEx(offset) : pc;
– blt: pc <= (rs1<rs2) ? pc + sgnEx(offset) : pc;
– bge: pc <= (rs1>=rs2) ? pc + sgnEx(offset) : pc;

Оперативни системи 1, ЕТФ 2022. 12


Преглед неких инструкција (5/6)
• Инструкција учитавања податка l{b|h|w|d} rd, offset(rs)
– rd <= mem[rs + offset]
• Инструкција смештања s{b|h|w|d} rs1, offset(rs2)
– mem[rs2+offset] <= rs1
• Суфикс b, h, w или d дефинише
ширину података од 1, 2, 4 или 8 бајтова

Оперативни системи 1, ЕТФ 2022. 13


Преглед неких инструкција (6/6)
• Инструкција за прелазак у супервизорски режим ecall
• Инструкција повратка из прекидне рутине sret

• Инструкција читања системског регистра csrr rd, srs


• Инструкција уписа у системски регистар csrw srd, rs
• Инструкција уписа у системски регистар уз читање претходне
вредности датог системског регистра csrrw rd, sr, rs

Оперативни системи 1, ЕТФ 2022. 14


Ланац алата (toolchain)
• За потребе израде пројектног задатка користи се
ланац алата (преводилац, асемблер, линкер) gnu gcc за RISC-V
• Није имплементирана стандардна библиотека што имплицира
да не постоје функције типа malloc, printf, scanf, итд.
• За лакши почетак израде пројектног задатка
на располагању су имплементације неких функција:
// biblioteka mem.lib sa zaglavljem mem.h
void* __mem_alloc(size_t size)
int __mem_free(void* ptr)
// biblioteka console.lib sa zaglavljem console.h
void __putc(char chr)
int __getc()

Оперативни системи 1, ЕТФ 2022. 15


Изворни асемблерски код
• Асемблерски код може да се пише у засебној датотеци
– екстензија датотеке треба да буде .S
– дозвољене асемблерске директиве и наредбе
– имена функција могу да се извозе за коришћење у C/C++
• Асемблерски код може да се пише и директно у оквиру C/C++
int main() {
uint64 x;
// Upis vrednosti registra u automatsku promenljivu
asm volatile("csrr %0, sstatus" : "=r" (x));
// Upis vrednosti automatske promenljive u registar
asm volatile("csrw sstatus, %0" : : "r" (x));
// Instrukcija koja ne koristi automatske podatke
asm volatile("ld s0, 8(sp)");
}

Оперативни системи 1, ЕТФ 2022. 16


Конвенција позивања (1/5)
• Преводилац се приликом генерисања кода придржава
следећег:
– функција позивалац прослеђује аргументе позваној функцији
кроз регистре а0..а7 или кроз меморију
– позвана функција чува вредности регистара sp
– позвана функција чува вредност регистра s0..s11
– остале општенаменске регистре чува функција позивалац
– повратна вредност позване функције враћа се
преко регистара а0..а1 или кроз меморију

Оперативни системи 1, ЕТФ 2022. 17


Конвенција позивања (2/5)
• Како се преводи следећи програм?
int bar(int param) {
return param + 1;
}

int foo(int a, int b) {


int local;
local = a + b;
return bar(local);
}

int main() {
int result = foo(0xB, 0xC);
return result;
}

Оперативни системи 1, ЕТФ 2022. 18


Конвенција позивања (3/5)
int main() { sp > | ???????? | 80005220
int result = foo(0xB, 0xC); | | 80005218
return result; | | 80005210
} | | 80005208
0000000080001048 <main>: | | 80005200
> 80001048: addi sp, sp, -16 | | 800051f8
8000104c: sd ra, 8(sp) | | 800051f0
80001050: sd s0, 0(sp) | | 800051e8
80001054: addi s0, sp, 16
80001058: li a1, 0xc
8000105c: li a0, 0xb
80001060: auipc ra, 0x0
80001064: jalr -0x44(ra)
80001068: ld ra, 8(sp) ra: ra
8000106c: ld s0, 0(sp) a0: a0
80001070: addi sp, sp, 16 a1: a1
80001074: ret
Оперативни системи 1, ЕТФ 2022. 19
Конвенција позивања (3/5)
int main() { | ???????? | 80005220
int result = foo(0xB, 0xC); | | 80005218
return result; sp > | | 80005210
} | | 80005208
0000000080001048 <main>: | | 80005200
80001048: addi sp, sp, -16 | | 800051f8
> 8000104c: sd ra, 8(sp) | | 800051f0
80001050: sd s0, 0(sp) | | 800051e8
80001054: addi s0, sp, 16
80001058: li a1, 0xc
8000105c: li a0, 0xb
80001060: auipc ra, 0x0
80001064: jalr -0x44(ra)
80001068: ld ra, 8(sp) ra: ra
8000106c: ld s0, 0(sp) a0: a0
80001070: addi sp, sp, 16 a1: a1
80001074: ret
Оперативни системи 1, ЕТФ 2022. 20
Конвенција позивања (3/5)
int main() { | ???????? | 80005220
int result = foo(0xB, 0xC); | ra | 80005218
return result; sp > | | 80005210
} | | 80005208
0000000080001048 <main>: | | 80005200
80001048: addi sp, sp, -16 | | 800051f8
8000104c: sd ra, 8(sp) | | 800051f0
> 80001050: sd s0, 0(sp) | | 800051e8
80001054: addi s0, sp, 16
80001058: li a1, 0xc
8000105c: li a0, 0xb
80001060: auipc ra, 0x0
80001064: jalr -0x44(ra)
80001068: ld ra, 8(sp) ra: ra
8000106c: ld s0, 0(sp) a0: a0
80001070: addi sp, sp, 16 a1: a1
80001074: ret
Оперативни системи 1, ЕТФ 2022. 21
Конвенција позивања (3/5)
int main() { | ???????? | 80005220
int result = foo(0xB, 0xC); | ra | 80005218
return result; sp > | s0 | 80005210
} | | 80005208
0000000080001048 <main>: | | 80005200
80001048: addi sp, sp, -16 | | 800051f8
8000104c: sd ra, 8(sp) | | 800051f0
80001050: sd s0, 0(sp) | | 800051e8
> 80001054: addi s0, sp, 16
80001058: li a1, 0xc
8000105c: li a0, 0xb
80001060: auipc ra, 0x0
80001064: jalr -0x44(ra)
80001068: ld ra, 8(sp) ra: ra
8000106c: ld s0, 0(sp) a0: a0
80001070: addi sp, sp, 16 a1: a1
80001074: ret
Оперативни системи 1, ЕТФ 2022. 22
Конвенција позивања (3/5)
int main() { s0 > | ???????? | 80005220
int result = foo(0xB, 0xC); | ra | 80005218
return result; sp > | s0 | 80005210
} | | 80005208
0000000080001048 <main>: | | 80005200
80001048: addi sp, sp, -16 | | 800051f8
8000104c: sd ra, 8(sp) | | 800051f0
80001050: sd s0, 0(sp) | | 800051e8
80001054: addi s0, sp, 16
> 80001058: li a1, 0xc
8000105c: li a0, 0xb
80001060: auipc ra, 0x0
80001064: jalr -0x44(ra)
80001068: ld ra, 8(sp) ra: ra
8000106c: ld s0, 0(sp) a0: a0
80001070: addi sp, sp, 16 a1: a1
80001074: ret
Оперативни системи 1, ЕТФ 2022. 23
Конвенција позивања (3/5)
int main() { s0 > | ???????? | 80005220
int result = foo(0xB, 0xC); | ra | 80005218
return result; sp > | s0 | 80005210
} | | 80005208
0000000080001048 <main>: | | 80005200
80001048: addi sp, sp, -16 | | 800051f8
8000104c: sd ra, 8(sp) | | 800051f0
80001050: sd s0, 0(sp) | | 800051e8
80001054: addi s0, sp, 16
80001058: li a1, 0xc
> 8000105c: li a0, 0xb
80001060: auipc ra, 0x0
80001064: jalr -0x44(ra)
80001068: ld ra, 8(sp) ra: ra
8000106c: ld s0, 0(sp) a0: a0
80001070: addi sp, sp, 16 a1: c
80001074: ret
Оперативни системи 1, ЕТФ 2022. 24
Конвенција позивања (3/5)
int main() { s0 > | ???????? | 80005220
int result = foo(0xB, 0xC); | ra | 80005218
return result; sp > | s0 | 80005210
} | | 80005208
0000000080001048 <main>: | | 80005200
80001048: addi sp, sp, -16 | | 800051f8
8000104c: sd ra, 8(sp) | | 800051f0
80001050: sd s0, 0(sp) | | 800051e8
80001054: addi s0, sp, 16
80001058: li a1, 0xc
8000105c: li a0, 0xb
> 80001060: auipc ra, 0x0
80001064: jalr -0x44(ra)
80001068: ld ra, 8(sp) ra: ra
8000106c: ld s0, 0(sp) a0: b
80001070: addi sp, sp, 16 a1: c
80001074: ret
Оперативни системи 1, ЕТФ 2022. 25
Конвенција позивања (3/5)
int main() { s0 > | ???????? | 80005220
int result = foo(0xB, 0xC); | ra | 80005218
return result; sp > | s0 | 80005210
} | | 80005208
0000000080001048 <main>: | | 80005200
80001048: addi sp, sp, -16 | | 800051f8
8000104c: sd ra, 8(sp) | | 800051f0
80001050: sd s0, 0(sp) | | 800051e8
80001054: addi s0, sp, 16
80001058: li a1, 0xc
8000105c: li a0, 0xb
80001060: auipc ra, 0x0
> 80001064: jalr -0x44(ra)
80001068: ld ra, 8(sp) ra: 80001060
8000106c: ld s0, 0(sp) a0: b
80001070: addi sp, sp, 16 a1: c
80001074: ret
Оперативни системи 1, ЕТФ 2022. 26
Конвенција позивања (4/5)
int foo(int a, int b) { s0 > | ???????? | 80005220
int local; | ra | 80005218
local = a + b; sp > | s0 | 80005210
return bar(local); | | 80005208
} | | 80005200
000000008000101c <foo>: | | 800051f8
> 8000101c: addi sp, sp, -16 | | 800051f0
80001020: sd ra, 8(sp) | | 800051e8
80001024: sd s0, 0(sp)
80001028: addi s0, sp, 16
8000102c: addw a0, a0, a1
80001030: auipc ra, 0x0
80001034: jalr -0x30(ra)
80001038: ld ra, 8(sp) ra: 80001068
8000103c: ld s0, 0(sp) a0: b
80001040: addi sp, sp, 16 a1: c
80001044: ret
Оперативни системи 1, ЕТФ 2022. 27
Конвенција позивања (4/5)
int foo(int a, int b) { s0 > | ???????? | 80005220
int local; | ra | 80005218
local = a + b; | s0 | 80005210
return bar(local); | | 80005208
} sp > | | 80005200
000000008000101c <foo>: | | 800051f8
8000101c: addi sp, sp, -16 | | 800051f0
> 80001020: sd ra, 8(sp) | | 800051e8
80001024: sd s0, 0(sp)
80001028: addi s0, sp, 16
8000102c: addw a0, a0, a1
80001030: auipc ra, 0x0
80001034: jalr -0x30(ra)
80001038: ld ra, 8(sp) ra: 80001068
8000103c: ld s0, 0(sp) a0: b
80001040: addi sp, sp, 16 a1: c
80001044: ret
Оперативни системи 1, ЕТФ 2022. 28
Конвенција позивања (4/5)
int foo(int a, int b) { s0 > | ???????? | 80005220
int local; | ra | 80005218
local = a + b; | s0 | 80005210
return bar(local); | 80001068 | 80005208
} sp > | | 80005200
000000008000101c <foo>: | | 800051f8
8000101c: addi sp, sp, -16 | | 800051f0
80001020: sd ra, 8(sp) | | 800051e8
> 80001024: sd s0, 0(sp)
80001028: addi s0, sp, 16
8000102c: addw a0, a0, a1
80001030: auipc ra, 0x0
80001034: jalr -0x30(ra)
80001038: ld ra, 8(sp) ra: 80001068
8000103c: ld s0, 0(sp) a0: b
80001040: addi sp, sp, 16 a1: c
80001044: ret
Оперативни системи 1, ЕТФ 2022. 29
Конвенција позивања (4/5)
int foo(int a, int b) { s0 > | ???????? | 80005220
int local; | ra | 80005218
local = a + b; | s0 | 80005210
return bar(local); | 80001068 | 80005208
} sp > | 80005220 | 80005200
000000008000101c <foo>: | | 800051f8
8000101c: addi sp, sp, -16 | | 800051f0
80001020: sd ra, 8(sp) | | 800051e8
80001024: sd s0, 0(sp)
> 80001028: addi s0, sp, 16
8000102c: addw a0, a0, a1
80001030: auipc ra, 0x0
80001034: jalr -0x30(ra)
80001038: ld ra, 8(sp) ra: 80001068
8000103c: ld s0, 0(sp) a0: b
80001040: addi sp, sp, 16 a1: c
80001044: ret
Оперативни системи 1, ЕТФ 2022. 30
Конвенција позивања (4/5)
int foo(int a, int b) { | ???????? | 80005220
int local; | ra | 80005218
local = a + b; s0 > | s0 | 80005210
return bar(local); | 80001068 | 80005208
} sp > | 80005220 | 80005200
000000008000101c <foo>: | | 800051f8
8000101c: addi sp, sp, -16 | | 800051f0
80001020: sd ra, 8(sp) | | 800051e8
80001024: sd s0, 0(sp)
80001028: addi s0, sp, 16
> 8000102c: addw a0, a0, a1
80001030: auipc ra, 0x0
80001034: jalr -0x30(ra)
80001038: ld ra, 8(sp) ra: 80001068
8000103c: ld s0, 0(sp) a0: b
80001040: addi sp, sp, 16 a1: c
80001044: ret
Оперативни системи 1, ЕТФ 2022. 31
Конвенција позивања (4/5)
int foo(int a, int b) { | ???????? | 80005220
int local; | ra | 80005218
local = a + b; s0 > | s0 | 80005210
return bar(local); | 80001068 | 80005208
} sp > | 80005220 | 80005200
000000008000101c <foo>: | | 800051f8
8000101c: addi sp, sp, -16 | | 800051f0
80001020: sd ra, 8(sp) | | 800051e8
80001024: sd s0, 0(sp)
80001028: addi s0, sp, 16
8000102c: addw a0, a0, a1
> 80001030: auipc ra, 0x0
80001034: jalr -0x30(ra)
80001038: ld ra, 8(sp) ra: 80001068
8000103c: ld s0, 0(sp) a0: 17
80001040: addi sp, sp, 16 a1: c
80001044: ret
Оперативни системи 1, ЕТФ 2022. 32
Конвенција позивања (4/5)
int foo(int a, int b) { | ???????? | 80005220
int local; | ra | 80005218
local = a + b; s0 > | s0 | 80005210
return bar(local); | 80001068 | 80005208
} sp > | 80005220 | 80005200
000000008000101c <foo>: | | 800051f8
8000101c: addi sp, sp, -16 | | 800051f0
80001020: sd ra, 8(sp) | | 800051e8
80001024: sd s0, 0(sp)
80001028: addi s0, sp, 16
8000102c: addw a0, a0, a1
80001030: auipc ra, 0x0
> 80001034: jalr -0x30(ra)
80001038: ld ra, 8(sp) ra: 80001030
8000103c: ld s0, 0(sp) a0: 17
80001040: addi sp, sp, 16 a1: c
80001044: ret
Оперативни системи 1, ЕТФ 2022. 33
Конвенција позивања (5/5)
int bar(int param) { | ???????? | 80005220
return param + 1; | ra | 80005218
} s0 > | s0 | 80005210
0000000080001000 <bar>: | 80001068 | 80005208
> 80001000: addi sp, sp, -16 sp > | 80005220 | 80005200
80001004: sd s0, 8(sp) | | 800051f8
80001008: addi s0, sp, 16 | | 800051f0
8000100c: addiw a0, a0, 1 | | 800051e8
80001010: ld s0, 8(sp)
80001014: addi sp, sp, 16
80001018: ret

ra: 80001038
a0: 17
a1: c

Оперативни системи 1, ЕТФ 2022. 34


Конвенција позивања (5/5)
int bar(int param) { | ???????? | 80005220
return param + 1; | ra | 80005218
} s0 > | s0 | 80005210
0000000080001000 <bar>: | 80001068 | 80005208
80001000: addi sp, sp, -16 | 80005220 | 80005200
> 80001004: sd s0, 8(sp) | | 800051f8
80001008: addi s0, sp, 16 sp > | | 800051f0
8000100c: addiw a0, a0, 1 | | 800051e8
80001010: ld s0, 8(sp)
80001014: addi sp, sp, 16
80001018: ret

ra: 80001038
a0: 17
a1: c

Оперативни системи 1, ЕТФ 2022. 35


Конвенција позивања (5/5)
int bar(int param) { | ???????? | 80005220
return param + 1; | ra | 80005218
} s0 > | s0 | 80005210
0000000080001000 <bar>: | 80001068 | 80005208
80001000: addi sp, sp, -16 | 80005220 | 80005200
80001004: sd s0, 8(sp) | 80005210 | 800051f8
> 80001008: addi s0, sp, 16 sp > | | 800051f0
8000100c: addiw a0, a0, 1 | | 800051e8
80001010: ld s0, 8(sp)
80001014: addi sp, sp, 16
80001018: ret

ra: 80001038
a0: 17
a1: c

Оперативни системи 1, ЕТФ 2022. 36


Конвенција позивања (5/5)
int bar(int param) { | ???????? | 80005220
return param + 1; | ra | 80005218
} | s0 | 80005210
0000000080001000 <bar>: | 80001068 | 80005208
80001000: addi sp, sp, -16 s0 > | 80005220 | 80005200
80001004: sd s0, 8(sp) | 80005210 | 800051f8
80001008: addi s0, sp, 16 sp > | | 800051f0
> 8000100c: addiw a0, a0, 1 | | 800051e8
80001010: ld s0, 8(sp)
80001014: addi sp, sp, 16
80001018: ret

ra: 80001038
a0: 17
a1: c

Оперативни системи 1, ЕТФ 2022. 37


Конвенција позивања (5/5)
int bar(int param) { | ???????? | 80005220
return param + 1; | ra | 80005218
} | s0 | 80005210
0000000080001000 <bar>: | 80001068 | 80005208
80001000: addi sp, sp, -16 s0 > | 80005220 | 80005200
80001004: sd s0, 8(sp) | 80005210 | 800051f8
80001008: addi s0, sp, 16 sp > | | 800051f0
8000100c: addiw a0, a0, 1 | | 800051e8
> 80001010: ld s0, 8(sp)
80001014: addi sp, sp, 16
80001018: ret

ra: 80001038
a0: 18
a1: c

Оперативни системи 1, ЕТФ 2022. 38


Конвенција позивања (5/5)
int bar(int param) { | ???????? | 80005220
return param + 1; | ra | 80005218
} s0 > | s0 | 80005210
0000000080001000 <bar>: | 80001068 | 80005208
80001000: addi sp, sp, -16 | 80005220 | 80005200
80001004: sd s0, 8(sp) | 80005210 | 800051f8
80001008: addi s0, sp, 16 sp > | | 800051f0
8000100c: addiw a0, a0, 1 | | 800051e8
80001010: ld s0, 8(sp)
> 80001014: addi sp, sp, 16
80001018: ret

ra: 80001038
a0: 18
a1: c

Оперативни системи 1, ЕТФ 2022. 39


Конвенција позивања (5/5)
int bar(int param) { | ???????? | 80005220
return param + 1; | ra | 80005218
} s0 > | s0 | 80005210
0000000080001000 <bar>: | 80001068 | 80005208
80001000: addi sp, sp, -16 sp > | 80005220 | 80005200
80001004: sd s0, 8(sp) | 80005210 | 800051f8
80001008: addi s0, sp, 16 | | 800051f0
8000100c: addiw a0, a0, 1 | | 800051e8
80001010: ld s0, 8(sp)
80001014: addi sp, sp, 16
> 80001018: ret

ra: 80001038
a0: 18
a1: c

Оперативни системи 1, ЕТФ 2022. 40


Оквир функције
više adrese
s0

Povratna adresa

Stari s0
Okvir izvršavanja
tekuće procedure
Sačuvani registri i (stack frame)
lokalne promenljive

Privremeni podaci
(međurezultati,
privremeni
pozivi...)
sp

niže adrese

Оперативни системи 1, ЕТФ 2022. 41

You might also like