c, Liên kết thông qua stack
5.1.3. Biên dịch các nhóm lệnh sang hợp ngữ
Trong phần này, chúng ta sẽ nghiên cứu kỹ hơn vấn đề chuyển 3 nhóm lệnh: nhóm lệnh dịch chuyển dữ liệu, nhóm lệnh toán học, và nhóm lệnh điều khiển luồng chương trình từ ngôn ngữ bậc cao sang hợp ngữ. Trong ví dụ dưới đây, chúng tôi sẽ sử dụng ngôn ngữ lập trình C để mô tả quá trình này bởi vì ngôn ngữ C rất phổ biến, thông dụng, cấu trúc câu lệnh cũng như ý nghĩa của câu
lệnh rất gần gũi với đời sống hàng ngày làm cho người không biết về ngôn ngữ
C cũng có thể tạm hiểu được vấn đề. Trước khi tìm hiểu về 3 nhóm lệnh trên, chúng ta sẽ nghiên cứu trước 1 vấn đề chung, đó là việc lưu trữ các biến trong bộ nhớ máy tính
Trong các ví dụ phía trên trong tài liệu này, chúng ta luôn sử dụng các biến
được truy xuất trực tiếp thông qua tên biến, tức là nó đã được định nghĩa tại vùng nhớ xác định trong bộ nhớ và nó sẽ được truy xuất ngay tại thời điểm thực thi câu lệnh liên quan đến nó. Ví dụ như trong lệnh A = B + 4 ở trên, các biến A và B được định nghĩa trước khi câu lệnh đó được thực hiện. Thực tế, chỉ có toàn cục global variable hay là biến static variable trong C mới được truy xuất ngay tại thời điểm thực thi. Những biến được khai báo và sử dụng trong các hàm hoặc khối hàm lại hoàn toàn khác, nó chỉ tồn tại khi hàm đó hoặc khối hàm
đó được truy cập, các biến đó sẽ mất đi khi hàm hoặc khối hàm kết thúc truy câp. Các biến này được gọi là các biến địa phương local hoặc trong C có tên là automatic variable. Trong các chương trình, các biến địa phương được sử dụng thông dụng hơn rất nhiều so với biến toàn cục
Vì bản chất không được sử dụng bền vững của biến địa phương, để thực hiện việc quản lý chúng, ta có thể sử dụng phương pháp last-in-first-out giống như stack được mô tả trong chương 4. Các biến được lưu trong stack (bản chất vẫn là lưu trong bộ nhớ) và sẽ được sử dụng khi hàm được gọi tới. Khi kết thúc hàm, các biến sẽ được stack xóa đi. Trong chương trước, chúng ta đã biết hệ
thống ARC sử dụng thanh ghi con trỏ%spđể truy cập vào stack. Thực tế, người ta hay sử dụng phương pháp copy nội dung của %sp vào một thanh ghi khác để
sử dụng, đó là thanh ghi frame pointer %fp (thanh ghi này có thể được hiểu là thanh ghi cơ sở).Lúc đó, ta sẽ truy cập %fp để sử dụng trong hàm như là một biến. Ta phải làm như thế vì stack ngoài việc lưu trữ các biến địa phương, nó còn phải lưu trữ các biến tạm thời hoặc các giá trị trung gian trong quá trình tính toán. Ngoài việc sử dụng trực tiếp %fp, ta cũng có thể sử dụng các ô nhớ offset xung quanh [%fp + n]. Ví dụ nếu ta muốn nạp một biến được lưu tại byte số
12 phía trước %fp vào thanh ghi %r1, ta có thể sử dụng 1 trong 2 câu lệnh sau ld %fp, -12, %r1