Truyền tham số

Một phần của tài liệu Lập trình hệ thống và điều khiển thiết bị (Trang 43 - 44)

Đây là phần rất quan trọng khi chương trình được thiết kế thành các chương trình con. Chúng được “giao tiếp” với nhau một cách trong suôt, lô gic trong quá trình thực hiện các chức năng của mình để tăng thêm tính tái sử dụng- một tính chất quan trọng của chương trình con. Dữ

liệu phải được trao đổi từ chương trình gọi và chương trình con được gọi. Trong các ngôn ngữ

bậc cao khác, cấu trúc chương trình con cho phép người lập trình khai báo danh sách tham số. Tuy nhiên, như ta thấy cấu trúc của một chương trình con hợp ngữ ta không thấy đi kèm với một danh sách tham số. Dưới đây ta sẽ xem xét tất cảc các vấn đề liên quan đến việc truyền tham số.

a. Truyền giá trị tham số từ chương trình gọi sang chương trình được gọi

- Truyền tham số thông qua các thanh ghi: đây là cách thức đơn giản và dễ thực hiện nhất, thường được sử dụng đối với các chương trình được viết thuần túy bằng hợp ngữ. Để thực hiện cách truyền tham số này ta chỉ cần đặt một giá trị nào đó vào thanh ghi ở chương trình gọi và sau đó chương trình con được gọi sẽ sử dụng giá trịở thanh ghi này.

- Truyền tham số thông qua các biến toàn cục: các biến toàn cục được khai báo trong chưong trình chính có tác dụng trong toàn bộ chương trình (cả chương trình chính và các chương trình con). Vì vậy ta có thể dùng nó để truyền giá trị giữa chưong trình chính và các chương trình con. Cách này khá phổ biến khi ta viết chương trình thuần túy bằng hợp ngữ hoặc phát triển chương trình hỗn hợp bằng hợp ngữ và các ngôn ngữ bậc cao khác.

- Truyền tham số thông qua ngăn xếp: đây là phương pháp khá phức tạp. Tuy nhiên, cách này được sử dụng rất nhiều khi ta viết các module bằng hợp ngữ và các ngôn ngữ bậc cao khác rồi cho chúng liên kết (link) với nhau trong quá trình thực hiện. Cách này sẽ được đề cập chi tiết ở phần sau: kết nối chương trình hợp ngữ với các chương trình ngôn ngữ bậc cao.

b. Truyền giá trị tham số từ chương trình được gọi lên chương trình gọi

- Truyền tham số từ chương trình được gọi (chương trình con) lên chương trình gọi (chương trình chính) cũng theo ba cách: thông qua các thanh ghi, biến toàn cục và ngăn xếp. Trong trường hợp liên kết với ngôn ngữ bậc cao thì chương trình con được gọi (được viết bằng hợp ngữ) có thể chuyển giá trị lên chương trình gọi (được viết bằng ngôn ngữ bậc cao) bằng giá trị trả về (returned value). Để làm được điều này trong hợp ngữ thì giá trị trả về của chương trình con được gọi phải tuân thủ các qui cách sau:

+ Nếu giá trị trả về (tên hàm mang giá trị trả về) là 8 bít hoặc 16 bít thì giá trịđó phải được đặt vào thanh ghi AX của hàm trước khi quay về chương trình gọi nó.

+ Nếu giá trị trả về (tên hàm mang giá trị trả về) là 32 bít thì giá trịđó phải được

- Lưu ý rằng số lượng các thanh ghi của máy tính là có hạn, nên ta không nên dùng quá nhiều thanh ghi cho việc chuyển giao các tham số.

c. Vấn đề bảo vệ các thanh ghi

Khác với lập trình với các ngôn ngữ bậc cao, khi lập trình hợp ngữ người lập trình hợp ngữ

còn phải để ý đến việc bảo vệ các thanh ghi trong quá trình gọi các chương trình con. Ở các ngôn ngữ bậc cao, chương trình con không làm thay đổi giá trị của các biến của chương trình chính trừ

khi ta chủ tâm làm việc đó. Trong các chương trình được viết bằng hợp ngũ thì ngược lại là rất hay xảy ra trường hợp là các giá trị của các biến trong chương trình chính được nạp vào các thanh ghi mà trong khi đó chương trình con cũng cần các thanh ghi này để thực hiện một công việc nào

đó. Và như vậy thì chương trình con khi sử dụng thanh ghi có thể sẽ xóa giá trị trong thanh ghi mà chương trình chính đã đặt vào đó để sử về sau. Do vậy các giá trị đã được lưu vào trong thanh ghi cần phải được bảo vệ khi cần thiết. Có hai cách người ta hay dùng là:

- Sử dụng các lệnh PUSH và POP: Khi bắt đâu một chương trình con, ta nên tiến hành lưu các giá trị của các thanh ghi mà chương trình con sẽ dùng đến vào ngăn xếp nhờ

lệnh PUSH và trước khi ra khỏi chương trình con ta phải phục hồi lại các giá trị của các thanh ghi đó từ ngăn xếp nhờ lệnh POP.

- Sử dụng theo một qui ước nhất quán (code convension): qui định sử dụng một số

thanh ghi sử dụng cho chương trình chính và tất cả các chương trình con không được sử dụng đến các thanh ghi đó.

Một phần của tài liệu Lập trình hệ thống và điều khiển thiết bị (Trang 43 - 44)