انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => برنامه‌سازی => نویسنده: Saman.S در 07 تیر 1388، 04:09 ب‌ظ

عنوان: استفاده از توابع C در برنامه های اسمبلی
ارسال شده توسط: Saman.S در 07 تیر 1388، 04:09 ب‌ظ
سلام
من وقتی که توابع C رو extern می کنم, لینکر خطای undefined reference می ده. مثلا برنامه ی ساده ی زیر رو ببینید. این برنامه با استفاده از توابع scanf و printf دو عدد می گیره و مجموع این دو عدد رو نمایش می‌ده.
extern scanf
extern printf

section .data
in_format: db "%d %d",0
out_format: db "%d",0
section .bss
num1: resd 1
num2: resd 1
section .text
_start:
push num2
push num1
push dword in_format
call scanf
add esp, 12
mov eax, [num1]
mov ebx, [num2]
add eax, ebx
push eax
push dword out_format
call printf
add esp, 8
mov eax, 1
mov ebx, 0
int 80h
حالا وقتی می خوام این برنامه رو کامپایل و لینک کنم, با این خطا روبه‌رو می‌شم.
saman@saman-desktop:~/BIN/ASM$ nasm -f elf c.asm
saman@saman-desktop:~/BIN/ASM$ ld -o c c.o
c.o: In function `_start':
c.asm:(.text+0x10): undefined reference to `scanf'
c.asm:(.text+0x2e): undefined reference to `printf'
باید چه پارامترهایی رو به ld اضافه کنم تا این خطاها برطرف شه؟خیلی گشتم. همه سایتا فقط گفته بودن که برای استفاده از توابع C دراسمبلی باید از extern استفاده کنید ولی هیچ کدوم نگفته بودن که دستور ld چه تغییری می کنه. در ضمن, لطفا نگین که به جای ld از gcc استفاده کن چون gcc حجم فایل رو شدیدا اضافه می کنه.
عنوان: پاسخ به: استفاده از توابع C در برنامه های اسمبلی
ارسال شده توسط: yunas در 10 تیر 1388، 12:53 ق‌ظ
ببین باید تو برنامه ای که با سی هم نوشتی کامپایل کنی و فایل آبجکتت رو با این برنامه اسمبلی پیوند بزنی
مثل این:
gcc -c test.c -o test.o
nasm -f aout testasm.asm -o testasm.o
ld  test.o testasm.o
عنوان: پاسخ به: استفاده از توابع C در برنامه های اسمبلی
ارسال شده توسط: Saman.S در 11 تیر 1388، 06:23 ب‌ظ
ببین باید تو برنامه ای که با سی هم نوشتی کامپایل کنی و فایل آبجکتت رو با این برنامه اسمبلی پیوند بزنی
مثل این:
gcc -c test.c -o test.o
nasm -f aout testasm.asm -o testasm.o
ld  test.o testasm.o

مرسی از این که پاسخ دادید. اما من نمی خوام خودم تابع بنویسم و بعد لینک کنم. بلکه می خوام از توابع استاندارد زبان c استفاده کنم(مثل printf,scanf,malloc و ...)
عنوان: پاسخ به: استفاده از توابع C در برنامه های اسمبلی
ارسال شده توسط: Saman.S در 14 تیر 1388، 08:25 ق‌ظ
خروجی این دستور ها رو ببینید. مشکل از چیه(c.asm همون برنامه ایه که تو پست اول نوشتم)
saman@saman-desktop:~/BIN/ASM/test$ ls
c.asm
saman@saman-desktop:~/BIN/ASM/test$ nasm -f elf c.asm
saman@saman-desktop:~/BIN/ASM/test$ ld -lc -o c c.o
saman@saman-desktop:~/BIN/ASM/test$ ls
c  c.asm  c.o
saman@saman-desktop:~/BIN/ASM/test$ ./c
bash: ./c: No such file or directory
عنوان: پاسخ به: استفاده از توابع C در برنامه های اسم
ارسال شده توسط: yunas در 14 تیر 1388، 11:51 ب‌ظ
شرمنده دیر جواب دادم من خیلی فرصت نمی کنم به اینجا سر بزنم سر فرصت کامل برات توضیح میدم برای رفع مشکلت چیکار کنی...
نقل‌قول
خروجی این دستور ها رو ببینید. مشکل از چیه(c.asm همون برنامه ایه که تو پست اول نوشتم)

ببین
 saman@saman-desktop:~/BIN/ASM/test$ ld -lc -o c c.o
اینجا تو داری هم با سویچ l اسم فایل لیستت رو c می زاری هم با سویچ o اسم خروجی برنامت رو c می زاری یکیشون رو تغییر بده...
عنوان: پاسخ به: پاسخ به: استفاده از توابع C در برنامه های اسمبلی
ارسال شده توسط: Saman.S در 15 تیر 1388، 10:19 ق‌ظ
شرمنده دیر جواب دادم من خیلی فرصت نمی کنم به اینجا سر بزنم سر فرصت کامل برات توضیح میدم برای رفع مشکلت چیکار کنی...
نقل‌قول
خروجی این دستور ها رو ببینید. مشکل از چیه(c.asm همون برنامه ایه که تو پست اول نوشتم)

ببین
 saman@saman-desktop:~/BIN/ASM/test$ ld -lc -o c c.o
اینجا تو داری هم با سویچ l اسم فایل لیستت رو c می زاری هم با سویچ o اسم خروجی برنامت رو c می زاری یکیشون رو تغییر بده...

سوییچ l می گه که از کدوم کتابخونه استفاده بشه. مثلا -lc یعنی که از کتابخونه ی libc.so استفاده بشه و ریطی به اسم فایل نداره. نمی دونم مشکل از چیه. خروجی ls هم گذاشتم. فایل c واقعا وجود داره! در ضمن خروجی ls قبل از اجرای دستور رو هم گذاشتم تا ببینید که فایل c از قبل وجود نداشته!
عنوان: پاسخ به: استفاده از توابع C در برنامه های اسمبلی
ارسال شده توسط: yunas در 15 تیر 1388، 11:29 ب‌ظ
اوه من اشتباه گرفتم با سویچ l در nasm...
عنوان: پاسخ به: استفاده از توابع C در برنامه های اسمبلی
ارسال شده توسط: Saman.S در 16 تیر 1388، 02:50 ب‌ظ
چیکار کنم ](*,) ](*,) ](*,)