Viết tách biệt nhiều module trong C

Một phần của tài liệu Giáo trình assembly pot (Trang 84 - 86)

- 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

6.2.2.Viết tách biệt nhiều module trong C

Chương 6 Liên kết giữa ngôn ngữ assembly với các ngôn ngữ bậc cao

6.2.2.Viết tách biệt nhiều module trong C

Cách thường dùng trong việc liên kết giữa các chương trình viết bằng ngôn ngữ C với các chương trình viết bằng ngôn ngữ assembly là viết hoàn toàn tách biệt nhiều module riêng lẻ trong ngôn ngữ C và ngôn ngữ assembly. Tiến hành

dịch các module theo từng module một sau đó liên kết lại với nhau để tạo ra các file thi hành được.

Trước khi tiến hành viết tách biệt, chúng ta cần phải chú ý đến 3 vấn đề sau:

Vấn đề 1: khi viết tách biệt module C và module ASM thì vấn đề cần giải quyết đầu tiên là vấn đề đa tệp. Để 2 module có thể sử dụng các biến và các hàm của nhau, ta cần phải khai báo public các hàm và biến cho phép được sử dụng chung, khi sử dụng các hàm và các biến này thì ta phải khai báo extern:

• Không cần khai báo public với các hàm, biến của C, mặc định nó đã được coi là public

• Cần khai báo public cho các hàm, biến dùng chung trong ASM

• Khi sử dụng lại các hàm, biến của C, ASM cần khai báo extrn: extrn tên_biến: kiểu

• Khi sử dụng lại các hàm, biến trong ASM, C cần khai báo extern: extern kiểu tên_hàm(đối)

Vấn đề 2: trong module ASM, phải thêm dấu ‘_’ trước mọi nhãn dùng chung với C

Lưu ý: đối với C++, ta khai báo extern hàm trước, rồi sau đó dùng lệnh sau để dịch từ file .cpp  .asm: tcc –S file.cpp

Sau đó mở file .asm vừa được dịch ra, ta sẽ thấy tên chương trình con ở cuối file, thông thường, C sẽ thêm ký tự @ và $ vào tên hàm. Ví dụ, hàm có tên là func1, thì C sau khi dịch ra ASM sẽ đổi tên nó thành @func1$qv.

Vấn đề 3: Tên hàm của ASM có giá trị trả về nằm trong AX hoặc DX:AX, vì vậy cần chú ý đưa kết quả vào AX khi viết hàm trong ASM.

Sau khi chúng ta đã giải quyết được 3 vần đề trên và có hai tệp viết bằng C và bằng assembly của một chương trình thì chúng ta tiến hành dịch và liên kết bằng lệnh sau:

Tcc –ms/ls –Ic:/tc/include –Lc:/tc/lib tep1.cpp tep2.asm

Lệnh dịch trên báo cho chương trình dịch Turbo C biết trước tên phải dịch file tep1.cpp thành file tep1.obj sau đó gọi chương trình dịch TASM dịch file tep2.asm thành file tep2.obj và cuối cùng là gọi TLINK để liên kết tep1.obj và tep2.obj thành file thi hành được tep1.exe.

Việc viết tách biệt các module rất có lợi cho các chương trình có số lượng lệnh assembly lớn vì trong trường hợp này có thể sử dụng toàn bộ khả năng của chương trình dịch assembly và dịch phần assembly trong inline assembly. Không những thế phương pháp này cho ta khắc phục các nhược điểm của inline assembly vấp phải.

Ví dụ: viết một chương trình đơn giản, cho nhập vào một biến, sau đó tăng giá trị của biến đó lên 1 đơn vị và hiện giá trị vừa được tăng đó lên màn hình. Ta sẽ trao nhiệm vụ nhập và hiển thị biến cho C, và trao nhiệm vụ tăng giá trị cho ASM:

Module C:

#include "conio.h" #include "stdio.h" int a;

extern int tang(); void main(){ clrscr; printf("nhap a");scanf("%d",&a); printf("%d",tang()); getch(); } Module ASM: .model small .data extrn _a:word .code begin: public @tang$qv @tang$qv proc mov ax,_a inc ax ret @tang$qv endp end begin

Một phần của tài liệu Giáo trình assembly pot (Trang 84 - 86)