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

Slides:



Advertisements
Similar presentations
The University of Adelaide, School of Computer Science
Advertisements

MIPS ISA-II: Procedure Calls & Program Assembly. (2) Module Outline Review ISA and understand instruction encodings Arithmetic and Logical Instructions.
CDA 3100 Recitation Week 15. What does the function f1 do:.data A:.word 10,21,45,8,100,15,29,12,3,19 B:.word 2,5,33,5,20,1,53,52,5,5 C:.word 6,8,5,4,5,22,53,12,33,89.text.globl.
MIPS ISA-II: Procedure Calls & Program Assembly. (2) Module Outline Review ISA and understand instruction encodings Arithmetic and Logical Instructions.
MIPS Assembly Language CPSC 321 Computer Architecture Andreas Klappenecker.
5Z032 Processor Design SPIM, a MIPS simulator Henk Corporaal
Procedure Calls Prof. Sirer CS 316 Cornell University.
SPIM and MIPS programming
Syscall in MIPS Xinhui Hu Yuan Wang.
MIPS Function Continued
MIPS Assembly Language Programming
Ch. 8 Functions.
Fibonacci with Loop int fib1(int i) { int f1 = 1; int f2 = 1; int f3;
1 Computer Architecture MIPS Simulator and Assembly language.
Assembly Language Working with the CPU.
.text fact: addiu $sp, $sp, -32 sw $ra, 20($sp) sw $fp, 16($sp) addiu $fp, $sp, 28 sw $a0, 0($fp) bgtz $a0, L2 li $v0, 1 b suffix L2: addi $a0, $a0,
ECE 0142 Recitation #5.
 Procedures (subroutines) allow the programmer to structure programs making them : › easier to understand and debug and › allowing code to be reused.
ECE 232 L7.Simul.1 Adapted from Patterson 97 ©UCBCopyright 1998 Morgan Kaufmann Publishers ECE 232 Hardware Organization and Design Lecture 7 MIPS Assembly.
MIPS Assembly Language I Computer Architecture CPSC 321 Andreas Klappenecker.
Procedures I Fall 2005 C functions main() { int i,j,k,m;... i = mult(j,k);... m = mult(i,i);... } /* really dumb mult function */ int mult (int mcand,
Lecture 5: Procedures. Function call book-keeping in C main() { int i,j,k,m;... i = mult(j,k);... m = mult(i,i);... } /* really dumb mult function */
CS-2710 Dr. Mark L. Hornick 1 Defining and calling procedures (subroutines) in assembly And using the Stack.
Procedure Basics Computer Organization I 1 October 2009 © McQuain, Feng & Ribbens Procedure Support From previous study of high-level languages,
Subroutines, parameters and the stack Bryan Duggan.
Lecture 10: MIPS Simulator Today’s topic –SPIM Simulator Readings –Appendix B 1.
Lecture 161 Lets examine a SPIM program in detail. io.asm This program is a simple routine which demonstrates input/output using assembly code. SPIM.
The SPIM Trap Handler Syscall Trap handler services String operations File operations Memory allocation Central Connecticut State University, MIPS Tutorial.
Computer Organization CS345 David Monismith Based upon notes by Dr. Bill Siever and notes from the Patterson and Hennessy Text.
CS 312 Computer Architecture & Organization
Computer Science 210 Computer Organization
Computer structure: Procedure Calls
Lecture 5: Procedure Calls
MIPS Assembly Language Programming
Introduction to Lab #1 José Nelson Amaral.
MIPS I/O and Interrupt.
MIPS Procedures.
MIPS instructions.
Pseudo instructions.
MIPS I/O and Interrupt.
MIPS coding.
MIPS I/O and Interrupt.
Prof. Hakim Weatherspoon
SPIM Syscalls.
MIPS Procedures.
Prof. Hakim Weatherspoon
MIPS Functions.
MIPS Instructions.
The University of Adelaide, School of Computer Science
MIPS Functions.
Pseudo instructions.
Lecture 7: Examples, MARS, Arithmetic
MIPS Functions.
Компьютерийн зохион байгуулалт, ассемблер CS201
MIPS Procedures.
Review.
MIPS function continued
MIPS Functions.
MIPS I/O and Interrupt.
Procedures and Calling Conventions
MIPS coding.
Where is all the knowledge we lost with information? T. S. Eliot
MIPS Assembly Language Programming
MIPS Functions.
CS 286 Computer Architecture & Organization
MIPS function continued
MIPS Functions.
Introduction to SPIM Simulator
MIPS R3000 Subroutine Calls and Stack
PROF. JOHN ABRAHAM UTRGV
Presentation transcript:

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

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

Callers ба Callees

Callers ба Callees Зурган дээр j команд ашиглан юу хийж болохыг үзүүлжээ. (Үүнтэй адил үйлдлийг b командаар хийж болон.) . Үндсэн процедур эхлэх хэрэгтэй үед (“дуудах") дэд процедур нь j командтай хэрэгжинэ. Дэд процедурын төгсгөлд удирдлага өөр j командтай буцаж ирнэ. Дэд процедур нь зөвхөн нэг цэг дээр дуудагдах ба үүний дараа хэд хэдэн командын хаяг руу буцна. Дэд процедур нь зөвхөн үндсэн програм дээр хэрэглэгдэх ба учир нь хуучин байрлал дээр буцаж ирдэг. Дэд процедурын дуудалт  нь үндсэн процедур удирдлагаа дэд процедур руу шилжүүлэх үед хэрэгжинэ. Энэ үндсэн процедурыг CALLER буюу ДУУДАГЧ харин дэд процедурыг CALLEE буюу ДУУДАГДАГЧ гэж нэрлэж болох юм. Дэд процедур нь удирдлагаа үндсэн процедур руу (CALLER) шилжүүлэх үед буцах үйлдэл хэрэгждэг. CALLEE нь ажиллагаагаа дуусгахад өөрийн CALLER руугаа удирлагаа буцааж өгнө.

Олон дуудалт, нэг буцалт Код дээр хэд хэдэн газар олон ашиглагдах дэд процедурыг дуудах замаар үндсэн процедурыг бичнэ.  Гэвч дэд процедур дуудагдах бүрт зөвхөн нэг газар руу удирдлага буцна. Өмнө нь техник хангамжийн хувьд дэд процедурын тухай ойлголт байсангүй. Үүнийг хэрэгжүүлэх арга зам нь мөн тодорхой биш байсан. Дэд процедур дуудагдаж дуусахад түүн рүү буцах хаяг илгээх замаар асуудлыг шийджээ. Дэд процедур төгсөхөд удирдлагаа тухайн буцах хаяг руу шилжүүлдэг байна. “буцах хаяг руу удирдлагаа буцаана" гэдэг нь дэд процедур нь ПТ (Програм Тоолуур)-ыг буцах хаягтай цуг ачаална гэсэн үг юм. Машин циклийн дараагийн команд нь тухайн хаягаас эхэлж ажиллана.

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

Jal команд Холбоосонд (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 регистрт орно.

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-д ачаалагдсан буцах хаягаар буцаж байгаа дэд процедурыг харуулав.

Jr команд

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

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

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

Регистрийн хэрэглээ Одоо урьд нь өөр дуудалтад ашиглаагүй регистрүүдийн дэд процедур бичихэд ашиглая. Хэрэв үндсэн хэсгийг нь өөрчилбөл бас дахин өөр регистр ашиглан дэд процедурыг дахин бичих хэрэгтэй болно. Дэд процедурын нэг зорилго нь бүхэл кодноос үл хамаарах тусдаа модуль үүсгэх явдал юм. Өөр нэг асуудал нь өгөгдөл хэрхэн дэд процедур руу болон дэд процедураас хэрхэн гардаг явдал юм. Өгөгдлүүд болон үр дүнгүүд ихэвчлэн регистрт хадгалагддаг.Ямар регистрүүд байж болох вэ?

Регистрийн хэрэглээ Програм хангамжийн тохиргоогоор регистрүүд нь тусдаа үүрэгтэй байдаг: $t0 - $t9 — Дэд процедураас эдгээрийг өөрчлөхөд чөлөөтэй. $s0 - $s7 — Дэд процедур эдгээрийг өөрчлөх ёсгүй. $a0 - $a3 — Эдгээр регистрүүд дэд процедурын аргументуудыг агуулж байна. Дэд процедур эдгээрийг өөрчлөх боломжтой. $v0 - $v1 — Эдгээр регистрүүд дэд процедураас буцаж ирсэн утгыг хадгална.

Энгийн холбоост зөвшил Энд дуудалтын зөвшилийн жишээг үзүүлэв. Энэ зөвшилийг хэд хэдэн програмд ашиглаж болохуйц юм. Үүнийг Энгийн холбоост Зөвшил гэж нэрлэе. Зөвшилийн зарим нэг дүрмүүд: Дэд процедурыг jal ашиглан дуудна. Дэд процедур нь өөр нэг дэд процедурыг дуудахгүй. Дэд процедур нь  jr $ra ашиглан дуудагч руугаа буцдаг. Дараах регистрүүд ашиглагдана: $t0 - $t9 — Дэд процедураас эдгээрийг өөрчлөхөд чөлөөтэй. $s0 - $s7 — Дэд процедур эдгээрийг өөрчлөх ёсгүй. $a0 - $a3 — Эдгээр регистрүүд дэд процедурын аргументуудыг агуулж байна. Дэд процедур эдгээрийг өөрчлөх боломжтой. $v0 - $v1 — Эдгээр регистрүүд дэд процедураас буцаж ирсэн утгыг хадгална. Үндсэн регистр нь 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 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

Глобал симболууд Бие биенийхээ симбол хаягыг мэдэх шаардлагагүй модулиудыг (бидний хувьд 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 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

Бүрэн програм # 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 команд Дуудалтын зөвшил Энгийн холбоост дуудалтын зөвшил