
Sinh mã trung gian
Nguyễn Phương Thái
2009

Mục tiêu
Sinh mã trung gian có những ưu điểm như
sau:
•Dễ thiết kế từng phần
•Sinh được mã độc lập với từng máy tính
cụ thể. Từ đó làm giảm độ phức tạp của
sinh mã thực sự.
•Dễ tối ưu mã

Mã ba địa chỉ
•Các câu lệnh gán có dạng x := y op z, trong đó op là một phép toán số học hai ngôi hoặc
phép toán logic.
•Các phép gán có dạng x := op y, trong đó op là phép toán một ngôi. Các phép toán một ngôi
chủ yếu là phép trừ, phép phủ định logic, phép chuyển đổi kiểu, phép dịch bít.
•Các câu lệnh sao chép dạng x := y, gán y vào x.
•Lệnh nhảy không điều kiện goto L. Câu lệnh ba địa chỉ có nhãn L là câu lệnh được thực hiện
tiếp theo.
•Các lệnh nhảy có điều kiện như if x relop y goto L. Câu lệnh này thực hiện một phép toán
quan hệ cho x và y, thực hiện câu lệnh có nhãn L nếu quan hệ này là đúng, nếu trái lại sẽ
thực hiện câu lệnh tiếp theo.
•Câu lệnh param x và call p,n dùng để gọi thủ tục. Còn lệnh return y để trả về một giá trị lưu
trong y. Ví dụ để gọi thủ tục p(x1,x2,...,xn) thì sẽ sinh các câu lệnh ba địa chỉ tương ứng như
sau:
•param x1
•param x2
•. . .
•param xn
•call p, n
•Các phép gán chỉ số có dạng
•x := y[i] có ý nghĩa là gán cho x giá trị tại vị trí i sau y
•tương tự đối với x[i] := y

Cú pháp điều khiển
sinh mã 3 địa chỉ
•Đối với mỗi ký hiệu X, chúng ta ký hiệu:
•X.place là nơi để chứa mã ba địa chỉ sinh
ra bởi X (dùng để chứa các kết quả trng
gian). Vì thế sẽ có một hàm định nghĩa là
newtemp dùng để sinh ra một biến trung
gian (biến tạm) để gán cho X.place.
•X.code chứa đoạn mã ba địa chỉ của X
•thủ tục gen để sinh ra câu lệnh ba địa chỉ.

Biểu thức số học
“x := a + ( b * c )”
S n xu tả ấ Lu t ng nghĩaậ ữ
S -> id := E
E -> E1 + E2
E -> E1 * E2
E -> - E1
E -> ( E1 )
E -> id