- US E: chỉ có từ thế hệ 80386 và chỉ được dùng với chỉ dẫn hướng 386 use16 ASM 16 bit (default): Độ dài đoạn cực đại là 64Kbyte
Chương 6 Liên kết giữa ngôn ngữ assembly với các ngôn ngữ bậc cao
6.3.2. Viết tách biệt nhiều module trong Pascal
Tương tự như C, việc viết tách biệt các nhiều module trong Pascal cũng có nghĩa là chúng ta viết chương trình đa tệp, với các tệp Pascal và ASM riêng biệt.
Chúng ta cần giải quyết các vấn đề sau khi tiến hành viết tách biệt:
Vấn đề 1: phải khai báo public cho các biến, hàm dùng chung. Khi sử dụng phải khai báo extern:
• Các biến, hàm trong Pascal không cần khai báo public
• Các biến, hàm trong ASM phải khai báo public
• Các biến, hàm muốn được sử dụng lại, phải khai báo extrn trong ASM: extrn tên_biến: kiểu
• Các biến, hàm muốn được sử dụng lại, phải khai báo external trong pascal: procedure (function)(đối số):kiểu;external;
Như chúng ta đã biết, chương trình con near là chương trình con nằm cùng segment với chương trình chính, chương trình con far thì nằm khác segment với chương trình chính. Pascal quy ước:
• Các chương trình con được khai báo ở phần interface của Unit luôn là far
• Các chương trình con được khai báo trong chương trình được coi là near Song vì một lý do nào đó thì chương trình con cũng có thể yêu cầu far, để làm được điều này, ta cần dùng lệnh điều khiển {$F+} để quy ước với Pascal rằng các chương trình con được dịch với khai bào {$F+} sẽ là far. Để quay về quy ước ban đầu, ta dùng lệnh điều khiển {$F-}
Vấn đề 3: cần phải dùng lệnh điều khiển {$L tên_file_asm.obj} để báo cho chương trình dịch của pascal tìm đến tệp ASM có thể ghép nối với nó. Do đó sau khi viết chương trình asm song, ta tiến hành biên dịch thành file obj, viết file pascal và biên dịch chương trình pascal là được, không cần phải liên kết file bằng tay như với C.
Ví du: tương tự ví dụ trong phần viết tách biệt với ngôn ngữ C, ta có các module Pascal và ASM như sau:
var a:integer; {$F+} function tang:integer;external; {$L vd2[.obj]} {$F-} begin writeln('moi nhap '); readln(a); writeln(tang); readln end. Module ASM: .model large .data extrn a:word .code begin: public tang tang proc
mov ax,a inc ax ret
tang endp end begin