Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 05: Trình dịch hợp ngữ, liên kết và nạp
Trình dịch hợp ngữ
Biến đổi mã hợp ngữ dạng ký hiệu thành mã đối tượng (mã máy).
Ưu điểm của hợp ngữ
Dễ nhớ hơn nhiều so với các mã nhị phân của lệnh.
Có thể sử dụng ký hiệu cho địa chỉ – và để cho trình dịch hợp ngữ thực hiện phép toán.
Có thể sử dụng các giả lệnh.
Khi khảo sát hiệu suất, ta cần đếm số lệnh được thực thi, không phải kích thước của
chương trình
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 05: Trình dịch hợp ngữ, liên kết và nạp", để tải tài liệu gốc về máy hãy click vào nút Download ở trên.
File đính kèm:
- bai_giang_vi_xu_ly_nang_cao_phan_1_thiet_ke_cpu_risc_bai_05.pdf
- Lec5.ppt
Nội dung text: Bài giảng Vi xử lý nâng cao - Phần 1: Thiết kế CPU RISC - Bài 05: Trình dịch hợp ngữ, liên kết và nạp
- Baøi giaûng “Vi xöû lyù naâng cao” Phaàn 1: Thieát keá CPU RISC Baøi 05: Trình dòch hôïp ngöõ, lieân keát vaø naïp. 1
- Nhaéc laïi : Caùc leänh cuûa MIPS, ñeán luùc naøy Loaïi Leänh OpC Thí duï YÙ nghóa Arithmetic add 0 & 20 add $s1, $s2, $s3 $s1 = $s2 + $s3 (R & I subtract 0 & 22 sub $s1, $s2, $s3 $s1 = $s2 -$s3 format) add immediate 8 addi $s1, $s2, 4 $s1 = $s2 + 4 shift left logical 0 & 00 sll $s1, $s2, 4 $s1 = $s2 > 4 (laøm logical ñaày baèng caùc bit 0) shift right 0 & 03 sra $s1, $s2, 4 $s1 = $s2 >> 4 (laøm arithmetic ñaày baèng bit daáu) and 0 & 24 and $s1, $s2, $s3 $s1 = $s2 & $s3 or 0 & 25 or $s1, $s2, $s3 $s1 = $s2 | $s3 nor 0 & 27 nor $s1, $s2, $s3 $s1 = not ($s2 | $s3) and immediate c and $s1, $s2, ff00 $s1 = $s2 & 0xff00 or immediate d or $s1, $s2, ff00 $s1 = $s2 | 0xff00 load upper f lui $s1, 0xffff $s1 = 0xffff0000 immediate 3
- Nhaéc laïi: Caùc nguyeân taéc thieát keá RISC Tính ñôn giaûn uûng hoä tính caân ñoái caùc leänh coù kích thöôùc coá ñònh – 32-bit. soá khuoân daïng leänh ít. Caøng nhoû caøng nhanh taäp leänh bò giôùi haïn. taäp thanh ghi coù soá thanh ghi giôùi haïn. soá cheá ñoä ñònh ñòa chæ bò giôùi haïn. Thieát keá toát yeâu caàu nhöõng thoûa hieäp toát ba khuoân daïng leänh. Laøm cho tröôøng hôïp toång quaùt nhanh caùc toaùn haïng soá hoïc töø taäp thanh ghi (load- store machine) cho pheùp caùc leänh chöùa toaùn haïng tröïc tieáp. 5
- Trình bieân dòch Bieán ñoåi chöông trình C thaønh chöông trình hôïp ngöõ. Öu ñieåm cuûa ngoân ngöõ caáp cao chöông trình ngaén hôn. deã hieåu vaø deã gôõ loãi hôn. Caùc trình bieân dòch toái öu hoùa hieän nay coù theå taïo ra maõ hôïp ngöõ gaàn nhö toát baèng vôùi caùc chuyeân gia laäp trình hôïp ngöõ vaø thöôøng toát hôn ñoái vôùi nhöõng chöông trình lôùn. kích thöôùc chöông trình nhoû hôn, thöïc thi nhanh hôn. 7
- Trình dòch hôïp ngöõ Bieán ñoåi maõ hôïp ngöõ daïng kyù hieäu thaønh maõ ñoái töôïng (maõ maùy) . Öu ñieåm cuûa hôïp ngöõ Deã nhôù hôn nhieàu so vôùi caùc maõ nhò phaân cuûa leänh. Coù theå söû duïng kyù hieäu cho ñòa chæ – vaø ñeå cho trình dòch hôïp ngöõ thöïc hieän pheùp toaùn. Coù theå söû duïng caùc giaû leänh. - e.g., “move $t0, $t1” chæ hieän dieän trong trình dòch hôïp ngöõ (seõ ñöôïc thöïc hieän baèng caùch söû duïng “add $t0,$t1,$zero”) Khi khaûo saùt hieäu suaát , ta caàn ñeám soá leänh ñöôïc thöïc thi , khoâng phaûi kích thöôùc cuûa chöông trình. 9
- Caùc coâng vieäc khaùc cuûa trình dòch hôïp ngöõ Bieán ñoåi caùc giaû leänh thaønh maõ hôïp ngöõ hôïp leä. thanh ghi $at ñeå daønh cho trình dòch hôïp ngöõ thöïc hieän vieäc naøy. Bieán ñoåi leänh reõ nhaùnh ñeán vò trí ôû xa thaønh leänh reõ nhaùnh ñöôïc theo sau bôûi leänh jump. Bieán ñoåi leänh coù tröïc tieáp (immediate) lôùn thaønh leänh lui ñöôïc theo sau bôûi leänh ori. Bieán ñoåi caùc soá daïng thaäp phaân vaø hex thaønh nhöõng töông ñöông nhò phaân vaø caùc kyù töï thaønh töông ñöông ASCII cuûa chuùng. Xöû lyù caùc chæ daãn (directive) saép xeáp döõ lieäu (e.g., .asciiz). Khai trieån caùc macro (thöôøng söû duïng chuoãi caùc leänh). 11
- Caùc phaàn cuûa taäp tin ñoái töôïng ñieån hình Object file header : kích thöôùc vaø vò trí cuûa caùc phaàn theo sau trong taäp tin. Text (code) segment (.text) : maõ ñoái töôïng (maõ maùy) ñaõ hôïp dòch. Data segment (.data) : döõ lieäu ñi cuøng vôùi maõ. Döõ lieäu tónh – ñöôïc caáp phaùt xuyeân suoát chöông trình. Döõ lieäu ñoäng – taêng tröôûng vaø thu laïi khi caàn. Relocation information : nhaän daïng caùc leänh (döõ lieäu) söû duïng (ñöôïc ñònh vò trí ôû) caùc ñòa chæ tuyeät ñoái (absolute addresses ) – khoâng lieân quan ñeán thanh ghi. treân MIPS chæ j, jal , vaø moät soá leänh load/store (e.g., lw $t1, 100($zero) ) söû duïng ñòa chæ tuyeät ñoái. Symbol table : giöõ nguyeân caùc kyù hieäu chöa xaùc ñònh (caùc tham chieáu ngoaøi ñeán nhaõn trong taäp tin ñoái töôïng khaùc hoaëc thö vieän). Debugging information : thoâng tin gôõ loãi . 13
- Caáp phaùt boä nhôù cuûa MIPS (spim) Memory f f f f f f f c Mem Map I/O Kernel Code & Data $sp 7f f f f f fc Stack 230 töø (word) Dynamic data (döõ lieäu ñoäng) $gp 1000 8000 (döõ lieäu tónh) Static data 1000 0000 Text Segment PC 0040 0000 Reserved (döï tröõ) 0000 0000 Löu yù raèng stack phaùt trieån xuoáng veà phía mieàn döõ lieäu ñoäng . 15
- Trình lieân keát Laáy taát caû ñoaïn maõ ñaõ ñöôïc hôïp dòch ñoäc laäp vaø “khaâu” (lieân keát) chuùng vôùi nhau. Dòch laïi vaø hôïp dòch laïi ñoaïn maõ ñaõ khaâu seõ nhanh hôn so vôùi vieäc dòch laïi vaø hôïp dòch laïi toaøn boä chöông trình. 1. Quyeát ñònh bieåu ñoà caáp phaùt boä nhôù cho caùc moâ-ñun maõ vaø döõ lieäu cuûa töøng ñoaïn maõ. Nhôù raèng , caùc ñoaïn maõ ñaõ ñöôïc hôïp dòch theo caùch rieâng bieät neân töøng ñoaïn maõ ñaõ ñöôïc giaû ñònh vò trí baét ñaàu cuûa ñoaïn maõ laø 0x0040 0000 vaø vò trí baét ñaàu döõ lieäu tónh cuûa ñoaïn maõ laø 0x1000 0000. 2. Ñònh laïi vò trí caùc ñòa chæ tuyeät ñoái ñeå phaûn aùnh vò trí baét ñaàu môùi cuûa ñoaïn maõ vaø moâ-ñun döõ lieäu cuûa ñoaïn maõ. 3. Söû duïng thoâng tin cuûa caùc baûng kyù hieäu ñeå giaûi quyeát moïi nhaõn vaãn coøn chöa ñöôïc xaùc ñònh. caùc reõ nhaùnh , nhaûy vaø ñòa chæ döõ lieäu ñeán/ôû trong caùc ñoaïn maõ beân ngoaøi. Trình lieân keát taïo ra taäp tin thöïc thi ñöôïc. 17
- Sô ñoà lieân keát chöông trình Taäp tin ñoái töôïng rt_1f: Taäp tin thöïc thi . main: Taäp tin ñoái töôïng . jal printf main: . . jal ??? . . . . jal rt_1f . Linker printf: jal ??? . . call, rt_1f . call, printf Thö vieän C rt_1f: printf: . Ñònh laïi vò . . trí caùc baûn . . ghi. . 19
- Thöù baäc dòch chöông trình C program compiler assembly code assembler object code library routines linker machine code executable loader (trình naïp) memory (boä nhôù) 21
- Thö vieän lieân keát ñoäng Thö vieän lieân keát tónh coù nghóa laø thö vieän naøy trôû thaønh moät phaàn cuûa chöông trình thöïc thi. Chöông trình naïp toaøn boä thö vieän ngay caû khi chæ coù moät phaàn nhoû ñöôïc söû duïng (e.g., thö vieän C chuaån laø 2.5 MB) Neáu phieân baûn môùi cuûa thö vieän ñöôïc phaùt haønh thì sao ? Thö vieän lieân keát ñoäng (DLL) – caùc trình cuûa thö vieän khoâng ñöôïc lieân keát vaø naïp cho ñeán khi moät trình ñöôïc goïi trong thôøi gian thöïc thi. Laàn ñaàu tieân trình thö vieän ñöôïc goïi , trình naïp-lieân keát ñoäng phaûi - tìm trình mong muoán , aùnh xaï laïi , vaø lieân keát trình naøy vôùi trình goïi. DLL yeâu caàu theâm khoâng gian cho thoâng tin lieân keát ñoäng , nhöng khoâng yeâu caàu toaøn boä thö vieän ñeå sao cheùp hoaëc lieân keát. 23