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

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

Upload: judith

Post on 23-Feb-2016

142 views

Category:

Documents


0 download

DESCRIPTION

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

TRANSCRIPT

[www.cdeq.mn/hw200]

С.Байгалтөгс. ШУТИС-КТМС2009/Хавар

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

CS201

Лекц – 13 Subroutine Холбоос

Бүх дээд түвшний хэл нь subroutine-тэй (заримдаа  процедур, функц, эсвэл метод гэж нэрлэдэг). Subroutine нь өөртөө үйлдэл агуулж болох кодын логик хуваалт юм. Жишээ нь sine функц нь ихэвчлэн subroutine-ээр хэрэгждэг. Энэ нь програмд хэрэг болж ашиглагдах үйлдэл болж тооцогддог.

Энэ бүлэгт ассемблер хэлэн дэх subroutine-ийн энгийн хэрэгжүүлэлтийн талаар авч үзэх юм. Энэ нь энгийн хэрэгжүүлэлт нь subroutine-г бүрэн дүрслэхэд хангалтгүй ч эхлэл хэсэг нь болох юм.

Бүлэгийн сэдвүүд: Subroutine дуудалт. Caller ба Callee routine. jal ба jr команд $ra регистр Энгийн холбоост дуудалтын хэвшил Subroutine-д ашиглагддаг регистр

Энгийн Subroutine Холбоос

Callers ба Callees

Зурган дээр j команд ашиглан юу хийж болохыг үзүүлжээ. (Үүнтэй адил үйлдлийг b командаар хийж болон.) . Үндсэн процедур эхлэх хэрэгтэй үед (“дуудах") дэд процедур нь j командтай хэрэгжинэ. Дэд процедурын төгсгөлд удирдлага өөр j командтай буцаж ирнэ.

Дэд процедур нь зөвхөн нэг цэг дээр дуудагдах ба үүний дараа хэд хэдэн командын хаяг руу буцна.

Дэд процедур нь зөвхөн үндсэн програм дээр хэрэглэгдэх ба учир нь хуучин байрлал дээр буцаж ирдэг.

Дэд процедурын дуудалт  нь үндсэн процедур удирдлагаа дэд процедур руу шилжүүлэх үед хэрэгжинэ. Энэ үндсэн процедурыг CALLER буюу ДУУДАГЧ харин дэд процедурыг CALLEE буюу ДУУДАГДАГЧ гэж нэрлэж болох юм. Дэд процедур нь удирдлагаа үндсэн процедур руу (CALLER) шилжүүлэх үед буцах үйлдэл хэрэгждэг.

CALLEE нь ажиллагаагаа дуусгахад өөрийн CALLER руугаа удирлагаа буцааж өгнө.

Callers ба Callees

Код дээр хэд хэдэн газар олон ашиглагдах дэд процедурыг дуудах замаар үндсэн процедурыг бичнэ.  Гэвч дэд процедур дуудагдах бүрт зөвхөн нэг газар руу удирдлага буцна.

Өмнө нь техник хангамжийн хувьд дэд процедурын тухай ойлголт байсангүй. Үүнийг хэрэгжүүлэх арга зам нь мөн тодорхой биш байсан.

Дэд процедур дуудагдаж дуусахад түүн рүү буцах хаяг илгээх замаар асуудлыг шийджээ. Дэд процедур төгсөхөд удирдлагаа тухайн буцах хаяг руу шилжүүлдэг байна.

“буцах хаяг руу удирдлагаа буцаана" гэдэг нь дэд процедур нь ПТ (Програм Тоолуур)-ыг буцах хаягтай цуг ачаална гэсэн үг юм. Машин циклийн дараагийн команд нь тухайн хаягаас эхэлж ажиллана.

Олон дуудалт, нэг буцалт

Олон дуудалт, нэг Буцалт

Холбоосонд (linkage) ашиглагддаг регистр нь $31 ба энэ нь өргөтгөсөн ассемблерт $ra гэж нэрлэгдэнэ. Энэ нь дэд процедурын буцах хаягыг хадгалж байдаг. $ra регистр рүү буцах хаягыг хийдэг команд нь jal юм.

Регистр $31 нь хоёр “ерөнхий зориулалтын регистрүүдийн” нэг нь юм (нөгөө нь $0.). jal команд ба регистр $31 нь дэд процедуруудыг нэмэгдүүлэхэд техник хангамжийн дэмжлэгээр хангагдсан байдаг.

jal хэрхэн ажилладагийг ойлгохын тулд машин циклийг ажиглая. MIPS –н төгсгөлгүй цикл 3 үндсэн алхамаар дамждаг. Цикл бүр нэг машин команд гүйцэтгэнэ.

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 командын дараах  хоёр дах командын хаягыг агуулна.

Jal команд

Буцах зөв хаяг нь “jal хаяг дээр нэмэх нь найм“ юм. Учир нь: (i) Дэд процедураас jal команд руу буцахад осолтой (дахин ажиллаж болзошгүй), мөн (ii) jal-ийн дараах команд нь branch delay slot байна.

Jal команд

Диаграмд jal командын ажиллагааг үзүүлжээ. jal нь 0x00400014 хаяг дээр байрлаж байна. Буцах хаяг нь jal нэмэх наймын хаяг болох 0x0040001C . (addu командыг энд жишээ болгож авав).

Дэд процедураас дуудагч (caller) руу буцах үйлдэл нь jr командаар хийгдэнэ.

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

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. Дэд процедурын оролтын цэг нь 0x00400100. jal команд эхлэхэд ПТ нь 0x00400014 утгатай болно. ПТ

нь 0x00400018 болж нэмэгдэнэ. $ra <― 0x004001C = 0x0040018+4 PC <― 0x00400100

Энэ үед branch delay slot дах nop команд ажиллана. Дараагаар 0x00400100 хаяг дах дэд процедурын эхний команд ажиллана. Удирдлага дэд процедур руу шилжиж буцах хаяг нь $ra регистрт орно.

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

jr команд нь удирдлагыг дуудагч руу буцаана. Энэ команд $ra дах утгыг ПТ руу хуулна:

jr $ra # PC <― $ra Usually you think of this as "jumping to the address in $ra."

Командыг илүү ерөнхий болгохын тулд $ra-аас бусад аль ч регистртэй хамт ашиглаж болно. Бүх үсрэлтийн болон салаалах командуудын адил, jr команд нь branch delay-г дагана.

Диаграм дээр jal командаар $ra-д ачаалагдсан буцах хаягаар буцаж байгаа дэд процедурыг харуулав.

Jr команд

Jr команд

Диаграмд үндсэн процедур дах ялгаатай гурван цэгээс дуудсан дэд процедурыг үзүүлэв. Дэд процедур дуудагдах бүрт тохирох буцах хаяг руу очно.

Дуудалтын зөвшил гэдэг нь дэд процедурууд хэрхэн дуудагдах, удирдлага хэрхэн дуудагч руу буцах үйлдлийн тохирлцоог хэлнэ. Ихэвчлэн програм хангамж байх гэдэгтэй дүйх юм. Дэд процедур дэмждэг процессоруудад (MIPS г.м) зөвшил нь эдгээр нэмэлт дэмжлэгүүд хэрхэн ашиглагддагыг илэрхийлнэ.

Дуудалтын зөвшил

Хоорондоо ялгаатай үйлдлийн систем дэх ялгаатай програмчлалын хэлүүд нь ялгаатай дуудалтын зөвшилтэй байдаг. MIPS процессор дээрх Linux-н "C" програм хөрвүүлэгч нь MIPS процессор дээрх Irix дээр ажиллахгүй. Учир нь эдгээрийн дуудалтын зөвшил нь өөр юм. Энэ бүлэгт дуудалтын зөвшилийн хэд хэдэн жишээг үзнэ.

Дуудалтын зөвшил

Дуудалтын зөвшил

Одоо урьд нь өөр дуудалтад ашиглаагүй регистрүүдийн дэд процедур бичихэд ашиглая.

Хэрэв үндсэн хэсгийг нь өөрчилбөл бас дахин өөр регистр ашиглан дэд процедурыг дахин бичих хэрэгтэй болно.

Дэд процедурын нэг зорилго нь бүхэл кодноос үл хамаарах тусдаа модуль үүсгэх явдал юм.

Өөр нэг асуудал нь өгөгдөл хэрхэн дэд процедур руу болон дэд процедураас хэрхэн гардаг явдал юм. Өгөгдлүүд болон үр дүнгүүд ихэвчлэн регистрт хадгалагддаг.Ямар регистрүүд байж болох вэ?

Регистрийн хэрэглээ

Програм хангамжийн тохиргоогоор регистрүүд нь тусдаа үүрэгтэй байдаг:◦ $t0 - $t9 — Дэд процедураас эдгээрийг өөрчлөхөд

чөлөөтэй.◦ $s0 - $s7 — Дэд процедур эдгээрийг өөрчлөх ёсгүй.◦ $a0 - $a3 — Эдгээр регистрүүд дэд процедурын

аргументуудыг агуулж байна. Дэд процедур эдгээрийг өөрчлөх боломжтой.

◦ $v0 - $v1 — Эдгээр регистрүүд дэд процедураас буцаж ирсэн утгыг хадгална.

Регистрийн хэрэглээ

Энд дуудалтын зөвшилийн жишээг үзүүлэв. Энэ зөвшилийг хэд хэдэн програмд ашиглаж болохуйц юм. Үүнийг Энгийн холбоост Зөвшил гэж нэрлэе. Зөвшилийн зарим нэг дүрмүүд:

1. Дэд процедурыг jal ашиглан дуудна.2. Дэд процедур нь өөр нэг дэд процедурыг дуудахгүй.3. Дэд процедур нь  jr $ra ашиглан дуудагч руугаа буцдаг.4. Дараах регистрүүд ашиглагдана:

◦ $t0 - $t9 — Дэд процедураас эдгээрийг өөрчлөхөд чөлөөтэй.◦ $s0 - $s7 — Дэд процедур эдгээрийг өөрчлөх ёсгүй.◦ $a0 - $a3 — Эдгээр регистрүүд дэд процедурын аргументуудыг

агуулж байна. Дэд процедур эдгээрийг өөрчлөх боломжтой.◦ $v0 - $v1 — Эдгээр регистрүүд дэд процедураас буцаж ирсэн утгыг

хадгална.5. Үндсэн регистр нь SPIM-ийн exit үйлчилгээг ашиглан

удирдлагаас буцна(service 10) .

Энгийн холбоост зөвшил

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.

Энгийн холбоост зөвшил

Зурагт mySub нэртэй дуудалтыг үзүүлжээ. Хоёр аргументийг $a0 ба $a1-д дамжуулна. Дэд процедур эдгээр аргументуудыг ашиглах юм

Зурган дээр аргументуудыг move болон li командаар тохируулжээ

Энгийн холбоост зөвшил нь зарим гарцаагүй тохиолдолд хязгаарлагдмал болжээ. Илүү давамгай дуудалтын зөвшилийг дараагийн бүлэгт үзүүлсэн болно.

Зурагтай дүгнэлт

Зурагтай дүгнэлт

Дуудагч нь аргументыг аргументыг регистрт байрлуулсанаар дэд процедур руу дамжуулна. Энэ нь өгөгдөл дэд процедур руу дамжих цор ганц арга юм. Дэд процедур нь буцаах утгаа регистрт байрлуулж дуудагч руу дамжуулна. Энэ нь мөн дэд процедураас дуудагч руу өгөгдөл буцаах ганц арга юм. Энэ нөхцөлд дэд процедур болон дуудагчийн аль аль нь нэгнийхээ ашиглаж буй санах ой руу “өнгийх” шаардлагагүй юм.

Зурагтай дүгнэлт

Энгийн холбоост зөвшил ашигласан жишээ програм үзүүлжээ. Энэ програм нь хэрэглэгчээс 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-бит бүхэл тооруу шилжүүлэх юм.

Жишээ Програм

Дэд процедур нь хэрэглэгчийг бүхэл тоог унших ажиллагааг түргэсгэнэ. Бүхэл тоо нь регистр $v0-д буцаж ирнэ. Дэд процедурын эхлэлийг үзүүлэв:

Бүхэл тоог Унших

# 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"

Бүхэл тоог Унших

.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

Үндсэн програм

Бие биенийхээ симбол хаягыг мэдэх шаардлагагүй модулиудыг (бидний хувьд subroutines) дахин дуудна.

Гэвч зарим симбол хаягуудыг модулиуд хооронд ашиглах шаардлага гардаг. Жишээ нь, pread нь симбол хаяг ба үндсэн програм үүнийг мэдэж jal командад ашиглах ёстой.

Дэд процедур нь тухайн симболыг бусад дэд процедурт харагдуулж байвал энэ нь глобал (global) симбол юм. Глобал бус симболуудыг дотоод (local) гэж нэрлэнэ. MIPS ассемблер болон SPIM-д глобал симболуудыг .globl удирдамжийн ард бичиж жагсаана: Зарим хэлэнд үүний оронд external гэсэн үгийг хэрэглэдэг.

Глобал симболууд

С хэлэн дэх .globl main симбол нь бусад модулиудад харагддаг ба гадаад (external) симбол гэж нэрлэгддэг. Жишээ нь, С хэлэн дэх бүх функцуудын нэр нь гадаад симболууд юм.

Глобал симболууд

# 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 nop # move $s1,$v0 # save it in $s1

Бүрэн програм

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 syscall

Бүрэн програм

# 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

Бүрэн програм

li $v0,5 # read int into $v0 syscall # service 5 jr $ra # return nop # .data prompt: .asciiz "Enter an integer: "

Бүрэн програм

Сэдвүүд Callers ба Collees jal команд ба буцах хаяг jr команд Дуудалтын зөвшил Энгийн холбоост дуудалтын зөвшил

Бүлгийн төгсгөл