Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 33 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
33
Dung lượng
391 KB
Nội dung
Bài 12 Sinh mã đích Nội dung Tổng quan sinh mã đích Máy ngăn xếp Tổ chức nhớ Bộ lệnh Sinh mã cho lệnh Xây dựng bảng ký hiệu Biến Tham số Hàm, thủ tục chương trình Chương trình đích • Viết ngơn ngữ trung gian • Là dạng Assembly máy giả định (máy ảo) • Máy ảo làm việc với nhớ stack • Việc thực chương trình thơng qua interpreter • Interpreter mơ hành động máy ảo thực tập lệnh assembly Chương trình đích dịch từ • Mã nguồn • Mã trung gian Máy ngăn xếp Máy ngăn xếp hệ thống tính tốn Sử dụng ngăn xếp để lưu trữ kết trung gian q trình tính tốn Kiến trúc đơn giản Bộ lệnh đơn giản Máy ngăn xếp có hai vùng nhớ Khối lệnh: chứa mã thực thi chương trình Ngăn xếp: sử dụng để lưu trữ kết trung gian Máy ngăn xếp Code buffer PC Stack JMP RV INC DL LA 0,4 RA LC SL ST T B P1 P2 V1 V2 tmp1 T Máy ngăn xếp Thanh ghi PC (program counter): trỏ lệnh trỏ tới lệnh thực thi đệm chương trình B (base) : trỏ trỏ tới địa gốc vùng nhớ cục Các biến cục truy xuất gián tiếp qua trỏ T (top); trỏ tới đỉnh ngăn xếp Máy ngăn xếp Bản hoạt động (activation record/stack frame) Không gian nhớ cấp phát cho chương trình (hàm/thủ tục/chương trình chính) chúng kích hoạt Lưu giá trị tham số Lưu giá trị biến cục Lưu thông tin khác o Giá trị trả hàm – RV o Địa sở hoạt động chương trình gọi tới (caller) – DL o Địa lệnh quay kết thúc chương trình – RA o Địa sở hoạt động chương trình bao ngồi – SL Một chương trình có nhiều hoạt động Máy ngăn xếp Procedure P(I : integer); Var a : integer; Function Q; Var x : char; Begin … return End; Procedure R(X: integer); Var y : char; Begin … y = Q; … End; Begin … Call R(1); … RV DL RA SL Param I Local a … RV DL RA SL Param X Local y … RV DL RA SL Local x P frame R frame Q frame Máy ngăn xếp RV (return value): Lưu trữ giá trị trả cho hàm DL (dynamic link): Sử dụng để hồi phục ngữ cảnh chương trình gọi (caller) chương trình gọi (callee) kết thúc RA (return address): Sử dụng để tìm tới lệnh caller callee kết thúc SL (static link): Sử dụng để truy nhập biến phi cục 10 Lvalue case OBJ_VARIABLE: genVariableAddress(var); if (var->varAttrs->type->typeClass == TP_ARRAY) {varType = compileIndexes (var->varAttrs->type);} else varType = var->varAttrs->type; break; 19 Expression3 switch (lookAhead->tokenType) case SB_MINUS: { case SB_PLUS: eat(SB_MINUS); eat(SB_PLUS); checkIntType(argType1); checkIntType(argType1); argType2 = compileTerm(); argType2 = checkIntType(argType2); compileTerm(); genSB(); checkIntType(argType2); resultType = genAD(); resultType = compileExpression3(argType1); compileExpression3(argType1); break; break; 20 Term2 switch (lookAhead->tokenType) { case SB_TIMES: eat(SB_TIMES); checkIntType(argType1); argType2 = compileFactor(); checkIntType(argType2); genML(); resultType = compileTerm2(argType1); break; case SB_SLASH: eat(SB_SLASH); checkIntType(argType1); argType2 = compileFactor(); checkIntType(argType2); genDV(); resultType = compileTerm2(argType1); break; 21 Sinh mã lệnh if If condition Then statement; // đẩy giá trị điều kiện dk lên stack FJ L L: … If condition Then st1 Else st2; FJ L1 J L2 L1: L2: // đẩy giá trị điều kiện dk lên stack … 22 Sinh mã lệnh while While Do statement L1: FJ L2 J L1 L2: … 23 Sinh mã lệnh for For v := exp1 to exp2 statement CV // nhân đôi địa v ST // lưu giá trị đầu v L1: CV LI // lấy giá trị v LE FJ L2 CV;CV;LI;LC 1;AD;ST; // Tăng v lên J L1 L2: DCT … 24 Lấy địa chỉ/giá trị biến Khi lấy địa chỉ/giá trị biến cần tính đến phạm vi biến Biến cục lấy từ frame Biến phi cục lấy theo StaticLink với cấp độ lấy theo “độ sâu” phạm vi so với phạm vi biến computeNestedLevel(Scope* scope) 25 Lấy địa tham số hình thức • Khi LValue tham số • Cũng cần tính độ sâu biến • Nếu tham trị: địa cần lấy địa tham trị • Nếu tham biến: giá trị tham biến địa muốn truy nhập, địa cần lấy giá trị tham biến 26 Lấy giá trị tham số thực • Khi tính tốn giá trị Factor • Cũng cần tính độ sâu biến • Nếu tham trị: giá trị tham trị giá trị cần lấy • Nếu tham biến: giá trị tham số địa giá trị cần lấy 27 Lấy địa giá trị trả hàm Giá trị trả nằm offset frame Chỉ cần tính độ sâu giống với biến hay tham số hình thức 28 Sinh lời gọi hàm/thủ tục Lời gọi Hàm gặp sinh mã cho factor Thủ tục gặp sinh mã lệnh CallSt Trước sinh lời gọi hàm/thủ tục cần phải nạp giá trị cho tham số hình thức cách Tăng giá trị T lên (bỏ qua RV,DL,RA,SL) Sinh mã cho k tham số thực tế Giảm giá trị T + k Sinh lệnh CALL 29 Sinh mã cho lệnh CALL (p, q) CALL (p, q) s[t+2]:=b; // Lưu lại dynamic link s[t+3]:=pc; // Lưu lại return address s[t+4]:=base(p); // Lưu lại static link b:=t+1; // Base return value pc:=q; // địa lệnh Giả sử cần sinh lệnh CALL cho hàm/thủ tục A Lệnh CALL(p, q) có hai tham số: p: Độ sâu lệnh CALL, chứa static link Base(p) = base frame chương trình chứa khai báo A q: Địa lệnh q + = địa dãy lệnh cần thực gọi A 30 Hoạt động thực lệnh CALL(p, q) Điều khiển pc chuyển đến địa bắt đầu chương trình /* pc = p */ pc tăng thêm /* pc ++ */ Lệnh thông thường lệnh nhảy J để bỏ qua mã lệnh khai báo hàm/ thủ tục cục code buffer Lệnh lệnh INT tăng T kích thước frame để bỏ qua frame chứa vùng nhớ tham số biến cục 31 Hoạt động thực lệnh CALL(p, q) Thực lệnh stack biến đổi tương ứng Khi kết thúc Thủ tục (lệnh EP): toàn frame giải phóng, trỏ T đặt lên đỉnh frame cũ Hàm (lệnh EF): frame giải phóng, chừa giá trị trả offset 0, trỏ T đặt lên đầu frame thời (offset 0) 32 Sinh mã đích từ mã ba địa • Bộ sinh mã trung gian đưa mã ba địa • Tối ưu mã ba địa • Từ mã ba địa tối ưu sinh mã đích phù hợp với mô tả máy ảo 33