1 / 35

Компьютерийн зохион байгуулалт, ассемблер CS201

Компьютерийн зохион байгуулалт, ассемблер CS201. С.Байгалтөгс. ШУТИС - КТМС 2009 / Хавар. Лекц – 1 3 Subroutine Холбоос. Энгийн Subroutine Холбоос.

judith
Download Presentation

Компьютерийн зохион байгуулалт, ассемблер CS201

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Компьютерийн зохион байгуулалт, ассемблерCS201 С.Байгалтөгс.ШУТИС-КТМС 2009/Хавар Лекц – 13 Subroutine Холбоос [www.cdeq.mn/hw200]

  2. Энгийн Subroutine Холбоос • Бүх дээд түвшний хэлнь subroutine-тэй (заримдаа процедур,функц, эсвэл метод гэж нэрлэдэг). Subroutine нь өөртөө үйлдэл агуулж болох кодын логик хуваалт юм.Жишээ нь sine функц нь ихэвчлэн subroutine-ээр хэрэгждэг. Энэ нь програмд хэрэг болж ашиглагдах үйлдэл болж тооцогддог. • Энэ бүлэгт ассемблер хэлэн дэх subroutine-ийн энгийн хэрэгжүүлэлтийн талаар авч үзэх юм. Энэ нь энгийн хэрэгжүүлэлт нь subroutine-г бүрэн дүрслэхэд хангалтгүй ч эхлэл хэсэг нь болох юм. Бүлэгийн сэдвүүд: • Subroutine дуудалт. • Caller баCalleeroutine. • 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команд нь машин циклийн ажиллагааны үед дараах үйлдлийг хийнэ: • jalsub # $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нь 0x00400014 хаяг дээр байрлаж байна. Буцах хаяг ньjalнэмэх наймын хаяг болох 0x0040001C. (adduкомандыг энд жишээ болгож авав). • Дэд процедураас дуудагч (caller) руу буцах үйлдэл нь jrкомандаар хийгдэнэ.

  11. Jalкомандын жишээ

  12. Jalкомандын жишээ • jalкоманд ерөнхийдөө хэрхэн ажилладгийг үзүүлэв: jalsub# $ra <― PC+4 $ra <― address 8 bytes away from the jal # PC <― sub load the PC with the subroutine entry point. Дэд процедурын оролтын цэг нь 0x00400100. • jalкоманд эхлэхэд ПТ нь 0x00400014 утгатай болно. ПТ нь 0x00400018 болж нэмэгдэнэ. $ra <― 0x004001C = 0x0040018+4 PC <― 0x00400100 • Энэ үед branch delay slot дах nopкоманд ажиллана. Дараагаар 0x00400100 хаяг дах дэд процедурын эхний команд ажиллана. Удирдлага дэд процедур руу шилжиж буцах хаяг нь $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,4 # service 4 • syscall • li$v0,5 # 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 • 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 • syscall

  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 • .globlmain • main: jalpread# read first integer • nop# • move $s0,$v0 # save it in $s0 • jalpread# read second integer • nop# • move $s1,$v0 # save it in $s1

  32. Бүрэн програм • jalpread# 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 • syscall

  33. Бүрэн програм • # pread -- prompt for and read an integer • # on entry: # $ra -- return address • # on exit: # $v0 -- the integer • .text • .globlpread • 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команд • Дуудалтын зөвшил • Энгийн холбоост дуудалтын зөвшил

More Related