Chương trình đích tiếp Mã thông dịch: Chuỗi hoạt động của nó được biểu diễn không phải bằng các chỉ thị lệnh máy hoạt động trực tiếp mà bằng các câu lệnh thông dịch trừu tượng ở một
Trang 1Nguyễn Phương Thái
Bộ môn Khoa học Máy tính http://www.coltech.vnu.vn/~thainp/
Trang 2Nội dung
Chương trình đích
Máy tính ảo
Sinh mã
Trang 3Chương trình đích
Ngôn ngữ máy tuyệt đối:
Có thể được đặt trong một vị trí cố định của bộ nhớ và thực thi ngay được
Ưu điểm: Chương trình nhỏ và chạy nhanh.
Ngôn ngữ máy định vị:
Cho phép biên dịch riêng rẽ các chương trình con, sau
đó được liên kết lại với nhau và được tải vào để thực thi nhờ một công cụ tải và liên kết (linking loader)
Ưu điểm: Các môđun chương trình độc lập và có dịch độc lập, sau đó kết hợp với nhau thành một chương
trình đối tượng hoàn chỉnh nhờ việc liên kết và nạp
Trang 4Chương trình đích (tiếp)
Mã thông dịch:
Chuỗi hoạt động của nó được biểu diễn không phải bằng các chỉ thị lệnh máy hoạt động trực tiếp mà bằng các câu lệnh thông dịch trừu tượng ở một dạng mã hoá nào đó
Chương trình biên dịch trong trường hợp này sẽ chuyển
chương trình nguồn thành một chương trình với các lệnh ảo này
Chương trình đích này sau đó sẽ được hoạt động nhờ vào một chương trình thông dịch
Ưu điểm: Dễ viết chương trình dịch, có thể chạy trên nhiều nền tảng phần cứng và hệ điều hành
Nhược điểm: Chậm hơn mã máy tuyệt đối nhiều lần
Trang 6Máy tính ảo
Tên gọi: VIM
Chỉ có hai thanh ghi cùng với bộ nhớ và ngăn xếp
Bộ nhớ chương trình và bộ nhớ dữ liệu nằm tách rời nhau
Mọi chỉ thị chiếm một ô trong bộ nhớ chương trình chương trình (địa chỉ các ô lệnh này là các số tự nhiên)
Một thanh ghi là con trỏ chỉ thị ic có chứa địa chỉ của lệnh sẽ
được thực hiện Đỉnh ngăn xếp được chỉ bằng thanh ghi thứ hai sp.
Trang 7Máy tính ảo (tiếp)
Cấu trúc máy tính VIM bao gồm hai thanh ghi ic, sp và bộ nhớ chia thành ba vùng ngăn xếp (stack), bộ nhớ dữ liệu (data), bộ nhớ chương trình (prog)
stack data prog sp
ic
Trang 8Máy tính ảo (tiếp)
Các chỉ thị bao gồm một toán tử và nhiều nhất một tham số (có thể là một số hoặc một địa chỉ trong bộ nhớ chương trình hoặc
dữ liệu)
Các toán tử số học và quan hệ không có tham số Chúng thực hiện trên một hoặc hai giá trị (toán hạng) đang nằm trên đỉnh ngăn xếp số học (gọi tắt là ngăn xếp) Các toán hạng này sẽ được thay thế bằng kết quả thu được nhờ áp dụng phép toán cho các toán hạng đó.
Trang 9Máy tính ảo (tiếp)
Các chỉ thị nạp (load) và lưu (store), nhẩy (jump) đều có một tham số
Lệnh nạp: sao chép dữ liệu của một biến nằm trong bộ nhớ dữ liệu vào đỉnh của ngăn xếp
Lệnh lưu: loại bỏ giá trị trên đỉnh của ngăn xếp và đưa nó vào bộ nhớ dữ liệu
Các chỉ thị vào ra: không có tham số, lệnh vào đọc một giá trị từ bàn phím và lưu nó vào trong ngăn xếp, lệnh ra loại bỏ giá trị đang ở đỉnh ngăn xếp và ghi nó ra màn hình
Trang 10Máy tính ảo (tiếp)
câu lệnh trong ngôn ngữ nguồn SLANG “a := b + c” , với a, b là biến
Trang 11 Giả sử giá trị b và c ban đầu là 37 và 2 thì quá trình thực hiện trên ngăn xếp như sau:
Trang 12Máy tính ảo (tiếp)
Các chỉ thị lệnh của máy đích chia thành các loại:
load and store
các chỉ thị số học và logic
các chỉ thị so sánh
chỉ thị không có điều kiện
các chỉ thị nhảy có điều kiện
các chỉ thị vào ra
Trang 13Máy tính ảo (tiếp)
chỉ thị Nạp và Lưu
ldcon intval nạp giá trị số nguyên intval vào ngăn xếp
ldvar address sao chép giá trị số nguyên từ địa chỉ bộ nhớ address vào
ngăn xếp
stvar address loại bỏ giá trị số nguyên ở đỉnh ngăn xếp và ghi nó vào
địa chỉ bộ nhớ address
chỉ thị Phép toán số học hai ngôi
add cộng hai số nguyên
sub trừ hai số nguyên
mul nhân hai số nguyên
Trang 14Máy tính ảo (tiếp)
dvi lấy thương của hai số nguyên
mdl lấy phần dư của hai số nguyên
chỉ thị Phép toán số học một ngôi neg lưu giá trị số nguyên dạng –intval vào ngăn xếp
abs lưu giá trị tuyệt đối của intval vào ngăn xếp
Trang 15Máy tính ảo (tiếp)
chỉ thị Nhảy
jump address nhảy tới địa chỉ address mà không cần điều kiện
jift address loại bỏ giá trị chân lý (gọi là truthval) ra khỏi ngăn xếp; nếu giá trị dó
là true thì nhảy tới địa chỉ address, còn nếu trái lại thì chỉ thị tiếp theo
sẽ được thực hiện
jiff address loại bỏ giá trị chân lý (gọi là truthval) ra khỏi ngăn xếp; nếu giá trị dó
là false thì nhảy tới địa chỉ address, còn nếu trái lại thì chỉ thị tiếp theo
sẽ được thực hiện
chỉ thị Vào ra rdint đọc một giá trị số nguyên từ bàn phím và lưu nó vào ngăn xếp
wrint loại giá trị nằm trên đỉnh ngăn xếp và ghi nó ra màn hình
các chỉ thị khác half dừng việc thực hiện
Trang 16Một bộ sinh mã đơn giản
Giả sử máy đích của chúng ta có các đặc điểm sau:
đánh địa chỉ theo byte với bốn byte cho một từ nhớ
Trang 17Yêu cầu
Thiết kế một bộ sinh mã để sinh ra mã đích cho một dãy câu lệnh
ba địa chỉ
Để đơn giản, chúng ta giả sử rằng:
Mỗi toán tử trong một câu lệnh sẽ có một toán tử tương ứng trong ngôn ngữ đích
Kết quả tính được có thể để lại trong thanh ghi càng lâu càng tốt
Trang 20Bản diễn tả thông tin thanh ghi
và địa chỉ Bản diễn tả thông tin thanh ghi (register descriptor)
theo dõi xem mỗi thanh ghi hiện đang chứa giá trị nào
được tham vấn mỗi khi cần đến một thanh ghi mới
ban đầu bản diễn tả thông tin thanh ghi cho biết mọi thanh ghi đều rỗng (chưa chứa thông tin) Khi tiến hành sinh mã, mỗi thanh ghi sẽ giữ giá trị của không hoặc nhiều tên tại một thời điểm đã cho
Bản diễn tả địa chỉ (address descriptor)
theo dõi vị trị (hoặc các vị trí) có thể tìm được giá trị hiện tại của tên (vị trí có thể là một thanh ghi, một vị trí ngăn xếp, một địa chỉ bộ nhớ hoặc một tập các vị trí này)
thông tin này có thể được cất trong bảng ký hiệu và được
dùng để xác định phương pháp truy xuất cho một tên
Trang 21Thuật toán sinh mã
Thuật toán sinh mã nhận đầu vào là một dãy câu lệnh ba địa chỉ cấu tạo nên một khối cơ bản Với mỗi câu lệnh ba địa chỉ có dạng x := y op z chúng ta thực hiện các hành động sau:
kích hoạt một hàm getreg để xác định vị trí L, nơi sẽ cất kết quả tính toán y op
z với L thường là một thanh ghi, nhưng cũng có thể là một vị trí bộ nhớ.
tham vấn bản diễn tả thông tin địa chỉ của y để xác định y’, là một trong các vị trí của y Ưu tiên chọn thanh ghi cho y’ nếu giá trị của y ở cả trong bộ nhớ và thanh ghi Nếu giá trị của y không có trong L, sinh chỉ thị lệnh MOV y’,L để đặt một bản sao của y vào L.
sinh chỉ thị lệnh OP z’, L với z’ là vị trí hiện tại của z Một lần nữa chúng ta ưu tiên chọn một thanh ghi hơn là bộ nhớ nếu z có ở cả hai nơi Cập nhật bản diễn tả thông tin địa chỉ của x để chỉ ra rằng x nằm ở L Nếu L là thanh ghi, cập nhật bản diễn tả thông tin thanh ghi để chỉ ra rằng nó chứa giá trị của x, và xoá
x ra khỏi tất cả các bản tả thông tin thanh ghi.
nếu giá trị hiện tại của y hoặc z không có lần dùng kế tiếp, không còn sống sau
khi thoát khỏi khối và nằm trong thanh ghi, sửa lại bản diễn tả thông tin thanh
ghi để chỉ ra rằng sau khi thực thi x := y op z, những thanh ghi này không còn chứa y và z.
Trang 22Hàm getreg
Hàm getreg trả về vị trí L để giữ giá trị của x cho câu lệnh gán
x := y op z
khi thực hiện phép toán x := y op z thì vị trí L chính là thanh ghi chứa giá trị của y
lệnh, chúng ta tìm một thanh ghi R đang bị chiếm Cất giá trị của R vào một vị trí bộ nhớ bằng chỉ thị MOV R,M Cập nhật bản diễn tả thông tin địa chỉ cho M và gán vị trí L chính là R Chú ý trong
trường hợp R giữ giá trị của nhiều biến, chúng ta cần sinh một chỉ
thị MOV cho mỗi biến cần được lưu.
thích hợp, chọn vị trí bộ nhớ của x làm L
Trang 23Ví dụ
Ví dụ: câu lệnh “d := (a-b)+(a-c)+(a-c)” có thể được dịch thành dãy
mã ba địa chỉ như sau:
t1 := a – b
t2 := a – c
t3 := t1 + t2
d := t3 + t2
Trang 24R1 chứa t2
t3 trong R0t2 trong R1
d := t3 + t2 ADD R1,R0
MOV R0,d
R0 chứa d d trong R0
Trang 25Sinh mã cho các câu lệnh điều kiện
Các máy cài đặt các lệnh nhảy có điều kiện bằng một trong hai cách:
Cách 1: rẽ nhánh nếu giá trị của một thanh ghi đã chỉ định
thoả một trong sáu điều kiện: âm, không âm, dương, không
dương, bằng không, khác không Ví dụ: câu lệnh ba địa chỉ if
x<y goto z có thể được cài đặt bằng cách trừ y cho x trong
thanh ghi R rồi nhảy đến z nếu giá trị trong thanh ghi R âm.
Cách 2 (khá thông dụng): dùng một tập các mã điều kiện để
chỉ ra xem đại lượng cuối cùng được tính hoặc được tải
vào một thanh ghi là âm, bằng không hoặc dương Ví dụ:
dùng chỉ thị lệnh CMP x, y đặt mã điều kiện là dương, âm
hoặc bằng không tương ứng với x>y, x<y hoặc x=y
Trang 26CJ= z nhảy đến z nếu mã điều kiện là =0
CJ<> z nhảy đến z nếu mã điều kiện là <>0