Luồng chương trình

Một phần của tài liệu Bài giảng: Cấu trúc máy tính và ghép nối pot (Trang 73 - 76)

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

Lnh nhy r nhánh không điu kin 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

Cu 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: Cu trúc vòng lp 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

Cu 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

Cu trúc vòng lp 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

Một phần của tài liệu Bài giảng: Cấu trúc máy tính và ghép nối pot (Trang 73 - 76)