Bài giảng Thực hành chương trình dịch: Bài 5 - Phạm Đăng Hải
lượt xem 4
download
Bài giảng "Thực hành chương trình dịch: Bài 5 - Sinh mã" bao gồm các bài tập thực hành về: xây dựng bảng ký hiệu; sinh mã cho các câu lệnh; sinh mã lấy địa chỉ/giá trị. Thông qua các bài tập thực hành, các bạn sẽ củng cố được kiến thức và vận dụng nó trong quá trình học tập và làm việc. Mời các bạn cùng tham khảo!
Bình luận(0) Đăng nhập để gửi bình luận!
Nội dung Text: Bài giảng Thực hành chương trình dịch: Bài 5 - Phạm Đăng Hải
- Thực hành CHƯƠNG TRÌNH DỊCH Bài 5: Sinh mã Phạm Đăng Hải haipd@soict.hut.edu.vn
- Các bài thực hành 1. Xây dựng bảng ký hiệu • Giới thiệu máy ngăn xếp • Vấn đề xây dựng bảng ký hiệu 1. Sinh mã cho các câu lệnh • Giới thiệu bộ thông dịch KPLrun • Sinh mã cho các câu lệnh gán, rẽ nhánh, lặp.. 1. Sinh mã lấy địa chỉ/giá trị • Lấy địa chỉ/giá trị của biến, của phần tử mảng của tham số hình thức • Sinh mã lấy địa chỉ của giá trị trả về của hàm • Sinh mã gọi thủ tục • Sinh mã tham số thực tế 09/20/23 2
- Sinh mã đích Phân tích • Sinh mã là công đoạn biến đổi từ từ vựng cấu trúc ngữ pháp của chương trình thành chuỗi các lệnh thực thi Phân tích được của máy đích cú pháp • Cấu trúc ngữ pháp được quyết định bởi bộ phân tích cú pháp Phân tích ngữ nghĩa • Các lệnh của máy đích được đặc tả bởi kiến trúc thực thi của máy đích Sinh mã – KPL sử dụng kiến trúc máy ngăn xếp 09/20/23 3
- Máy ngăn xếp • Máy ngăn xếp là một hệ thống tính toán – Sử dụng ngăn xếp để lưu trữ các kết quả trung gian của quá trình tính toán – Kiến trúc đơn giản – Bộ lệnh đơn giản • Máy ngăn xếp có hai vùng bộ nhớ chính – Khối lệnh: • Chứa mã thực thi của chương trình – Ngăn xếp: • Lưu trữ các kết quả trung gian 09/20/23 4
- Máy ngăn xếp PC, B, T là các thanh ghi của máy RV B JMP 2 DL PC INC 4 RA LA 0,4 SL LC 1 T P1 ST P2 V1 V2 tmp1 T Code buffer Stack 09/20/23 5
- Máy ngăn xếp Thanh ghi • PC (program counter): – Con trỏ lệnh trỏ tới lệnh hiện tại đang thực thi trên bộ đệm chương trình • B (base): – Con trỏ trỏ tới địa chỉ cơ sở của vùng nhớ cục bộ. Các biến cục bộ được truy xuất gián tiếp qua con trỏ này • T (top); – Con trỏ, trỏ tới đỉnh của ngăn xếp 09/20/23 6
- Máy ngăn xếp Bản hoạt động (stack frame) • Không gian nhớ cấp phát cho mỗi chương trình con (hàm/thủ tục/chương trình chính) khi chúng được kích hoạt – Lưu giá trị tham số – Lưu giá trị biến cục bộ – Lưu các thông tin quan trọng khác: • RV, DL, RA, SL • Một chương trình con có thể có nhiều bản hoạt động 09/20/23 7
- Máy ngăn xếp Bản hoạt động (stack frame) • RV (return value): – Lưu trữ giá trị trả về cho mỗi hàm • DL (dynamic link): – Địa chỉ cơ sở của bản hoạt động của chương trình con gọi tới nó (caller). – Được sử dụng để hồi phục ngữ cảnh của chương trình gọi (caller) khi chương trình được gọi (called) kết thúc • RA (return address): – Địa chỉ lệnh quay về khi kết thúc chương trình con – Sử dụng để tìm tới lệnh tiếp theo của caller khi called kết thúc • SL (static link): – Địa chỉ cơ sở của bản hoạt động của chương trình con bao ngoài – Sử dụng để truy nhập các biến phi cục bộ 09/20/23 8
- Máy ngăn xếp Bản hoạt động Ví dụ Procedure P(I : integer); Var a : integer; Stack Function Q; … Var x : char; RV Begin DL … RA SL P frame return Param I End; Local a Procedure R(X: integer); … Var y : char; RV DL Begin RA R frame … SL y = Call Q; param x Local y … … End; RV RV Begin DL Q frame … RA Call R(1); SL Local x … End; 09/20/23 9
- Máy ngăn xếp Lệnh • Lệnh máy có dạng : Op p q – Op : Mã lệnh – p, q : Các toán hạng. • Các toán hạng có thể tồn tại đầy đủ, có thể chỉ có 1 toán hạng, có thể không tồn tại • Ví dụ J1 % Nhảy đến địa chỉ 1 LA 0, 4 % Nạp địa chỉ từ số 0+4 lên đỉnh stack HT %Kết thúc chương trình 09/20/23 10
- Máy ngăn xếp Bộ lệnh (1/5) op p q LA Load Address t:=t+1; s[t]:=base(p)+q; LV Load Value t:=t+1; s[t]:=s[base(p)+q]; LC Load Constant t:=t+1; s[t]:=q; LI Load Indirect s[t]:=s[s[t]]; INT Increment T t:=t+q; DCT Decrement T t:=t-q; 09/20/23 11
- Máy ngăn xếp Bộ lệnh (2/5) op p q J Jump pc:=q; FJ False Jump if s[t]=0 then pc:=q; t:=t1; HL Halt Halt ST Store s[s[t1]]:=s[t]; t:=t2; s[t+2]:=b; s[t+3]:=pc; CALL Call s[t+4]:=base(p); b:=t+1; pc:=q; Exit EP t:=b1; pc:=s[b+2]; b:=s[b+1]; Procedure EF Exit Function t:=b; pc:=s[b+2]; b:=s[b+1]; 09/20/23 12
- Máy ngăn xếp Bộ lệnh (3/5) op p q Read t=t+1; RC Character read one character into s[t]; Read RI t=t+1; read integer to s[t]; Integer Write write one character from s[t]; WRC Character t:=t1; Write WRI write integer from s[t]; t:=t1; Integer WLN New Line CR & LF 09/20/23 13
- Máy ngăn xếp Bộ lệnh (4/5) op p q AD Add t:=t1; s[t]:=s[t]+s[t+1]; SB Subtract t:=t1; s[t]:=s[t]s[t+1]; ML Multiply t:=t1; s[t]:=s[t]*s[t+1]; DV Divide t:=t1; s[t]:=s[t]/s[t+1]; NEG Negative s[t]:=s[t]; Copy Top CV s[t+1]:=s[t]; t:=t+1; of Stack 09/20/23 14
- Máy ngăn xếp Bộ lệnh (5/5) op p q t:=t1; if s[t] = s[t+1] then EQ Equal s[t]:=1 else s[t]:=0; t:=t1; if s[t] != s[t+1] then NE Not Equal s[t]:=1 else s[t]:=0; Greater t:=t1; if s[t] > s[t+1] then GT Than s[t]:=1 else s[t]:=0; t:=t1; if s[t] = s[t+1] then GE Equal s[t]:=1 else s[t]:=0; Less or t:=t1; if s[t]
- Máy ngăn xếp Ví dụ PC 0 J 1 T=-1 PC 1 INT 5 PC B=0 2 LA 0, 4 PC 3 LC 5 PC 4 ST PC 5 LA 0,4 PC T 6 LC 10 50 5 PC 7 LV 0, 4 T 50 4 PC T 8 ML Program Example1; PC 10 50 5 9 ST T Var n : integer; PC 5 Begin 10 LV 0,4 n := 5; PC n := 10 * n; 11 WRI CALL WRITEI(n); PC Stack CALL WRITELN; 12 WLN PC End. 13 HT 09/20/23 16
- Xây dựng máy ngăn xếp Mã lệnh máy OP_RC, OP_RI, // // Read Char Read Integer OP_WRC, // Write Char typedef enum { OP_WRI, // Write Int OP_LA, // Load Address: OP_WLN, // WriteLN OP_LV, // Load Value: OP_ADD, // Add OP_LC, // load Constant OP_SUB, // Substract OP_LI, // Load Indirect OP_MUL, // Multiple OP_INT, // Increment t OP_DIV, // Divide OP_DCT, // Decrement t OP_NEG, // Negative OP_J, // Jump OP_CV, // Copy Top OP_FJ, // False Jump OP_EQ, // Equal OP_HL, // Halt OP_NE, // Not Equal OP_ST, // Store OP_GT, // Greater OP_CALL, // Call OP_LT, // Less OP_EP, // Exit Procedure OP_GE, // Greater or Equal OP_EF, // Exit Function OP_LE, // Less or Equal OP_BP // Break point. } OpCode ; 09/20/23 17
- Xây dựng máy ngăn xếp Cấu trúc một lệnh typedef struct{ OpCode Op; int p; int q; } Instruction; Cấu trúc đoạn mã lệnh Instruction Code [MAX_CODE]; Cấu trúc đoạn dữ liệu (stack) int Stack[MAX_DATA]; 09/20/23 18
- Xây dựng máy ngăn xếp Hàm base(int L) dùng void intepreter(){ int pc = 0, t = -1, b = 0; để tính địa chỉ cơ sở do { của chương trình con switch (Code[pc].Op) { bao bên ngoài L mức case OP_LA: t ++; Stack[t] = base(Code[pc].p) + Code[pc].q; break; case OP_LV: t ++; Stack[t] = Stack[base(Code[pc].p) + Code[pc].q]; break; 1 case OP_INT: 2 t += Code[pc].q; 3 break; 09/20/23 case OP_DCT: … 19
- Xây dựng máy ngăn xếp …….. case OP_CALL: Stack[t+2] = b; // Dynamic Link Stack[t+3] = pc; // Return Address Stack[t+4] = base(Code[pc].p); // Static Link b = t + 1; // Base & Result pc = Code[pc].q - 1; break; int base(int L) { case OP_J: int c = b; pc = Code[pc].q - 1; while (L > 0) { break; c = Stack[c + 3]; } //switch L --; pc++; } }while(Exit == 0); return c; }//intepreter } 09/20/23 20
CÓ THỂ BẠN MUỐN DOWNLOAD
-
Bài giảng thực hành lập trình web 2 - Bài 1
9 p | 530 | 128
-
Hướng dẫn thực hành lập trình C trên Visual Studio
9 p | 1349 | 31
-
Bài giảng Kỹ thuật lập trình - Chương 3
16 p | 80 | 9
-
Bài giảng Thực hành chương 5: Cấu hình Group Policy để tự động map ổ đĩa mạng cho Client - Từ Thanh Trí
9 p | 110 | 9
-
Bài giảng Kỹ thuật lập trình - Hà Đại Dương, Nguyễn Mậu Uyên
200 p | 81 | 8
-
Bài giảng Thực hành chương 3: Tạo User Account & cấu hình Home Folder Cho User Account
12 p | 159 | 8
-
Bài giảng Hệ điều hành: Chapter 2 - ThS. Trần Thị Như Nguyệt
47 p | 30 | 6
-
Bài giảng Ngôn ngữ lập trình Pascal: Chương 6 - Thực hành Turbo Pascal
6 p | 133 | 6
-
Bài giảng Kiến trúc máy tính và hệ điều hành: Bài 5 - Nguyễn Hồng Sơn
29 p | 22 | 5
-
Bài giảng Hệ điều hành Linux - Bài 6: Quản lý tiến trình
15 p | 59 | 4
-
Bài giảng Thực hành cơ sở lập trình: Giới thiệu về IDE
18 p | 12 | 4
-
Bài giảng Thực hành chương trình dịch: Bài 3 - Phạm Đăng Hải
32 p | 21 | 4
-
Bài giảng Thực hành cơ sở lập trình: C Programming (Phần 1)
27 p | 11 | 4
-
Bài giảng Thực hành chương trình dịch: Bài 1 - Phạm Đăng Hải
13 p | 19 | 4
-
Bài giảng Thực hành chương 1: Cài đặt Windows Server 2003 - Từ Thanh Trí
12 p | 88 | 4
-
Bài giảng Thực hành chương trình dịch: Bài 4 - Phạm Đăng Hải
67 p | 17 | 3
-
Bài giảng Thực hành chương trình dịch: Bài 2 - Phạm Đăng Hải
20 p | 22 | 3
Chịu trách nhiệm nội dung:
Nguyễn Công Hà - Giám đốc Công ty TNHH TÀI LIỆU TRỰC TUYẾN VI NA
LIÊN HỆ
Địa chỉ: P402, 54A Nơ Trang Long, Phường 14, Q.Bình Thạnh, TP.HCM
Hotline: 093 303 0098
Email: support@tailieu.vn