c, Liên kết thông qua stack
5.1.6. Luồng chương trình
Để điều khiển luông chương trình, tất cả các ngôn ngữ lập trình đều sử dụng các lệnh rẽ nhánh có điều kiện hoặc không có điều kiện, kết hợp với việc sử dụng các cờ flags thông báo trạng thái. Trong phần này, chúng ta sẽ nghiên cứu việc biên dịch việc điều khiển luồng chương trình thông dụng
Lệnh nhảy rẽ nhánh không điều kiện goto
Đây là dạng rẽ nhánh đơn giản nhất, lệnh nhảy goto label. Câu lệnh ngôn ngữ bậc cao này được thực hiện một cách đơn giản trong ARC bằng lệnh
ba label
Cấu trúc rẽ nhánh if-then-else
Trong ngôn ngữ C, cấu trúc if-then-else có cấu trúc If (expr) stmt1 else stmt2;
Hoạt động của cấu trúc như sau. Nếu mệnh đề expr có giá trị là true, hành
động stmt1 sẽ được thực thi, nếu không thì hành động stmt2 sẽ được thực thi. Do đó, trình biên dịch phải đánh giá được giá trị của expr và thực hiện một trong hai hành động phụ thuộc vào expr. Giả sử điều kiện expr được mô tả
rất đơn giản là kiểm tra nội dung của 2 thanh ghi %r1==%r2. Khi đó cấu trúc này được thể hiện bởi các lệnh sau
Bne Hdong2 ! Nếu %r1 khác %r2 thì nhảy đến hdong2 ... ! Các lệnh thuộc hành động 1 Ba ketthuc Hdong2: ... ! Các lệnh thuộc hành động 2 Ketthuc: Cấu trúc vòng lặp while
Trong ngôn ngữ C, cấu trúc này được thể hiện While (expr) stmt;
Cấu trúc này có nghĩa là nếu mệnh đề expr là true thì hành động stmt sẽ được thực hiện. Quá trình này sẽ được lặp đi lặp lại cho đến khi mệnh đề expr chuyển sang false. Để việc tìm hiểu về cấu trúc này đơn giản hơn, ta xem xét một ví dụ là tính tổng của 10 số lẻ liên tiếp bắt đầu từ số 5. Nếu viết bằng ngôn ngữ “giả C”, đoạn chương trình này sẽ là
%r1=5; %r2=10; %r3=0; %r4=0; While (%r2!=%r3) { %r4=%r4+%r1 ; %r1=%r1+2; %r3=%r3+1; }
Trình biên dịch sẽ chuyển sang hợp ngữ thành đoạn chương trình tương ứng như sau
Ld %r0, 5, %r1 Ld %r0, 10, %r10
Andcc %r3, %r0, %r3 Andcc %r4, %r0,%r4 Ba kiemtra True: add %r4, %r1, %r4 Add %r1, 2, %r1 Add %r3, 1, %r3 Kiemtra: subcc %r2, %r3, %r0 Bneg True
Việc đặt mệnh đề kiểm tra expr ở trên hay ở dưới hành động stmt tùy thuộc vào lập trình viên. Người đọc có thể tự kiểm tra. Tác giả khuyến khích đặt mệnh
đề kiểm tra ở dưới (như ví dụ trên) vì cách làm này có hiệu quả hơn nếu ta đặt mệnh đề kiểm tra ở trên
Cấu trúc do-while
Cấu trúc do-while được mô tả trong C như sau Do stmt while (expr)
Đây chỉ là cách biểu diễn khác của cấu trúc while ngoại trừ việc kiểm tra điều kiện sẽ được thực hiện sau khi hành động stmt được thực hiện tại chu kỳ đầu tiên. Việc biên dịch cấu trúc này cũng được thực hiện tương tự như cấu trúc while nhưng ta phải có biện pháp để loại bỏảnh hưởng của lệnh bađầu tiên
Cấu trúc vòng lặp for
Trong C, cấu trúc này được biểu diễn bởi
For (expr1; expr2; expr3) stmt; Cấu trúc này có hiệu ứng hoàn toàn tương đương với
Expr1;
While (expr2) { stmt; Expr3; }
Do đó, việc biên dịch cấu trúc này được thực hiện bằng cách kết hợp các cấu trúc trên