Chương 3 Câu lệnh: ngôn ngữ của máy

)Kiến trúc của máy tính bao gồm 2 phần •Kiến trúc phần cứng •Kiến trúc tập lệnh )Cả 2 phần trên có mối quan hệ tương hỗ với nhau )Có 2 cách để tiếp cận đến kiến trúc máy tính •Tiếp cận từ phần cứng •Tiếp cận từ tập lệnh Ö chúng ta chọn cách tiếp cận từ tập lệnh )Sử dụng hợp ngữ để giới thiệu tập lệnh )Dùng tập lệnh của bộ xử lý MIPS để minh họa chính

pdf47 trang | Chia sẻ: lylyngoc | Lượt xem: 2565 | Lượt tải: 1download
Bạn đang xem trước 20 trang tài liệu Chương 3 Câu lệnh: ngôn ngữ của máy, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Khoa KH & KT Máy tính Boää moânâ Kyõõ thuaäät Maùùy tính Phaïïm Töôøøng Haûûi Nguyeãnã Quoáác Tuaáán Kiến trúc Máy tính - Chap 03 2 Tài liệu tham khảo ) “Computer Organization and Design: the hardware/software interface”, John L. Hennessy & David A. Patterson, Second Edition, MORGAN KAUFMANN PUBLISHERS, INC. 1998 ) “Computer Architecture: a quantitative approach”, John L. Hennessy & David A. Patterson, Third Edition, MORGAN KAUFMANN PUBLISHERS, INC. 2002 Kiến trúc Máy tính - Chap 03 3 Chương 3. Kiến trúc Máy tính - Chap 03 4 3.1 Dẫn nhập )Kiến trúc của máy tính bao gồm 2 phần • Kiến trúc phần cứng • Kiến trúc tập lệnh )Cả 2 phần trên có mối quan hệ tương hỗ với nhau )Có 2 cách để tiếp cận đến kiến trúc máy tính • Tiếp cận từ phần cứng • Tiếp cận từ tập lệnh Ö chúng ta chọn cách tiếp cận từ tập lệnh )Sử dụng hợp ngữ để giới thiệu tập lệnh )Dùng tập lệnh của bộ xử lý MIPS để minh họa chính Kiến trúc Máy tính - Chap 03 5 3.2 Phép toán )Các máy tính đều có thể thực hiện các phép toán số học )Xét câu lệnh sau (hợp ngữ MIPS) add a , b , c • Chỉ thị cho máy tính thực hiện phép toán cộng • Phép toán trên chỉ có thể thực hiện với 3 toán hạng )Nếu muốn thực hiện phép toán với nhiều toán hạng ? • Phải dùng nhiều câu lệnh để chỉ thị add a , b , c # the sum of b and c is placed in a add a , a , d # the sum of b, c and d is placed in a add a , a , e # the sum of b, c, d and e is placed in a • Mỗi hàng dành để ghi 1 câu lệnh • Phần văn bản đi theo ký hiệu # dành cho chú thích Kiến trúc Máy tính - Chap 03 6 ... )Việc cố định số lượng toán hạng trong câu lệnh giúp đơn giản hóa đáng kể việc thiết kế mạch phần cứng )Nguyên tắc thiết kế 1 Càng đơn giản, càng ổn định ) Thí dụ. Dịch đoạn chương trình C sau đây sang hợp ngữ a = b + c d = a - e )Giải đáp. add a , b , c sub d , a , e Kiến trúc Máy tính - Chap 03 7 ... ) Thí dụ. Dịch đoạn chương trình C sau đây sang hợp ngữ f = ( g + h ) - ( i + j ) )Giải đáp. add t0 , g , h # biến phụ t0 chứa g + h add t1 , i , j # biến phụ t1 chứa i + j sub f , t0 , t1 # f chính là kết quả cần tìm Kiến trúc Máy tính - Chap 03 8 3.3 Toán hạng )Ở các chương trình viết bằng ngôn ngữ cấp cao, biến (variable) đóng vai trò của toán hạng )Đối với các câu lệnh (instruction), ngôn ngữ cấp thấp, toán hạng thường được chứa trong các thanh ghi )Kích thước thanh ghi ở bộ xử lý MIPS là 32 bit. Ö kích thước toán hạng trong các câu lệnh MIPS bị giới hạn ở 32 bit, từ (word) )Số lượng thanh ghi cũng giới hạn. Bộ xử lý MIPS chỉ có 32 thanh ghi 32 bit tham gia vào các phép toán số học )Nguyên tắc thiết kế 2 Càng nhỏ, càng nhanh Kiến trúc Máy tính - Chap 03 9 ... ) Trong các thí dụ kế tiếp, chúng ta sử dụng • Các thanh ghi $s0 , $s1 , ... chứa các biến trong mã nguồn C • Các thanh ghi $t0 , $t1 , ... chứa các biến tạm trong quá trình dịch từ C sang hợp ngữ MIPS ) Thí dụ. Dịch đoạn chương trình C sau đây sang hợp ngữ MIPS với các biến f , g , h , i và j được chứa sẵn trong các thanh ghi $s0 , $s1 , $s2 , $s3 và $s4 f = ( g + h ) - ( i + j ) )Giải đáp. add $t0 , $s1 , $s2 # biến phụ t0 chứa g + h add $t1 , $s3 , $s4 # biến phụ t1 chứa i + j sub $s0 , $t0 , $t1 # f chính là kết quả cần tìm Kiến trúc Máy tính - Chap 03 10 ... )Ngoài các biến đơn, còn có các biến phức tạp thể hiện nhiều kiểu cấu trúc dữ liệu khác nhau, td. array )Các cấu trúc dữ liệu phức tạp có số phần tử dữ liệu nhiều hơn số thanh ghi của bộ xử lý )Nếu các thanh ghi của bộ xử lý chỉ có thể chứa một lượng nhỏ dữ liệu thì bộ nhớ của máy tính có thể chứa được rất nhiều dữ liệu Ö các cấu trúc dữ liệu phức tạp được chứa trong bộ nhớ của máy tính )Cần thiết các câu lệnh thực hiện việc chuyển dữ liệu giữa thanh ghi và bộ nhớ Ö nhóm lệnh chuyển dữ liệu (data transfer) Kiến trúc Máy tính - Chap 03 11 ... )Bộ nhớ có thể được xem như là array một chiều rất lớn của các ô nhớ )Các ô nhớ được đánh số thứ tự từ 0 trở đi Ö địa chỉ (address) ô nhớ )Để có thể truy xuất (access) 1 từ nào đó trong bộ nhớ, cần phải cung cấp địa chỉ ô nhớ )Hình vẽ dưới đây minh họa bộ nhớ Dữ liệuĐịa chỉ 10 1011 102 1003 ...... Kiến trúc Máy tính - Chap 03 12 ... ) Lệnh chuyển dữ liệu từ bộ nhớ vào thanh ghi gọi là lệnh nạp (load) ) Từ gợi nhớ dùng trong hợp ngữ MIPS là lw (load word) ) Thí dụ. Giả sử A là 1 array gồm 100 từ với địa chỉ bắt đầu (starting address) hay địa chỉ nền (base address) chứa trong thanh ghi $s3 , các biến g , h chứa trong thanh ghi $s1 và $s2 . Hãy dịch phát biểu sau: g = h + A[8] )Giải đáp. lw $t0 , 8($s3) # chứa A[8] vào $t0 add $s1 , $s2 , $t0 Kiến trúc Máy tính - Chap 03 13 ... )Ô nhớ có kích thước 8 bit (byte) )Mỗi từ 32 bit cần dùng đến 4 ô nhớ • Mỗi từ phải được bắt đầu ở địa chỉ là bội số của 4 (alignment restriction) • Thứ tự của các byte trong 1 từ: Big Endian hay Little Endian )Hình vẽ minh họa bộ nhớ Dữ liệuĐịa chỉ 10 1014 108 10012 ...... Big Endian 08 09 110 011 Little Endian 08 19 010 011 Kiến trúc Máy tính - Chap 03 14 ... )Câu lệnh ngược lại với lw là sw (store word), ghi dữ liệu từ thanh ghi ra bộ nhớ ) Thí dụ. Giả sử biến h được gán vào thanh ghi $s2 và $s3 chứa địa chỉ nền của array A. Dịch phát biểu sau A[12] = h - A[8] )Giải đáp. )Số biến của chương trình thường nhiều hơn số thanh ghi của bộ xử lý • Thanh ghi chỉ chứa các biến đang xử lý hiện hành và các biến thường sử dụng • Kỹ thuật spilling registers lw $t0 , 32($s3) # chứa A[8] vào $t0 add $t0 , $s2 , $t0 sw $t0 , 48($s3) # kết quả vào A[12] Kiến trúc Máy tính - Chap 03 15 3.4 Biểu diễn câu lệnh )Các thanh ghi trong bộ xử lý cũng được gán địa chỉ tương tự như đối với ô nhớ • Các thanh ghi $s0 ÷ $s7 có địa chỉ từ 16 đến 23 • Các thanh ghi $t0 ÷ $t7 có địa chỉ từ 8 đến 15 )Xét câu lệnh hợp ngữ add $t0 , $s1 , $s2 • Dạng nhị phân • Còn được gọi là dạng ngôn ngữ máy (machine language) hay mã máy (machine code) • Câu lệnh MIPS có độ dài cố định là 32 bits được chia ra thành nhiều trường (field) có độ dài là 5 hay 6 bits 6 bits5 bits5 bits5 bits5 bits6 bits 10000000000010001001010001000000 Kiến trúc Máy tính - Chap 03 16 ... )Các trường trong câu lệnh MIPS • op : operation code Ö tác vụ cơ bản của câu lệnh • rs : 1st source operand Ö toán hạng nguồn thứ nhất • rt : 2nd source operand Ö toán hạng nguồn thứ hai • rd : destination operand Ö toán hạng đích (kết quả) • shamt : shift amount Ö có ý nghĩa đối với lệnh dịch và mang giá trị 00000 đối với các lệnh khác • funct : function code Ö bổ túc cho vùng op ) Làm sao giải quyết trường hợp nếu câu lệnh đòi hỏi trường dành cho toán hạng phải lớn hơn 5 bits ? • Td. Lệnh lw cần biểu diễn 2 địa chỉ thanh ghi và 1 hằng số, nếu giới hạn ở 5 bit, hằng số không lớn hơn 25 = 32 6 bits5 bits5 bits5 bits5 bits6 bits functshamtrdrtrsop Kiến trúc Máy tính - Chap 03 17 ... )Nguyên tắc thiết kế 3 Thiết kế tốt đòi hỏi phải có sự dàn xếp tốt )Đối với tập lệnh MIPS, để giữ cho độ dài câu lệnh không đổi Ö xây dựng 2 dạng lệnh khác nhau • Dạng lệnh mà chúng ta đã xem xét là R-type • Dạng lệnh I-type • Thí dụ. Câu lệnh lw $t0 , 32($s3) • Ba trường đầu của cả 2 dạng lệnh là giống nhau 16 bits5 bits5 bits6 bits addressrtrsop 16 bits5 bits5 bits6 bits 0000 0000 0000 0000 0000 0010 00000100010011100011 Kiến trúc Máy tính - Chap 03 18 ... ) Thí dụ. Tìm hiểu mã máy của đoạn hợp ngữ sau )Giải đáp. lw $t0 , 1200($t1) add $t0 , $s2 , $t0 sw $t0 , 1200($t1) 0000 0100 1011 00000100001001101011 10000000000010000100010010000000 0000 0100 1011 00000100001001100011 12008943 32088180 12008935 Kiến trúc Máy tính - Chap 03 19 3.5 Lệnh ra quyết định )Dựa trên dữ liệu đầu vào cùng với một số giá trị tính toán mà một câu lệnh khác (không phải là câu lệnh kế tiếp trong chương trình) được thực thi )Hỗ trợ thực thi cho phát biểu rẽ nhánh ở ngôn ngữ cấp cao: if , goto , while , ... ) Làm quen với 2 câu lệnh hợp ngữ của MIPS • Branch if equal beq reg1 , reg2 , L1 • Branch if not equal bne reg1 , reg2 , L1 )Hợp ngữ gọi chúng là các lệnh rẽ nhánh có điều kiện (conditional branch) Kiến trúc Máy tính - Chap 03 20 ... ) Thí dụ. Dịch đoạn mã C sau đây sang hợp ngữ MIPS if ( i == j ) goto L1; f = g + h; L1: f = f - i; giả sử các biến từ f đến j tương ứng với các thanh ghi từ $s0 đến $s4 )Bài giải. Kiến trúc Máy tính - Chap 03 21 ... ) Thí dụ. Cũng sử dụng các biến và thanh ghi ở thí dụ trước, dịch đoạn mã C sau đây sang hợp ngữ MIPS if ( i == j ) f = g + h; else f = g - h; )Bài giải. ) Lệnh j (jump) là lệnh rẽ nhánh không điều kiện (unconditional branch) Kiến trúc Máy tính - Chap 03 22 ... ) Thí dụ. Dịch đoạn mã C sau đây sang hợp ngữ MIPS Array A 100 phần tử có địa chỉ nền là $s5 , các biến g , h , i và j tương ứng với các thanh ghi $s1 đến $s4 )Bài giải. Loop: g = g + A[i] ; i = i + j ; if ( i != h) goto Loop Kiến trúc Máy tính - Chap 03 23 ... ) Thí dụ. Dịch đoạn mã C sau đây sang hợp ngữ MIPS Array A có địa chỉ nền là $s6 , các biến i , j và k tương ứng với các thanh ghi $s3 , $s4 và $s5 )Bài giải. while ( A[i] == k ) i = i + j ; Kiến trúc Máy tính - Chap 03 24 ... ) Lệnh set on less than slt reg0 , reg1 , reg2 ) Thanh ghi $zero là thanh ghi đặc biệt luôn mang giá trị 0 ) Thí dụ. Giải thích ý nghĩa của đoạn mã hợp ngữ MIPS sau )Bài giải. ? slt $t0 , $s0 , $s1 bne $t0 , $zero , Less Kiến trúc Máy tính - Chap 03 25 ... ) Thí dụ. Dịch đoạn mã C sau đây sang hợp ngữ MIPS giả sử các biến f đến k tương ứng với $s0 đến $s5, thanh ghi $t2 mang giá trị 4 Switch ( k ) { case 0 : f = i + j ; break ; case 1 : f = g + h ; break ; case 2 : f = g - h ; break ; case 3 : f = i - j ; break ; } Kiến trúc Máy tính - Chap 03 26 ... )Bài giải. slt $t3 , $s5 , $zero bne $t3 , $zero , Exit slt $t3 , $s5 , $t2 beq $t3 , $zero , Exit add $t1 , $s5 , $s5 add $t1 , $t1 , $t1 add $t1 , $t1 , $t4 lw $t0, 0($t1) jr $t0 .......................... L0: add $s0 , $s3 , $s4 j Exit L1: add $s0 , $s1 , $s2 j Exit L2: sub $s0 , $s1 , $s2 j Exit L3: sub $s0 , $s3 , $s4 Exit: Kiến trúc Máy tính - Chap 03 27 3.6 Trình con ) Trình con (subroutine) hay thủ tục (procedure) là công cụ hữu hiệu cho lập trình cấu trúc ) Trình con vừa cho phép tái sử dụng mã nguồn, vừa giúp cho chương trình trở nên trong sáng, dễ hiểu )Để thực thi một trình con, chương trình phải lần lượt thực hiện các thao tác như sau: • Đặt các tham số vào vị trí mà trình con có thể truy xuất được • Chuyển thực thi sang cho trình con • Truy xuất các tài nguyên lưu trử cần thiết cho trình con • Thực hiện tác vụ mong muốn • Đặt kết quả và vị trí mà chương trình gọi (chương trình mẹ) có thể truy xuất được • Trả thực thi về điểm ban đầu (địa chỉ trở về) Kiến trúc Máy tính - Chap 03 28 ... )Các thanh ghi vốn là những vị trí có thể lưu trử dữ liệu nhanh nhất )MIPS ưu tiên sử dụng các thanh ghi sau trong việc gọi trình con • $a0 ÷ $a3 : 4 thanh ghi dùng để chuyển tham số • $v0 ÷ $v1 : 2 thanh ghi dùng để trả về kết quả • $ra : thanh ghi chứa địa chỉ trở về ) Lệnh jump-and-link ( jal ) dùng để nhảy và đồng thời cất địa chỉ câu lệnh kế tiếp vào $ra Ö thực thi lệnh gọi trình con ) Thanh ghi chứa địa chỉ của câu lệnh hiện hành đang thực thi gọi là thanh ghi bộ đếm chương trình (program counter – PC) Kiến trúc Máy tính - Chap 03 29 ... ) Lệnh jal chứa giá trị PC + 4 vào trong thanh ghi $ra )Việc quay trở về chương trình mẹ được thực hiện bởi lệnh jr $ra )Cần phải xét thêm đến các trường hợp • Trình con đòi hỏi nhiều hơn 4 tham số và/hoặc 2 kết quả ? • Bảo vệ (save) nội dung các thanh ghi của chương trình mẹ ? Ö chứa tạm các thanh ghi (spill register) vào bộ nhớ )Cấu trúc dữ liệu lý tưởng để chứa tạm các thanh ghi chính là ngăn xếp (stack) )Stack được quản lý bởi stack pointer và có 2 tác vụ hoạt động cơ bản là push và pop )Ở bộ xử lý MIPS, thanh ghi stack pointer có tên là $sp và lưu ý là stack tăng lên (push) theo chiều giảm địa chỉ Kiến trúc Máy tính - Chap 03 30 ... ) Thí dụ. Dịch đoạn mã C ở hình bên sang hợp ngữ MIPS )Bài giải. int leaf_example ( int g , int h , int i , int j ) { int f ; f = ( g + h ) - ( i + j ) ; return f ; } các biến g , h , i và j được chứa trong $a0 , $a1 , $a2 và $a3 Kiến trúc Máy tính - Chap 03 31 ... )Để giảm thiểu việc bảo vệ (lưu trử/phục hồi) các thanh ghi vào stack, các lập trình viên MIPS qui ước như sau • $s0 ÷ $s7 : 8 thanh ghi được bảo vệ bởi trình được gọi (callee) • $t0 ÷ $t9 : 10 thanh ghi không được bảo vệ bởi trình được gọi ) Lưu ý khi lập trình • Trình gọi (caller) bảo vệ các thanh ghi chứa tham số ( $a0 ÷ $a3 ) và các thanh ghi cần sử dụng sau khi kết thúc trình con ( $t0 ÷ $t9 ) • Trình được gọi bảo vệ thanh ghi địa chỉ trở về ( $ra ) và các thanh ghi sử dụng ($s0 ÷ $s7) • Stack pointer ( $sp ) được tăng/giảm một giá trị tương ứng với lượng thanh ghi bảo vệ ) Trường hợp trình con lồng nhau (nested subroutine) ? • Trình con vừa là của trình gọi vừa là trình bị gọi Kiến trúc Máy tính - Chap 03 32 ... ) Thí dụ. Dịch đoạn mã C ở hình bên sang hợp ngữ MIPS )Bài giải. int fact ( int n ) { if ( n < 1 ) return 1 ; else return( n * fact ( n-1 ) ) ; } biến n được chứa trong $a0 Kiến trúc Máy tính - Chap 03 33 ... )Stack còn được sử dụng để chứa các biến cục bộ (local variable) của trình con, nhất là các biến có cấu trúc, (array, list, ...) không chứa vừa trong các thanh ghi )Đoạn dữ liệu trong stack dành để bảo vệ giá trị các thanh ghi và để chứa các biến cục bộ của một trình con được gọi là khung trình con (procedure frame) hay bản ghi tích cực (activation record) của trình con đó )MIPS sử dụng thanh ghi $fp (frame pointer) để trỏ tới phần tử dữ liệu đầu tiên của khung trình con )Bên cạnh các biến cục bộ còn có các biến toàn cục (global variable) Ö MIPS sử dụng thanh ghi $gp (global pointer) để trỏ tới vùng nhớ chứa các biến toàn cục Kiến trúc Máy tính - Chap 03 34 ... ) Trước thời điểm gọi trình con ) Tại thời điểm gọi trình con )Sau khi kết thúc trình con và trở về $fp $sp Saved argument registers Saved return address Saved saved registers Local variables $fp $sp Kiến trúc Máy tính - Chap 03 35 3.7 Ký tự )Hầu hết các máy tính đều sử dụng giá trị 8-bit để biểu diễn ký tự (character) ) Thông dụng nhất là mã ASCII (American Standard Code for Information Interchange) )Dữ liệu kiểu ký tự (char) được chứa trong 1 ô nhớ hay 1 phần của thanh ghi ) Lệnh truy xuất bộ nhớ 1 byte • Load byte lb reg , sou. addr • Store byte sb reg , des. addr Ö thích hợp để truy xuất dữ liệu kiểu ký tự Kiến trúc Máy tính - Chap 03 36 ... )Dữ liệu kiểu chuỗi ký tự (string) là một chuỗi của các ký tự )Mỗi chuỗi ký tự có độ dài (số ký tự trong chuỗi) khác nhau )Có 3 cách thức để biểu diễn dữ liệu chuỗi ký tự trong bộ nhớ • Sử dụng byte đầu tiên của chuỗi để chứa độ dài chuỗi Ö Ngôn ngữ Pascal • Dùng một biến đi kèm để chứa độ dài chuỗi • Sử dụng byte cuối cùng của chuỗi để chứa 1 giá trị đặc biệt dùng đánh dấu kết thúc của chuỗi Ö Ngôn ngữ C (giá trị 00) )Chúng ta sẽ sử dụng cách thức của ngôn ngữ C để biểu diễn chuỗi trong các thí dụ minh họa Kiến trúc Máy tính - Chap 03 37 ... ) Thí dụ. Trình con strcpy sao chép string y sang string x Biến i được chứa trong $s0 , địa chỉ nền của x và y là $a0 và $a1 )Bài giải. int strcpy ( char x[ ] , char y [ ] ) { int i ; i = 0 ; while ( ( x[i] = y[i] ) != 0 ) i = i + 1 ; } Kiến trúc Máy tính - Chap 03 38 3.8 Địa chỉ hóa ở MIPS )Việc có 1 toán hạng trong câu lệnh xảy ra khá thường xuyên đối với câu lệnh số học • Trong chương trình gcc , 52% câu lệnh số học có 1 toán hạng là hằng số • Trong chương trình spice , con số này là 69% )Hằng số hay toán hạng tức thời (immediate operand) được biểu diễn bởi vùng 16 bit trong câu lệnh dạng i-type • Lệnh add immediate ( addi ) addi $sp , $sp , 4 • Lệnh set on less than ( slti ) slti $t0 , $s2 , 10 16 bits5 bits5 bits6 bits immediatertrsop 0000 0000 0000 01001110111101001000 Kiến trúc Máy tính - Chap 03 39 ... )Nguyên tắc thiết kế 4 Trường hợp càng phổ biến, càng phải nhanh ) Trong trường hợp hằng số lớn hơn 16 bit ? • Lệnh load upper immediate ( lui ) Giá trị ban đầu của $s0 $s0 = 0000 0000 0000 0000 0000 0000 0000 0000 Thực thi lệnh lui lui $s0 , 0b0000000000111101 $s0 = 0000 0000 0011 1101 0000 0000 0000 0000 Thực thi lệnh addi addi $s0 , $s0 , 0b0000100100000000 $s0 = 0000 0000 0011 1101 0000 1001 0000 0000 Kiến trúc Máy tính - Chap 03 40 ... )Địa chỉ đích trong các lệnh nhảy • Đối với lệnh nhảy có điều kiện, vùng địa chỉ là 16 bit (I-type) • Dạng lệnh J-type cho phép vùng địa chỉ của lệnh nhảy không điều kiện lên đến 26 bit • Địa chỉ đích là 26 bit trong vùng toán hạng kết hợp với các bit cao trong thanh ghi PC • Lệnh j 10000 )Giải pháp cho lệnh nhảy có điều kiện ? PC = PC + địa chỉ 16 bit 26 bits6 bits Immediateop Kiến trúc Máy tính - Chap 03 41 ... )Các phương thức địa chỉ hóa (addressing mode) ở MIPS • Register addressing Toán hạng là nội dung thanh ghi • Base addressing hay displacement addressing Toán hạng là nội dung ô nhớ có địa chỉ là tổng giữa nội dung thanh ghi và 1 hằng số 16 bit chứa trong câu lệnh • Immediate addressing Toán hạng là hằng số 16 bit chứa trong câu lệnh • PC-relative addressing Toán hạng, địa chỉ đích của lệnh nhảy, là tổng giữa nội dung thanh ghi PC với hằng số 16 bit chứa trong câu lệnh • Pseudodirect addressing Toán hạng, địa chỉ đích của lệnh nhảy, là hằng số 26 bit chứa trong câu lệnh kết hợp với các bit cao trong thanh ghi PC Kiến trúc Máy tính - Chap 03 42 3.9 Thực thi 1 chương trình )Các bước chính trong qua trình thực thi 1 chương trình mã nguồn C C program Assembly language program Object module Library module Executable program Memory Compiler Assembler Linker Loader Kiến trúc Máy tính - Chap 03 43 … )Chương trình dịch (Compiler) • Dịch chương trình mã nguồn C sang chương trình dạng hợp ngữ • Trước đây, đa phần các hệ điều hành và assembler được viết bằng hợp ngữ do hạn chế về dung lượng bộ nhớ của máy tính và do các chương trình dịch làm việc kém hiệu quả • Ngày nay, dung lượng bộ nhớ đã được phát triển đáng kể, các chương trình dịch cũng hoạt động tối ưu hơn nên đã có thể dịch ra những chương trình dạng hợp ngữ tốt không kém các chuyên gia hợp ngữ, nhất là đối với các chương trình lớn )Assembler • Có thể bổ sung vào tập lệnh các câu lệnh giả (pseudo- instruction) không có trong kiến trúc tập lệnh nhưng có thể giúp cho việc lập trình trở nên hiệu quả hơn move $t0 , $t1 thay cho add $t0 , $zero , $t1 blt , bgt , bge , ble thay cho tổ hợp thích hợp giữa slt với bne , beq Kiến trúc Máy tính - Chap 03 44 … )Assembler (cont’d) • Các toán hạng tức thời có thể viết dưới dạng thập phân, dạng thập lục phân (0x …) hay dạng nhị phân (0b …) • Assembler dịch chương trình dạng hợp ngữ sang object file, là tổ hợp gồm các câu lệnh dạng mã máy, dữ liệu và những thông tin cần thiết để có thể sắp xếp các câu lệnh và dữ liệu một cách đúng đắn trong bộ nhớ • Một object file trên hệ điều hành Unix gồm 6 thành phần * object file header Ö kích thước và vị trí của các thành phần còn lại * text segment Ö chương trình dạng mã máy * data segment Ö chứa các loại dữ liệu (tĩnh/động) đi theo chương trình * relocation information Ö cho phép xác định địa chỉ tuyệt đối của câu lệnh và dữ liệu một khi chương trình được nạp vào bộ nhớ * symbol table Ö lưu chứa các nhãn (label) chưa được định nghĩa * debugging information Kiến trúc Máy tính - Chap 03 45 … ) Linker • Còn gọi là link editor, cho phép ghép các object file riêng lẻ lại với nhau thành một chương trình thống nhất có thể thực thi được gọi là executable file • Quá trình ghép diễn ra theo 3 bước * Xếp mã chương trình và dữ liệu lại với nhau * Xác định địa chỉ cho các nhãn chương trình và dữ liệu * So trùng các tham cứu nội và ngoại (internal/external reference) • Một executable file có các thành phần gần giống với object file trừ