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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


ارائه ۲۴٫۱۰ اوبونتو منتشر شد 🎉

نویسنده موضوع: استفاده از توابع C در برنامه های اسمبلی  (دفعات بازدید: 4102 بار)

0 کاربر و 2 مهمان درحال مشاهده موضوع.

آفلاین Saman.S

  • Sr. Member
  • *
  • ارسال: 322
  • جنسیت : پسر
سلام
من وقتی که توابع 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 حجم فایل رو شدیدا اضافه می کنه.

آفلاین yunas

  • Full Member
  • *
  • ارسال: 135
  • جنسیت : پسر
    • دست نوشته های یک عشق کامپیوتر
ببین باید تو برنامه ای که با سی هم نوشتی کامپایل کنی و فایل آبجکتت رو با این برنامه اسمبلی پیوند بزنی
مثل این:
gcc -c test.c -o test.o
nasm -f aout testasm.asm -o testasm.o
ld  test.o testasm.o

آفلاین Saman.S

  • Sr. Member
  • *
  • ارسال: 322
  • جنسیت : پسر
ببین باید تو برنامه ای که با سی هم نوشتی کامپایل کنی و فایل آبجکتت رو با این برنامه اسمبلی پیوند بزنی
مثل این:
gcc -c test.c -o test.o
nasm -f aout testasm.asm -o testasm.o
ld  test.o testasm.o

مرسی از این که پاسخ دادید. اما من نمی خوام خودم تابع بنویسم و بعد لینک کنم. بلکه می خوام از توابع استاندارد زبان c استفاده کنم(مثل printf,scanf,malloc و ...)

آفلاین Saman.S

  • Sr. Member
  • *
  • ارسال: 322
  • جنسیت : پسر
خروجی این دستور ها رو ببینید. مشکل از چیه(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

آفلاین yunas

  • Full Member
  • *
  • ارسال: 135
  • جنسیت : پسر
    • دست نوشته های یک عشق کامپیوتر
شرمنده دیر جواب دادم من خیلی فرصت نمی کنم به اینجا سر بزنم سر فرصت کامل برات توضیح میدم برای رفع مشکلت چیکار کنی...
نقل‌قول
خروجی این دستور ها رو ببینید. مشکل از چیه(c.asm همون برنامه ایه که تو پست اول نوشتم)

ببین
 saman@saman-desktop:~/BIN/ASM/test$ ld -lc -o c c.o
اینجا تو داری هم با سویچ l اسم فایل لیستت رو c می زاری هم با سویچ o اسم خروجی برنامت رو c می زاری یکیشون رو تغییر بده...
« آخرین ویرایش: 14 تیر 1388، 11:58 ب‌ظ توسط yunas »

آفلاین Saman.S

  • Sr. Member
  • *
  • ارسال: 322
  • جنسیت : پسر
شرمنده دیر جواب دادم من خیلی فرصت نمی کنم به اینجا سر بزنم سر فرصت کامل برات توضیح میدم برای رفع مشکلت چیکار کنی...
نقل‌قول
خروجی این دستور ها رو ببینید. مشکل از چیه(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 از قبل وجود نداشته!

آفلاین yunas

  • Full Member
  • *
  • ارسال: 135
  • جنسیت : پسر
    • دست نوشته های یک عشق کامپیوتر
اوه من اشتباه گرفتم با سویچ l در nasm...

آفلاین Saman.S

  • Sr. Member
  • *
  • ارسال: 322
  • جنسیت : پسر
چیکار کنم ](*,) ](*,) ](*,)