لطفا وارد شوید یا ثبت‌نام کنید تا به انجمن‌ها دسترسی کامل داشته باشید.



 
امتياز موضوع :
  • 0 رأي - معدل امتيازات : 0
  • 1
  • 2
  • 3
  • 4
  • 5
MIXING ASSEMBLY AND C - NASM + GCC
2005-10-11, 10:10 PM,
ارسال : #1
MIXING ASSEMBLY AND C - NASM + GCC
lotfan begein ke chejori az dostrati mesle printf to assembly estefadeh konam
yani mix kardan ye file c ba assembly
montazere rahnamai shoma hastam
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-10-14, 04:37 PM,
ارسال : #2
 
بهتره وقتي Sys Call مناسب وجود داره از توابع C استفاده نكني ؛ اما اگر دليل خاصي وجود داره :

کد :
//print.c
print(int i)
{
    printf("%d\n",i);
}

//main.s
.globl main
main:
    movl $123, %eax
    pushl %eax
    call print
    addl $4, %esp
    ret

هر دو كد رو كامپايل و بعد لينك كن
نقل قول این ارسال در یک پاسخ
2005-10-17, 06:19 PM,
ارسال : #3
 
سلام دوست عزیز
در اسمبلی نمی شه کد C زد ولی بالعکسش میشه یعنی میشه تو C اسمبلی زد . با استفاده از ()asm__ . اما استفاده از روتین های کتابخانه استاندارد C یا هر کتابخانه دیگه یه بحث دیگه است یعنی شما می تونی کد ماشین کد اسمبلی ات رو با کد ماشین یه روتین لینک کنی که البته باید نوع فایل های object یکی باشه که معمولا اگه تو لینکس چیزی نگی ELF تولید میشه . مثلا می تونی تو کد اسمبلی ات بگی call _printf و البته رجیستر هارو قبلا باید مقدار بدی . اونوقت این کد ماشین با کد printf در standard C library لینک میشه .
کلا اسمبلی برای این نیست که شما بیای و یک تابع C رو صدا بزنی . printf هم در حقیقت همان System Call رو صدا میکنه . خوب چرا دیگه بری printf رو صدا بزنی برو مستقیم system call رو صدا بزن . برای این کار هم تو داس که int 21 و int 10 هست و تو لینکس int 80 که باید مقدار eax رو تنظیم کنی که تابع مورد نظرت اجرا بشه و یه سری تنظیمات دیگه هم البته داره . تمام این حرفا واسه 386 به بعد بود . اگه کارت در مورد architecture های دیگه است بگو تا کمکت کنم .
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-10-27, 10:43 AM,
ارسال : #4
 
سلام سعید جون منم می خوام اسمبلی یاد بگیرم البته 32 بیتی اونم تو nasm ایا کتاب فارسی یا منبعی وجود داره ؟
همچنین اگه منبعدر مورده این مطالب داری ممنون میشم :
IDT
GDT
and Login to Protected mode with assembly
بازم متشکرم
نقل قول این ارسال در یک پاسخ
2005-11-06, 01:56 AM,
ارسال : #5
 
سلام . فکر کنم مستندات انگلیسی nasm به قدر کافی ساده نوشته شده باشن . یه بار امتحان کن . در مورد منابع در مورد IDT و GDT که نمی دونم مخفف چی هستن یه سر به google بزن .
در مورد ... login to اولا کلمه login نادرسته چون protected mode و real mode دو mode اجرای دستورات پردازنده هستن و شما همیشه در یکی از اینها هستی . یعنی بیرون نیستی که بخوای حالا وارد بشی بهتره از کلمه switch استفاده کنی . بعدش شما به طور پیش فرض در لینکس در protected mode هستی . کرنل و به تبع اون پردازنده به شما اجازه نمیدن که بری تو real mode چون اونوقت می تونی خرابکاری بکنی . فقط می تونی برای چند instruction سوییچ کنی و system call مورد نظرت رو صدا کنی و دوباره به protected mode سوییچ کنی .
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-11-07, 05:26 PM,
ارسال : #6
 
با سلام
دوست عزيز اگر مي خواي از سي در اسمبلي استفاده كني ميتوني دستورات سي رو
به شكل يك فايل lib.* كامپايل كني و به برنامه اسمبلي لينك كني اما بايد تعريف توابع سي را
در قسمت extern در سورس اسمبلي صريحا بياوري
بر عكس مي توني با استفاده از {....}asm از اسمبلي در سي استفاده كني. Big Grin

براي اطلاعات بيشتر مراجعه كن به:
كتاب اسمبلي نوشته مهندس جعفر نژاد قمي

Registered Linux User #443548
<!-- m --><a class="postlink" href="http://lxsamee.com/">http://lxsamee.com/</a><!-- m -->
Follow me in Ohloh
http://www.karajlug.org
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-11-12, 07:25 AM,
ارسال : #7
 
اقا سعيد ميشه در مورد استفاده ار
_asm
توضيح كاملي بدي من خودم تا حدودي مي تونم باهاش اسمبلي بنويسم ولي بهضي وقتها ايراد مي گيره اگر در اين مورد اشناي كاملي داريد لطفا توضيح دهيد
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2005-11-16, 10:22 PM,
ارسال : #8
 
سلام خدمت اقایون محترم.
من مسئله IDT & GDT رو مطرح کردم .با اجازه بزرگ ترا {برنامه نویسان قدر} می خوام یه سیستم عامل کوچیک بنویسم !
تو چند سایت خوندم که باید در بوت لودر ابتدا IDT و بعد GDT رو فعال کرد برای همین دنبال منابع فارسی می گردم.
همچنین در مورد مد حفاضت هم می دونم که به هر حا باید تو یکدوم باشم . منظورم اینکه ایا کسی می تونه راهنمایی کنه که با اسمبلی چطور این دو محیط رو سویچ کنم ؟ راستی کسی لینک مجانی از VMware Workstation داره ؟
نقل قول این ارسال در یک پاسخ
2008-01-14, 06:18 PM,
ارسال : #9
 
salam
man yek barname daram ke bayad ba nasm kampaylesh konam
ba nasm ke kampayl mikonam file *.lst va fail *.o ijad mishe
bad ke mikham faile *.o ra ba gcc exe konam khata mide
kasi midoone moshkele man kojast va shayad gcc ke man downlod kardam moshkel dare
yek jaii ke gcc vagheiiro dare mitoonin moarefi konin?
نقل قول این ارسال در یک پاسخ
2008-01-15, 01:01 PM,
ارسال : #10
 
نقل قول :بهتره وقتي Sys Call مناسب وجود داره از توابع C استفاده نكني ؛

در بیشتر موارد استفاده از توابع استاندارد C اشکال خاصی ندارن. اونا استاندارد طراحی شدن Portable هستن و بسیار خوب و دقیق و درست کار میکنن. اگر احساس میکنید که میتونید کد اسمبلی با کیفیت بهتر از توابع استاندارد C که کارهای روتین رو انجام میدن تولید کنید اون یک بحث جداست.

نقل قول :کلا اسمبلی برای این نیست که شما بیای و یک تابع C رو صدا بزنی . printf هم در حقیقت همان System Call رو صدا میکنه . خوب چرا دیگه بری printf رو صدا بزنی برو مستقیم system call رو صدا بزن .


البته لزوماً اینطور نیست. صدا زدن توابع C در assembly هیچ اشکالی ندارن. درست همونطور که استفاده از goto خطرناک نیست و موارد مشابه (تا زمانی که برنامه نویس بدونه که داره چی کار میکنه) علت اصلیش اینه که توابع GNU C Library همه جا Portable هستن و Functionality بالاتری دارن. ضمناً‌به طور مثال تابع ()exit_ موقع خروج مجموعه‌ای از کارهای دیگه رو هم انجام میده که چنانچه شما بخواهید خودتون این کارها رو دستی انجام بدید باید ۱) دقیقاً معماری سیستمتون رو بشناسید و Document های ABI پلتفورم خودتون رو خونده باشید تا بتونید به درستی ازشون استفاده کنید. من در مورد مثلاً از x86 به SPARC حرف نمیزنم ختی معماری cpu های ۶۴بیتی AMD یا پلتفورم amd64 کاملاً شیوه استفاده و نحوه پاس کردن پارامتر ها درشون متفاوته.

http://www.gnu.org/software/libc/manual/...ermination

نقل قول :lotfan begein ke chejori az dostrati mesle printf to assembly estefadeh konam
yani mix kardan ye file c ba assembly
montazere rahnamai shoma hastam

کاری که شما باید بکنید اینه که برنامهً اسمبلی تون را libc لینک کنید. مثلاً کد زیر:


کد :
.section .data
str:
        .asciz "Hello %d World.\n"

.section .text
.globl _start
_start:
        nop
        pushl $2
        pushl $str
        call printf
        addl $4, %esp
        pushl $0
        call exit

به این ترتیب اسمبل و بعد لینک کنید:

کد :
$ as helloworld.s -o helloworld.o
$ ld helloworld.o -lc -dynamic-linker=/lib/PATH-TO-LD-LINUX.so -o helloworld
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2008-01-15, 07:36 PM,
ارسال : #11
 
سلام
چرا کسی جواب من را نمی دهد
من برنامه ای دارم با اسمبلی 32 بیتی نوشته شده
در اون از printf استفاده شده که به صورت extern تعریف شده
میخواهم فایل exe اون بسازم نمی توانم
گفتن باید با nasm فایل *.lst و o.* را بسازم بعد با gcc و فایل پسون o فایل exe اون ساخت می شود زمان تبدیل فایل با gcc با خطا مواجه می شوم و فایل exe ساخته نمی شود


لطفا در صورت امکان کمکم کنید
نقل قول این ارسال در یک پاسخ
2008-01-15, 07:48 PM,
ارسال : #12
 
این هم کد برنامه ای که باید اجرایی کنمش اما نمی تونم
اگه تونستین اجرایش کنین مراحل کار و فایلهای لازمه را بگین

global main
extern printf
section .data
myarray:dd 10,20,30,100,200,56,45,67,89,77
format:db '%d',10,0
section .text
main:
mov ecx,0
mov eax,[myarray]
l2:inc ecx
cmp ecx,10
jz over
cmp eax,[myarray+ecx*4]
jge l1
mov eax,[myarray+ecx*4]
l1:jmp l2
over:push eax
push dword format
call printf
add esp,8
ret

hadis
نقل قول این ارسال در یک پاسخ
2008-01-16, 02:07 AM,
ارسال : #13
 
نقل قول :سلام
چرا کسی جواب من را نمی دهد
من برنامه ای دارم با اسمبلی 32 بیتی نوشته شده
در اون از printf استفاده شده که به صورت extern تعریف شده
میخواهم فایل exe اون بسازم نمی توانم
گفتن باید با nasm فایل *.lst و o.* را بسازم بعد با gcc و فایل پسون o فایل exe اون ساخت می شود زمان تبدیل فایل با gcc با خطا مواجه می شوم و فایل exe ساخته نمی شود


لطفا در صورت امکان کمکم کنید

راستش من هیچ وقت با Nasm کار نکردم همینطور با Cygwin یا gcc که فابل exe. تولید کنه اما اگه منظورت از فایل exe. یک چیزی تو مایه های Executable and Linkable Format یا همون ELF هستش باید به ترتیب زیر عمل کنی.

کد اسمبلی رو کامپایل کنی که ظاهراً اینکار رو کردی. بعد از اون کافیه کدت رو (Object Code) با ld همونطور که بالا گفتم لینک کنی (با libc و ld-linux.so). لارم نیست با gcc کدت رو لینک کنی.
مثلاً فرض کنیم که ld-linux.so اینجا باشه: lib/ld-linux.so.2/ اونوقت اینطوری کدت رو لینک میکنی:

کد :
$ ld your_code.o -lc -dynamic-linker=/lib/ld-linux.so.2 -o your_elf

میتونی هم پارامتر static- رو به ld پاس کنی تا کدت رو به صورت استاتیک با libc لینک کنه. در این صورت دیگه لازم نیست کدت رو با ld-linux.so لینک کنی. اما این اصلاً روش خوبی نیست چون کد تولید شدت یک کد Bloated خواهد بود با اندازه‌ی بسیار بیشتر از حد لازم (علتش هم مشخصه البته چون کدت تمام libc رو تو خودش داره). میتونی یکبار غیر static و یکبار static کدت رو لینک کنی و حاصل رو ببینی و حجم فایل اجرایی تولید شده تو دو حالت رو باهم مقایسه کنی.

یادت باشه که static- رو باید زودتر از بقیه پارامتر‌ها پاس کنی در غیر اینصورت توسط override -lc میشه.
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2008-01-16, 09:21 AM,
ارسال : #14
 
سلام
مرسی dark_side .
خیلی از راهنمایی شما ممنونم
ولی باز هم نشد

ld-linux.so باید داشته باشم نه؟
برنامه ای که گذاشتم می تونین برام exe. کنید و به آدرس email من بفرستید؟
منظور از exe. حالت اجرایی برنامه است
برنامه بزرگترین عدد ماتریس از ابتدا مقدار داده شده را پیدا می کند

اگه شد که این لطف به من بکنید
آدرس :[email protected]

global main
extern printf
section .data
myarray:dd 10,20,30,100,200,56,45,67,89,77
format:db '%d',10,0
section .text
main:
mov ecx,0
mov eax,[myarray]
l2:inc ecx
cmp ecx,10
jz over
cmp eax,[myarray+ecx*4]
jge l1
mov eax,[myarray+ecx*4]
l1:jmp l2
over:push eax
push dword format
call printf
add esp,8
ret
نقل قول این ارسال در یک پاسخ
2008-01-16, 12:55 PM,
ارسال : #15
 
این تمرینیه که به تو داده شده پس باید سعی کنی خودت از پسش بر بیایی. به یقین که اگر اون کارهایی رو که من بهت گفتم به دقت انجام بدی همه چی درست خواهد بود. نشد که فایده نداره. چه error ای رو باهاش برخورد کردی و دقیقاً چی شد که نشد؟

اگر دیدی که استفاده از ld برات سخته اینطوری از gcc استفاده کن.
یادت باشه که اگه داری با ld لینک میکنی باید اسم symbol های main رو به start_ تغییر بدی.

کد :
$ nasm -f elf your_code.s
$ gcc your_code.o -o your_code

باید کار کنه.
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2008-01-16, 06:09 PM,
ارسال : #16
 
مرسی dark_side
من می خوام که بشه ولی... :cry:
نقل قول این ارسال در یک پاسخ
2008-01-16, 10:05 PM,
ارسال : #17
 
dark_side آلان دیگه تنها امیدم شمایی
چند نفر دیگه هم برنامه نویس می شناختم ازشون پرسیدم یاد نداشتن
برنامه نویس سطح بالا و این nasm که ارتباطی نیست

hadis
نقل قول این ارسال در یک پاسخ
2008-01-19, 01:48 PM,
ارسال : #18
 
dark_side عزیز از زحمات و کمکتون ممنونم.


hadis
نقل قول این ارسال در یک پاسخ
2008-04-07, 08:33 AM,
ارسال : #19
 
Anonymous نویسنده :سلام
مرسی dark_side .
خیلی از راهنمایی شما ممنونم
ولی باز هم نشد

ld-linux.so باید داشته باشم نه؟
برنامه ای که گذاشتم می تونین برام exe. کنید و به آدرس email من بفرستید؟
منظور از exe. حالت اجرایی برنامه است
برنامه بزرگترین عدد ماتریس از ابتدا مقدار داده شده را پیدا می کند

اگه شد که این لطف به من بکنید
آدرس :[email protected]

global main
extern printf
section .data
myarray:dd 10,20,30,100,200,56,45,67,89,77
format:db '%d',10,0
section .text
main:
mov ecx,0
mov eax,[myarray]
l2:inc ecx
cmp ecx,10
jz over
cmp eax,[myarray+ecx*4]
jge l1
mov eax,[myarray+ecx*4]
l1:jmp l2
over:push eax
push dword format
call printf
add esp,8
ret
نقل قول این ارسال در یک پاسخ
2008-04-07, 08:38 AM,
ارسال : #20
 
lمن میخواهم درون فایل بانک اطلاعاتی که پسوند idtراکه با برنامه پاسکال نوشته شده را دیده وویرایش کنم مانند برنامه حسابداری شایپگان
مرسی
نقل قول این ارسال در یک پاسخ


رفتن به انجمن :


کاربران در حال مشاهده موضوع : 1 مهمان