CHƯƠNG 4: NGÔN NGỮ MÁY VÀ HỢP NGỮ
4.6. Các mối liên kết chương trình con và stack
Chương trình con hay còn có tên gọi là hàm (function) hay thủ tục (procedure) bản chất là một chuỗi các câu lệnh được đại diện bởi một tên gọi ở một cấp lập trình cao hơn. Khi một chương trình gọi chương trình con, chương trình sẽ chuyển quyền điều khiển từ chương trình chính sang chương trình con để chương trình con thực hiện các lệnh của nó. Khi các lệnh của chương trình con đã thực hiện xong, chương trình con chuyển ngược quyền điều khiển trở về chương trình đã gọi tới nó. Việc thực hiện liên kết giữa chương trình chính và chương trình con có thể được thực hiện bởi một trong những phương pháp sau a, Liên kết thông qua thanh ghi
Hình 4.15. Liên kết chương trình con qua thanh ghi
Trong chương trình trên, 2 đối số sẽ được nạp vào 2 thanh ghi %r1 và %r2, sau đó chương trình con add_1 sẽ được gọi và kết quả được trả ngược lại thanh ghi
%r3. Chương trình con add_1 sẽ nhận toán hạng thông qua 2 thanh ghi %r1 và %r2 và trả kết quả vào %r3 trước khi quay trở về chương trình chính thông qua lệnh jmpl. Phương pháp này hoạt động nhanh và đơn giản, nhưng nó không thể áp dụng trong trường hợp số lượng các đối số lớn hơn số lượng các thanh ghi có thể sử dụng hoặc trong trường hợp các chương trình con lồng vào nhau
b, Liên kết thông qua dữ liệu
Trong phương pháp liên kết thông qua dữ liệu, địa chỉ của dữ liệu liên kết sẽ được nạp từ thanh ghi. Như trên hình 4.16. lệnh giả .dwb trong chương trình chính sẽ tạo ra một vùng dữ liệu liên kết gồm 3 từ, địa chỉ là x, x + 4 và x + 8.
Trước khi gọi chương trình con, chương trình chính nạp 2 toán tử vào x và x +4.
Chương trình con sẽ lưu kết quả mà nó xử lý vào vùng nhớ x + 8. Để xem xét kỹ hơn về ví dụ này, ta sẽ phân tích từng bước mà chương trình đã thực hiện
• Chương trình lưu nội dung của thanh ghi %r1 và %r2 vào x và x + 4
• Nạp giá trị x vào 22 bit cao của thanh ghi %r5
• Dịch sang trái %r5 10 bit, điều này đồng nghĩa với việc chuyển toàn bộ giá trị địa chi x vào %r5
Hình 4.16. Liên kết thông qua dữ liệu
• Gọi chương trình add_2 để thực hiện các lệnh sau o Nạp %r5 vào %r8, tức là nạp x vào %r8 o Nạp %r5 + 4 vào %r9 tức là x + 4 vào %r9 o Tính tổng và đưa kết quả vào %r10
o Lưu kết quả vào %r5 + 8 tức x + 8 o Quay về chương trình chính
• Lưu kết quả từ x+ 8 vào %r3 c, Liên kết thông qua stack
Hình 4.17.Liên kết dữ liệu thông qua stack
Phương pháp liên kết chương trình con thứ 3 là liên kết thông qua stack. Về mặt bản chất, phương pháp này không khác lắm so với liên kết dữ liệu thông qua bộ nhớ. Với phương pháp này, ta cũng khai báo một vùng nhớ trong bộ nhớ để làm
stack và sử dụng bình thường. Điểm khác biệt giữa phương pháp này và phương pháp liên kết thông qua bộ nhớ là truy xuất các ô nhớ liên tiếp trong stack thì giảm dần còn các ô nhớ liên tiếp trong bộ nhớ thì truy xuất tăng dần. Ta phân tích ví dụ trong hình 4.17
• Khai báo stack (thanh ghi %r14 luôn luôn chứa địa chỉ của stack)
• Xác định địa chỉ của phần đỉnh stack bằng cách trừ đáy stack đi 4
• Lưu giá trị %r1 vào đỉnh stack vừa xác định
• Tiếp tục xác định địa chỉ đỉnh stack
• Lưu giá trị %r2 vào đỉnh stack vừa xác định
• Gọi chương trình add_3 để thực hiện các nội dung sau o Xác định đỉnh stack
o Nạp giá trị đỉnh stack vào %r8, tức là nạp %r2 vào %r8 o Tăng giá trị stack
o Nạp đỉnh stack vào %r9 tức là nạp %r1 vào %r9 o Tính tổng và đưa vào %r10
o Lưu vào stack
o Quay về chương trình chính
• Trả kết quả từ stack vào %r3
Phương pháp liên kết thông qua stack được sử dụng rất phổ biến bởi vì phương pháp này có thể được sử dụng trong mọi trường hợp, kể cả trong trường hợp gọi các chương trình con lồng vào nhau. Phương pháp liên kết này được áp dụng rất rộng rãi cả trong ngôn ngữ lập trình bậc cao như ngôn ngữ C.
Trong ví dụ trong hình 4.18, hai chương trình con là func_1 và func_2 sử dụng các toán hạng được chương trình chính khai báo giá trị và lưu vào trong stack trước khi thực hiện chương trình con thông qua dấu ngoặc đơn.
Với chương trình con func_1 và func_2, sau khi tính toán các giá trị, kết quả được lưu vào stack thông qua lệnh return. Kết quả này sẽ được bảo lưu trong stack và được gán vào các biến w và z tương ứng trong chương trình chính
Hình 4.18. Liên kết chương trình thông qua stack trong ngôn ngữ bậc cao C