intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Bài giảng Thực hành chương trình dịch: Bài 5 - Phạm Đăng Hải

Chia sẻ: _ _ | Ngày: | Loại File: PPT | Số trang:66

27
lượt xem
4
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

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!

Chủ đề:
Lưu

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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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
  6. 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
  7. 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
  8. 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
  9. 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
  10. 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
  11. 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
  12. 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:=t­1; HL Halt Halt ST Store s[s[t­1]]:=s[t];  t:=t­2; s[t+2]:=b;  s[t+3]:=pc;    CALL Call s[t+4]:=base(p);  b:=t+1;  pc:=q; Exit  EP t:=b­1;  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
  13. 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:=t­1; Write  WRI write integer from s[t];  t:=t­1; Integer WLN New Line CR & LF 09/20/23 13
  14. Máy ngăn xếp Bộ lệnh (4/5) op p q AD Add t:=t­1;  s[t]:=s[t]+s[t+1]; SB Subtract t:=t­1;  s[t]:=s[t]­s[t+1]; ML Multiply t:=t­1;  s[t]:=s[t]*s[t+1]; DV Divide t:=t­1;  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
  15. Máy ngăn xếp Bộ lệnh (5/5) op p q t:=t­1;    if  s[t]  =  s[t+1]  then  EQ Equal s[t]:=1 else s[t]:=0; t:=t­1;    if  s[t]  !=  s[t+1]  then  NE Not Equal s[t]:=1 else s[t]:=0; Greater  t:=t­1;    if  s[t]  >  s[t+1]  then  GT Than s[t]:=1 else s[t]:=0; t:=t­1;    if  s[t]  =  s[t+1]  then  GE Equal s[t]:=1 else s[t]:=0; Less or  t:=t­1;    if  s[t] 
  16. 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
  17. 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
  18. 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
  19. 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
  20. 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
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2