Liên kết 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 82 - 84)

c, Liên kết thông qua stack

5.3.1. Liên kết chương trình

Để kết hợp các chương trình độc lập với nhau, chương trình kết nối cần phải

• Giải quyết vấn đề các địa chỉ ở các modul khác nhau phải được liên kết lại

• Xác định lại vị trí của các modul trong bộ nhớ bằng cách kết hợp. Trong suốt quá trình này, rất nhiều địa chỉ ở trong các modul phải được thay đổi tương ứng với chương trình mới được tạo ra

• Xem xét lại các biểu tượng được sử dụng trong các modul khác nhau

• Nếu các modul nằm trong các phân đoạn khác nhau, chương trình linker phải nhận diện và thâm nhập vào các phân đoạn khác nhau

Liên kết các địa ch các modul

Để giải quyết vấn đề địa chỉ của các biến và hằng số ở các modul khác nhau, chương trình liên kết cần phải phân biệt các biểu tượng ở các biến địa phương với các biểu tượng ở các biến toàn cục. Điều này được thực hiện bởi các lệnh giả .global và .extern. Lệnh giả .global sẽ gán cho các biểu tượng trong modul là các biến toàn cục và cho phép các modul khác truy cập. Lệnh giả

.extern chỉ ra rằng nhãn mà nó trỏ tới được sử dụng trong 1 modul nhưng lại

dụng trong modul mà các biểu tượng được định nghĩa ở đó còn lệnh giả

.extern được sử dụng ở những nơi mà các modul cần sử dụng các biến trong .global. Có một điều chú ý là địa chỉ các nhãn có thể là toàn cục hoặc là địa phương

Tất cả các nhãn được định nghĩa trong một chương trình nhưng sẽ sử dụng trong một chương trình khác, ví dụ như chương trình con sẽ được khai báo với cấu trúc

.global symbol1, symbol2,...

Tất cả các nhãn ở các modul địa phương, có cùng tên nhãn và được sử dụng trong lớn hơn một modul khác sẽđược khai báo

.extern symbol1, symbol2,...

Ví dụ dưới đây mô tả cách sử dụng của .global và .extern

Hình 5.6. Ví dụ minh họa về .global và .extern

Xác định li v trí các modul trong b nh

Trong ví dụ ở hình 5.6, ta thấy rằng cả 2 chương trình đều được bắt đầu ở cùng một địa chỉ là 2048, do vậy chúng không thể tồn tại ở cùng một thời điểm bởi nếu như vậy sẽ dẫn tới hiện tượng xung đột bộ nhớ. Để giải quyết vấn đề này các biểu tượng phải được đặt lại địa chỉ trong quá trình liên kết. Ý tưởng để giải quyết là chương trình thay vì biên dịch ở địa chỉ 2048 thì nó sẽ biên dịch ở địa chỉ 3000 chẳng hạn, và do đó độ lệch địa chỉ sẽ là 3000 – 2048 = 925. Việc này

sẽ được chương trình liên kết quản lý. Do đó sẽ không có một chương trình con nào được biên dịch ở cùng một địa chỉ so với chương trình chí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 82 - 84)