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 هر دو كد رو كامپايل و بعد لينك كن |
|||
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 از اسمبلي در سي استفاده كني. براي اطلاعات بيشتر مراجعه كن به: كتاب اسمبلي نوشته مهندس جعفر نژاد قمي 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 کاری که شما باید بکنید اینه که برنامهً اسمبلی تون را libc لینک کنید. مثلاً کد زیر: کد : .section .data به این ترتیب اسمبل و بعد لینک کنید: کد : $ as helloworld.s -o helloworld.o |
|||
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
|
|||
|
|||
نقل قول :سلام راستش من هیچ وقت با 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 باید کار کنه. |
|||
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 نویسنده :سلام |
|||
2008-04-07, 08:38 AM,
ارسال : #20
|
|||
|
|||
lمن میخواهم درون فایل بانک اطلاعاتی که پسوند idtراکه با برنامه پاسکال نوشته شده را دیده وویرایش کنم مانند برنامه حسابداری شایپگان
مرسی |
|||
|