-
Include (ASM Obj) in TC
سلام خدمت دوستان
از اونجا که سر فصل این تاپیک C بود نه ++VC من سوال خودم رو اینجا مطرح کردم امیدوارم مدیران سایت من رو مجازات نکنن
سوال من اینه که چطوری می تونم از یک فایل Obj که توی ASM ساختم توی TC v3.0 استفاده کنم
سوال رو بیشتر توضیح می دم:
ببینید ما توی اسمبلی می تونیم فایل های خاصی رو داشته باشیم که توشون زیربرنامه ها رو قرار بدیم و در آخر از طریق برنامه Link این فایل ها رو به برنامه اصلی پیوند بدیم
مثلا من یه تابع توی فایلی دارم به صورت زیر اونو ایجاد کردم
حالا چطوری می تونم توی TC این فایل رو (در واقع تابع رو) استفاده کنم ببینید من معرفی تابع رو انجام دادم
کد:
extern void getSys(void)
اما موقع لینک کردن که از tcc استفاده می کنم به فایل Obj من گیر میده می خواستم از حضور اساتید استفاده کنم و ببینم چطوری می تونم این مشکل رو حل کنم (راهنمایی بیشتر این مبحث یکی از مباحث مورد تدریس در درس برنامه سازی سیستم هست)
پیشاپیش ممنون
-
به احتمال زیاد تابع اسمبلی با نام extern در C همخوانی نداره که لینکر پیغام خطا میده. بطور کلی سعی کن این الگو رو دنبال کنی:
تابع خودت در اسمبلی رو به این صورت بنویس:
کد:
PUBLIC MYFUN
.MODEL small, C
.CODE
MYFUN PROC
xor ah, ah
; your assembly code here...
ret
MYFUN ENDP
END
بعد در کد C این تابع رو به اینصورت فراخوانی کن:
کد:
extern void MYFUN (void);
void main ()
{
MYFUN( );
}
حالا برای فراخوانی تابع با متغیرهای ورودی در اسمبلی، اگر با Directive ها آشنایی داری و به کمک TASM میتونی به صورت خلاصه زیر یک متغیر رو pass کنی به برنامت در C:
کد:
PUBLIC MYFUN
.MODEL small, C
.CODE
MYFUN PROC USES ES DI, NOS:
WORD
mov ax, NOS
; your assembly code here...
ret
MYFUN ENDP
END
که متغیر ورودی در NOS ذخیره شده. برای درک بهتر Directive ها، کد بالا در واقع کد پایین است که بدون Directive نوشته شده است:
کد:
PUBLIC _MYFUN
_TEXT SEGMENT WORD PUBLIC ‘CODE’
ASSUME CS: _TEXT
_MYFUN PROC NEAR
push bp
mov bp, sp
push es
push di
mov ax, [bp+4]
; your assembly code here...mov ax, bx
pop di
pop es
pop bp
ret
_MYFUN ENDP
_TEXT ENDS
END
که فراخوانی اون در کد C شما به صورت زیر خواهد بود:
کد:
#include <stdio.h>
extern int MYFUN (int) ;
void main ()
{
int p;
p=MYFUN(20);
}
در آخر، برای کامپایل کردن برنامه ابتدا کد اسمبلی و سپس کد C را به صورت زیر کامپایل کنید:
TASM MUFUN.asm
که منجر به تولید فایل MYFUN.obj می گردد. سپس فایل C را به صورت زیر کامپایل کنید:
TCC myprogram.c MYFUN.asm
دقت کنید فایل C را در همان مسیری کامپایل کنید که فابل obj اسمبلی ساخته شده وجود داشته باشد.
-
با سلام
حالا اگر من به جای TASM از MASM استفاده کنم چی تفاوتی بین این دو کامپایلر هست؟
-
فکر نکنم فرقی داشته باشه. امتحان کن ببین چی میشه. گرچه TASM فکر کنم با خود Turbo C عرضه میشه.