Download presentation
Presentation is loading. Please wait.
1
Компьютерийн зохион байгуулалт, ассемблер CS201
Лекц – 13 Subroutine Холбоос С.Байгалтөгс. ШУТИС-КТМС 2009/Хавар [
2
Энгийн Subroutine Холбоос
Бүх дээд түвшний хэл нь subroutine-тэй (заримдаа процедур, функц, эсвэл метод гэж нэрлэдэг). Subroutine нь өөртөө үйлдэл агуулж болох кодын логик хуваалт юм. Жишээ нь sine функц нь ихэвчлэн subroutine-ээр хэрэгждэг. Энэ нь програмд хэрэг болж ашиглагдах үйлдэл болж тооцогддог. Энэ бүлэгт ассемблер хэлэн дэх subroutine-ийн энгийн хэрэгжүүлэлтийн талаар авч үзэх юм. Энэ нь энгийн хэрэгжүүлэлт нь subroutine-г бүрэн дүрслэхэд хангалтгүй ч эхлэл хэсэг нь болох юм. Бүлэгийн сэдвүүд: Subroutine дуудалт. Caller ба Callee routine. jal ба jr команд $ra регистр Энгийн холбоост дуудалтын хэвшил Subroutine-д ашиглагддаг регистр
3
Callers ба Callees
4
Callers ба Callees Зурган дээр j команд ашиглан юу хийж болохыг үзүүлжээ. (Үүнтэй адил үйлдлийг b командаар хийж болон.) . Үндсэн процедур эхлэх хэрэгтэй үед (“дуудах") дэд процедур нь j командтай хэрэгжинэ. Дэд процедурын төгсгөлд удирдлага өөр j командтай буцаж ирнэ. Дэд процедур нь зөвхөн нэг цэг дээр дуудагдах ба үүний дараа хэд хэдэн командын хаяг руу буцна. Дэд процедур нь зөвхөн үндсэн програм дээр хэрэглэгдэх ба учир нь хуучин байрлал дээр буцаж ирдэг. Дэд процедурын дуудалт нь үндсэн процедур удирдлагаа дэд процедур руу шилжүүлэх үед хэрэгжинэ. Энэ үндсэн процедурыг CALLER буюу ДУУДАГЧ харин дэд процедурыг CALLEE буюу ДУУДАГДАГЧ гэж нэрлэж болох юм. Дэд процедур нь удирдлагаа үндсэн процедур руу (CALLER) шилжүүлэх үед буцах үйлдэл хэрэгждэг. CALLEE нь ажиллагаагаа дуусгахад өөрийн CALLER руугаа удирлагаа буцааж өгнө.
5
Олон дуудалт, нэг буцалт
Код дээр хэд хэдэн газар олон ашиглагдах дэд процедурыг дуудах замаар үндсэн процедурыг бичнэ. Гэвч дэд процедур дуудагдах бүрт зөвхөн нэг газар руу удирдлага буцна. Өмнө нь техник хангамжийн хувьд дэд процедурын тухай ойлголт байсангүй. Үүнийг хэрэгжүүлэх арга зам нь мөн тодорхой биш байсан. Дэд процедур дуудагдаж дуусахад түүн рүү буцах хаяг илгээх замаар асуудлыг шийджээ. Дэд процедур төгсөхөд удирдлагаа тухайн буцах хаяг руу шилжүүлдэг байна. “буцах хаяг руу удирдлагаа буцаана" гэдэг нь дэд процедур нь ПТ (Програм Тоолуур)-ыг буцах хаягтай цуг ачаална гэсэн үг юм. Машин циклийн дараагийн команд нь тухайн хаягаас эхэлж ажиллана.
6
Олон дуудалт, нэг Буцалт
7
Jal команд Холбоосонд (linkage) ашиглагддаг регистр нь $31 ба энэ нь өргөтгөсөн ассемблерт $ra гэж нэрлэгдэнэ. Энэ нь дэд процедурын буцах хаягыг хадгалж байдаг. $ra регистр рүү буцах хаягыг хийдэг команд нь jal юм. Регистр $31 нь хоёр “ерөнхий зориулалтын регистрүүдийн” нэг нь юм (нөгөө нь $0.). jal команд ба регистр $31 нь дэд процедуруудыг нэмэгдүүлэхэд техник хангамжийн дэмжлэгээр хангагдсан байдаг. jal хэрхэн ажилладагийг ойлгохын тулд машин циклийг ажиглая. MIPS –н төгсгөлгүй цикл 3 үндсэн алхамаар дамждаг. Цикл бүр нэг машин команд гүйцэтгэнэ.
8
Jal команд jal команд нь машин циклийн ажиллагааны үед дараах үйлдлийг хийнэ: jal sub # $ra <― PC+4 $ra <― address 8 bytes away from the jal # PC <― sub load the PC with the subroutine entry point Машин циклийн дунд шатанд ПТ-г 4-өөр нэмэгдүүлнэ. Энэ үед ПТ jal командын дараах командын хаягыг агуулна. Одоо jal командын тухайн хаяг руу 4-г нэмэж үр дүнг $ra-д хийх ажиллагаа явагдана. Ингээд $ra нь jal командын дараах хоёр дах командын хаягыг агуулна.
9
Jal команд Буцах зөв хаяг нь “jal хаяг дээр нэмэх нь найм“ юм. Учир нь: (i) Дэд процедураас jal команд руу буцахад осолтой (дахин ажиллаж болзошгүй), мөн (ii) jal-ийн дараах команд нь branch delay slot байна.
10
Jal командын жишээ Диаграмд jal командын ажиллагааг үзүүлжээ. jal нь 0x хаяг дээр байрлаж байна. Буцах хаяг нь jal нэмэх наймын хаяг болох 0x C . (addu командыг энд жишээ болгож авав). Дэд процедураас дуудагч (caller) руу буцах үйлдэл нь jr командаар хийгдэнэ.
11
Jal командын жишээ
12
Jal командын жишээ jal команд ерөнхийдөө хэрхэн ажилладгийг үзүүлэв:
jal sub # $ra <― PC+4 $ra <― address 8 bytes away from the jal # PC <― sub load the PC with the subroutine entry point. Дэд процедурын оролтын цэг нь 0x jal команд эхлэхэд ПТ нь 0x утгатай болно. ПТ нь 0x болж нэмэгдэнэ $ra <― 0x004001C = 0x PC <― 0x Энэ үед branch delay slot дах nop команд ажиллана. Дараагаар 0x хаяг дах дэд процедурын эхний команд ажиллана. Удирдлага дэд процедур руу шилжиж буцах хаяг нь $ra регистрт орно.
13
Jr команд jr команд нь удирдлагыг дуудагч руу буцаана. Энэ команд $ra дах утгыг ПТ руу хуулна: jr $ra # PC <― $ra Usually you think of this as "jumping to the address in $ra." Командыг илүү ерөнхий болгохын тулд $ra-аас бусад аль ч регистртэй хамт ашиглаж болно. Бүх үсрэлтийн болон салаалах командуудын адил, jr команд нь branch delay-г дагана. Диаграм дээр jal командаар $ra-д ачаалагдсан буцах хаягаар буцаж байгаа дэд процедурыг харуулав.
14
Jr команд
15
Дуудалтын зөвшил Диаграмд үндсэн процедур дах ялгаатай гурван цэгээс дуудсан дэд процедурыг үзүүлэв. Дэд процедур дуудагдах бүрт тохирох буцах хаяг руу очно. Дуудалтын зөвшил гэдэг нь дэд процедурууд хэрхэн дуудагдах, удирдлага хэрхэн дуудагч руу буцах үйлдлийн тохирлцоог хэлнэ. Ихэвчлэн програм хангамж байх гэдэгтэй дүйх юм. Дэд процедур дэмждэг процессоруудад (MIPS г.м) зөвшил нь эдгээр нэмэлт дэмжлэгүүд хэрхэн ашиглагддагыг илэрхийлнэ.
16
Дуудалтын зөвшил Хоорондоо ялгаатай үйлдлийн систем дэх ялгаатай програмчлалын хэлүүд нь ялгаатай дуудалтын зөвшилтэй байдаг. MIPS процессор дээрх Linux-н "C" програм хөрвүүлэгч нь MIPS процессор дээрх Irix дээр ажиллахгүй. Учир нь эдгээрийн дуудалтын зөвшил нь өөр юм. Энэ бүлэгт дуудалтын зөвшилийн хэд хэдэн жишээг үзнэ.
17
Дуудалтын зөвшил
18
Регистрийн хэрэглээ Одоо урьд нь өөр дуудалтад ашиглаагүй регистрүүдийн дэд процедур бичихэд ашиглая. Хэрэв үндсэн хэсгийг нь өөрчилбөл бас дахин өөр регистр ашиглан дэд процедурыг дахин бичих хэрэгтэй болно. Дэд процедурын нэг зорилго нь бүхэл кодноос үл хамаарах тусдаа модуль үүсгэх явдал юм. Өөр нэг асуудал нь өгөгдөл хэрхэн дэд процедур руу болон дэд процедураас хэрхэн гардаг явдал юм. Өгөгдлүүд болон үр дүнгүүд ихэвчлэн регистрт хадгалагддаг.Ямар регистрүүд байж болох вэ?
19
Регистрийн хэрэглээ Програм хангамжийн тохиргоогоор регистрүүд нь тусдаа үүрэгтэй байдаг: $t0 - $t9 — Дэд процедураас эдгээрийг өөрчлөхөд чөлөөтэй. $s0 - $s7 — Дэд процедур эдгээрийг өөрчлөх ёсгүй. $a0 - $a3 — Эдгээр регистрүүд дэд процедурын аргументуудыг агуулж байна. Дэд процедур эдгээрийг өөрчлөх боломжтой. $v0 - $v1 — Эдгээр регистрүүд дэд процедураас буцаж ирсэн утгыг хадгална.
20
Энгийн холбоост зөвшил
Энд дуудалтын зөвшилийн жишээг үзүүлэв. Энэ зөвшилийг хэд хэдэн програмд ашиглаж болохуйц юм. Үүнийг Энгийн холбоост Зөвшил гэж нэрлэе. Зөвшилийн зарим нэг дүрмүүд: Дэд процедурыг jal ашиглан дуудна. Дэд процедур нь өөр нэг дэд процедурыг дуудахгүй. Дэд процедур нь jr $ra ашиглан дуудагч руугаа буцдаг. Дараах регистрүүд ашиглагдана: $t0 - $t9 — Дэд процедураас эдгээрийг өөрчлөхөд чөлөөтэй. $s0 - $s7 — Дэд процедур эдгээрийг өөрчлөх ёсгүй. $a0 - $a3 — Эдгээр регистрүүд дэд процедурын аргументуудыг агуулж байна. Дэд процедур эдгээрийг өөрчлөх боломжтой. $v0 - $v1 — Эдгээр регистрүүд дэд процедураас буцаж ирсэн утгыг хадгална. Үндсэн регистр нь SPIM-ийн exit үйлчилгээг ашиглан удирдлагаас буцна(service 10) .
21
Энгийн холбоост зөвшил
Since a subroutine may not call another subroutine (in this Simple Linkage Convention) programs will consist of a main routine that calls any number of subroutines. But the subroutines do not call other subroutines and always return directly to main.
22
Зурагтай дүгнэлт Зурагт mySub нэртэй дуудалтыг үзүүлжээ. Хоёр аргументийг $a0 ба $a1-д дамжуулна. Дэд процедур эдгээр аргументуудыг ашиглах юм Зурган дээр аргументуудыг move болон li командаар тохируулжээ Энгийн холбоост зөвшил нь зарим гарцаагүй тохиолдолд хязгаарлагдмал болжээ. Илүү давамгай дуудалтын зөвшилийг дараагийн бүлэгт үзүүлсэн болно.
23
Зурагтай дүгнэлт
24
Зурагтай дүгнэлт Дуудагч нь аргументыг аргументыг регистрт байрлуулсанаар дэд процедур руу дамжуулна. Энэ нь өгөгдөл дэд процедур руу дамжих цор ганц арга юм. Дэд процедур нь буцаах утгаа регистрт байрлуулж дуудагч руу дамжуулна. Энэ нь мөн дэд процедураас дуудагч руу өгөгдөл буцаах ганц арга юм. Энэ нөхцөлд дэд процедур болон дуудагчийн аль аль нь нэгнийхээ ашиглаж буй санах ой руу “өнгийх” шаардлагагүй юм.
25
Жишээ Програм Энгийн холбоост зөвшил ашигласан жишээ програм үзүүлжээ. Энэ програм нь хэрэглэгчээс 3-н бүхэл тоо уншиж нийлбэрийг бодно. Програм: # read first integer # read second integer # read third integer # compute the sum # write out the result Of course, the user will enter integers as characters from the keyboard. Програм нь exception handler үйлчилгээний дугаар тавыг ашиглаж тэмдэгтүүдийг уншиж 32- бит бүхэл тооруу шилжүүлэх юм.
26
Бүхэл тоог Унших Дэд процедур нь хэрэглэгчийг бүхэл тоог унших ажиллагааг түргэсгэнэ. Бүхэл тоо нь регистр $v0-д буцаж ирнэ. Дэд процедурын эхлэлийг үзүүлэв:
27
Бүхэл тоог Унших # pread -- prompt for and read an integer
# on entry: # $ra -- return address # on exit: # $v0 -- the integer pread: la $a0,prompt # print string li $v0, # service 4 syscall li $v0, # read int into $v0 syscall # service 5 ____ ____ # return nop # branch delay slot .data prompt: .asciiz "Enter an integer"
28
Үндсэн програм .text .globl main main: jal _____ # read first integer
nop # move $s0,$v0 # save it in $s0 jal _____ # read second integer nop # move $s1,$v0 # save it in $s1 jal _____ # read third integer move $s2,$v0 # save it in $s2 addu $s0,$s0,$s1 # compute the sum addu $a0,$s0,$s2 li $v0,1 # print the sum syscall li $v0,10 # exit
29
Глобал симболууд Бие биенийхээ симбол хаягыг мэдэх шаардлагагүй модулиудыг (бидний хувьд subroutines) дахин дуудна. Гэвч зарим симбол хаягуудыг модулиуд хооронд ашиглах шаардлага гардаг. Жишээ нь, pread нь симбол хаяг ба үндсэн програм үүнийг мэдэж jal командад ашиглах ёстой. Дэд процедур нь тухайн симболыг бусад дэд процедурт харагдуулж байвал энэ нь глобал (global) симбол юм. Глобал бус симболуудыг дотоод (local) гэж нэрлэнэ. MIPS ассемблер болон SPIM-д глобал симболуудыг .globl удирдамжийн ард бичиж жагсаана: Зарим хэлэнд үүний оронд external гэсэн үгийг хэрэглэдэг.
30
Глобал симболууд С хэлэн дэх .globl main симбол нь бусад модулиудад харагддаг ба гадаад (external) симбол гэж нэрлэгддэг. Жишээ нь, С хэлэн дэх бүх функцуудын нэр нь гадаад симболууд юм.
31
Бүрэн програм # addthree.asm --- read in three integers and print their sum # This program uses simple linkage. # Settings: Load delays ON; Branch delays ON # Trap file ON; Pseudoinstructions ON .text .globl main main: jal pread # read first integer nop # move $s0,$v0 # save it in $s0 jal pread # read second integer move $s1,$v0 # save it in $s1
32
Бүрэн програм jal pread # read third integer nop #
move $s2,$v0 # save it in $s2 addu $s0,$s0,$s1 # compute the sum addu $a0,$s0,$s2 li $v0,1 # print the sum syscall li $v0,10 # exit
33
Бүрэн програм # pread -- prompt for and read an integer
# on entry: # $ra -- return address # on exit: # $v0 -- the integer .text .globl pread pread: la $a0,prompt # print string li $v0,4 # service 4 syscall
34
Бүрэн програм li $v0,5 # read int into $v0 syscall # service 5
jr $ra # return nop # .data prompt: .asciiz "Enter an integer: "
35
Бүлгийн төгсгөл Сэдвүүд Callers ба Collees jal команд ба буцах хаяг
jr команд Дуудалтын зөвшил Энгийн холбоост дуудалтын зөвшил
Similar presentations
© 2024 SlidePlayer.com. Inc.
All rights reserved.