Hình 4.14. Chương trình tính tổng chuỗi số nguyên
Chương trình chúng ta xem xét ở đây phức tạp hơn ví dụ trước, mã chương trình
được thể hiện trên hình 4.14. Cũng như chương trình ở phía trên, chương trình này cũng bắt đầu bằng cặp lệnh giả .begin/.end và cũng sử dụng lệnh
.org để lưu mã lệnh vào bộ nhớ bắt đầu từ địa chỉ 2048. Biến a_start được tạo ra với giá trị mặc định là 3000
Chương trình bắt đầu bằng việc nạp độ dài của mảng a vào thanh ghi %r1, địa chỉ bắt đầu của mảng vào %r2 và xóa nội dung thanh ghi %r3 để làm nơi chứa tổng cần tính (bằng cách thực hiện phép toán AND từng bit với thanh ghi %r0) Vòng lặp loop sẽ thực hiện lần lượt cộng các thành phần của mảng vào tổng trong thanh ghi %r3. Vòng lặp loop bắt đầu bằng việc kiểm tra xem số phần tử
còn lại cần phải cộng vào tổng có phải là 0 hay không. Việc này được thực hiện bằng cách thực hiện phép toán AND giữa %r1 với chính nó. Nếu %r1 = 0 thì kết quả là 0, việc thực hiện phép cộng sẽ dừng lại vì chương trình nhảy đến nhãn done. Nếu %r1 khác 0 thì kết quả của phép AND cũng khác 0, chương trình thực hiện phép cộng.
Để thực hiện phép cộng, chương trình sẽ
- Tính lại số phần tử cần cộng vào tổng bằng cách trừ %r1 đi giá trị tương
ứng 1 phần tử (tức là cộng với -4). Có thể coi %r1 chính là địa chỉ tương
đối của mảng
- Xác định địa chỉ của phần tử cần cộng vào tổng tại vòng lặp đang xét và
đưa địa chỉ này vào thanh ghi %r4. Việc này được thực hiện bằng cách cộng địa chỉ tuyệt đối của mảng (%r2) với địa chỉ tương đối của mảng (%r1)
- Nạp phần tử mảng vào %r5
- Cộng phần tử vừa đọc được từ %r5 vào %r3 - Nhảy về nhãn loop
4.5. Truy cập dữ liệu bộ nhớ - Các chế độ địa chỉ
Bảng 4.1. dưới đây chỉ ra các chế độ địa chỉ sử dụng trong ARC. Các quy ước trong bảng này cũng rất phổ biến trong lập trình hợp ngữ. Ký hiệu M[x] có ý nghĩa dữ liệu được truy cập theo kiểu dữ liệu mảng với giá trị x được cho trong ngoặc là chỉ số địa chỉ được cho dưới kiểu byte là địa chỉ của phần tử trong mảng.
Chế độđịa chỉ Ký hiệu Ý nghĩa
Địa chỉ trực tiếp K M[k]
Địa chỉ gián tiếp (K) M[M[K]]
Địa chỉ thanh ghi (Rn) M[Rn]
Địa chỉ chỉ số thanh ghi (Rm+Rn) M[Rm+Rn]
Địa chỉ thanh ghi cơ sở (Rm+x) M[Rm+x]
Địa chỉ thanh ghi tương đối cơ sở chỉ số (Rm+Rn+x) M[Rm+Rn+x] Bảng 4.1. Các chế độđịa chỉ
• Chế độ địa chỉ tức thì cho phép truy xuất một hằng số trong một chu kỳ
máy
• Chế độ địa chỉ trực tiếp được sử dụng để truy cập dữ liệu với địa chỉ đã biết trước trong một chu kỳ máy
• Chế độ địa chỉ gián tiếp được sử dụng để truy cập vào một con trỏ của một biến mà đã biết địa chỉ của biến đó. Chế độ địa chỉ này hiếm khi
được sử dụng trong các vi xử lý hiện đại vì nó cần tham chiếu tới 2 ô nhớ để truy cập toán hạng. Lập trình viên khi sử dụng phương pháp truy cập này cần phải thực hiện bằng 2 lệnh, một để truy cập con trỏ và một lệnh khác để truy cập giá trị cần truy cập.
• Chế độ địa chỉ thanh ghi được sử dụng khi ta không biết địa chỉ của toán hạng cho đến khi máy thực hiện lệnh.
• Chế độ địa chỉ chỉ số thanh ghi, chế độ thanh ghi cơ sở và chế độ thanh ghi tương đối cơ sở chỉ số thường được sử dụng để truy cập vào các dữ
liệu kiểu mảng như ở ví dụ trong mục 4.4.b
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