• پایان فعالیت بخشهای انجمن: امکان ایجاد موضوع یا نوشته جدید برای عموم کاربران غیرفعال شده است

اسمبلي براي سي

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
كلا گرفتم موضوع را.
مثال هم خيلي مفيد بود.
من خودم علاقه مندم كه بعد يك فايل exe سي را با توربو ديباگر كدهاي اسمبلي اش را نگاه كنم و بفهمم كه هر دستور سي به چه كدي از اسمبلي تبديل ميشه.
اين جوري هم ديد آدم به سي باز ميشه و هم به دستورات اسمبلي مسلط ميشه. در آن فروم كه لينكش بالا است ، دوست عزيزم مثال I++ و I=I+1 و I+=1 را زده اند ، مثلا مي خواهم ببينم كه كد اسمبلي اين 3 چه شكلي است و با ديدن دستورات اسمبلي اين 3 ديگه تا ابد حله كه وظيفه و فرق اين 3 دستور چيه.
مي دانيد كه ++I و I++ خوش يك بحثه و ندانستن تفاوتش باعث مشكلاتي ميشه. اين را هم مي خواهم از اين ديد نگاه كنم.
البته شايد اين كارها اضافه باشه ولي من فقط به دليل علاقه مي خواهم از كدهاي اسمبلي دور نشوم. چون براي من تنها دستور واقعي ، دستوري است كه به اسمبلي باشد و بقيه دستورات به زبانهاي ديگه ، موهومي هستند.
منظورم از موهومي اينه كه تكليفشان مشخص نيست. يعني نه به زبان انسان هستند و نه به زبان ماشين. ممكنه در اين كامپايلر يك جور ترجمه بشوند و در كامپايلر ديگر (حتي با تفاوت ورژن) يك جور اجرا بشوند. بجاي موهومي بهتره بگيم بلاتكليف.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
به نقل از saeedIRHA :
سلام دوست عزيز!
تا اونجا که من ديدم و خودم هم يک مقداری کار کردم برای
In-Line Assmebly در C از AT&T Syntex بيشتر استفاده ميشه!
اگر خواستی من يک E-book بسيار عالی در اين ضمينه دارم اما به زبان اصلی هست !
که همش در رابطه با In-line Assembly در C هست.


براتون تو اين سايت Upload کردم:

http://rapidshare.de/files/7456769/WPALJ2005-DDU.pdf.html

از تاپيك اسمبلي در سي++ از سايت برنامه نويس.
حجم بين 6 و 7 مگا.
.
فكر كنم به درد حرفه اي ها بخوره. تقديم به آقا سعيد.
من دانلود كردم. يك نگاهي مي كنم اگر چيزي فهميدم يك توضيحي مي دهم.
.
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
دست شما درد نکنه اما من حرفه ای نیستم :D
-----
دانلودش كردم اگه چيز تازه اي داشت همين جا پست ميزنم
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها

k1.gif


k2.gif


k3.gif


جلد اول اين كتاب:
http://download.hadown.com/uploadfile/2006/3/14/2302514987.zip

جلد دوم اين كتاب:
http://www.flazx.com/ebook4485.php

شرح بيشتر در تاپيك هاي مربوطه.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
با سلام.
يك سئوال راجع به پشته داشتم.
مي خواهم ببينم تصور من درسته يا نه.
من اين طور فكر مي كنم كه هر برنامه سي يا اسمبلي كه اجرا ميشه ، بلافاصله يك پشته برايش ساخته ميشه.
وقتي در يك برنامه سي با كدهاي سي يا اسمبلي چيزي به پشته مي فرستيم ، در حقيقت پشته آن برنامه است و اگر زيادي pop كنيم يا بد كار كنيم (هر جوري) ، پشته آن برنامه مختل ميشه. و ويندوز يا dos پشته نداره كه اختلالي ايجاد بشه.
به زبان ديگر:
اگر با پشته بد كار كنيم ، برنامه كارش مختل ميشه نه ويندوز . آيا اين درسته؟
= = = = = = = = = = == ==
و سئوال كلي تر من اينه كه برنامه ما چه اشكالاتي داشته باشه كه باعث فلج شدن ويندوز بشه. چون گاهي برنامه هايي را با توربو سي اجرا مي كنم و بعد مجبور به reset مي شوم . چون ويندوز قاطي كرده و خيلي كارها را نمي تواند انجام بدهد.
حتما شما هم با مواردي مواجه شده ايد. مي خواستم از تجربيات دوستان با تجربه اينجا استفاده كنم.
با تشكر فراوان.
.
 

saeedsmk

مدیر بازنشسته
تاریخ عضویت
6 سپتامبر 2003
نوشته‌ها
1,518
لایک‌ها
4
با اجازه دوستان
دقیقا همینطوری که گفتید هر برنامه ای اطلاعات خودش رو به پشته ای که برا ان قسمت برنامه درست شده است میفرستد. این وظیفه لودر است که پشته مربوط را تعیین نماید ( بر اساس مشخصات فایل اجرایی ) و برنامه فقط از همین پشته استفاده مینماید ویا در واقعه در وریندوز از حافظه ماشین مجازی ساخته شده برای ان برنامه استفاده میکند.
اما این قسمت که داس و ویندوز پشته ندارند اشتباه است انها هم پشته دارند . و پشته های مخصوص خودشان هست مثلا user32 خود یک کتابخانه است که دارای اطلاعات و متغیر های داخلی ( همان متغیر های کلاس ها مثلا ) است که باید این اطلاعات را گاهی به پشته بفرستد

بعضی از مواقع اشتباه در تغییر مشخصات پشته باعث تغییر سگمنت و افست پشته شده و در نتیجه ( چون احتمال دارد این سگمنت و ادرس برای برنامه دیگری باشد ) باعث کرش خود برنامه و یا چند برنامه دیگر میشود که معمولا سیستم عامل جلوی این نوع اشتباهات رو میگیرد

در بعضی از موارد بعلت تغییر سگمت پشته بعلت pop های زیاد و بعد ریترن ممکن است سگمت پشته تغییر نماید . یکی از برنامه های که همشه لود است kernel32, و gdi و... است ممکن است پشته انها مشکل پیدا کند و در نتیجه دستگاه درست کار ننماید چون هسته تحت تاثیر قرار گرفته است .

من هم با این مشکلات برخورد کرده ام معمولا تمامی کسانی که با اسمبلی کار میکنند با این مشکلات دسته و پنجه نرم کرده و یا میکنند و یا خواهند نمود .

امیدوارم کمک کنه
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
عالي بود. من دقيقا در همين حد مي خواستم. چون بيش از اين در حد كار من نيست.
ممنون. واقعا لطف كرديد.
.
 

saalek

مدیر بازنشسته
تاریخ عضویت
24 می 2005
نوشته‌ها
654
لایک‌ها
53
محل سکونت
در پاي كوهپايه ها
بنام خدا.
مي خواهم در اينجا كمي با برنامه توربو ديباگر كار كنم. چيزي كه من ازش مي دانم اينه كه برنامه اي است كه سورس اسمبلي فايلها را مي دهد.

در گام اول، من يك برنامه ساده اسمبلي مي سازم تا ببينم توربو ديباگر آن را چطور نمايش مي دهد.

براي ساخت اين برنامه در اديتور خود برنامه ساده زير را تايپ مي كنم.


.model small

.stack
.code

mytest proc

mov ah,2h
mov dl,41h
int 21h

mov ah,4ch
int 21h

mytest endp

end mytest

خطوط آبي شروع و اختتام را به كامپايلر(اسمبلر) tasm نشان مي دهد.
خطوط قرمز كدهاي اصلي برنامه است.(اين برنامه معناي كدهايش در پستهاي قبل شرح داده شده)
فايل را با پسوند asm ذخيره مي كنم.

در گام بعدي ، با tasm و link من فايل exe را مي سازم.

و در گام آخر، با ((توربوديباگر)) فايل exe را مي گشايم.


a5.gif


همان طور كه در شكل بالا مي بينيد ، كدهايي كه در بالا با رنگ قرمز نشان داديم در توربو ديباگر بالافاصله در آدرس صفر قرار گرفته. يعني بقيه چيزهايي كه در فايل asm ما بود حكم راهنما براي اسمبلر(tasm)بود و فقط خطوط قرمز كامپايل شده.

هدف من از نوشتن اين برنامه ساده،، اين بود كه ابتدا با يك فايل اسمبلي طرز كار توربو ديباگر را نشان دهم تا بعد فايلهاي exe ئي كه با توربو سي كامپايل مي كنيم را(توسط توربو ديباگر) مورد تجزيه و تحليل قرار بدهيم. مثلا ببينيم در قسمت اسمبلي فرق دو كد زير چيست.

کد:
a++;
++a;
 

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
منبع:
http://www.codeguru.com/forum/showthread.php?t=356461

a "Hello world" asm program for DOS using VC++ 6.0 compiler

در یک برنامه کنسولی در ویژوال سی 6 می توانید برنامه زیر را اجرا کنید:
کد:
#include <stdio.h>

char format[] = "%s %s\n";
char hello[] = "Hello";
char world[] = "world";
void main( void )
{
   __asm
   {
      mov  eax, offset world
      push eax
      mov  eax, offset hello
      push eax
      mov  eax, offset format
      push eax
      call printf
      //clean up the stack so that main can exit cleanly
      //use the unused register ebx to do the cleanup
      pop  ebx
      pop  ebx
      pop  ebx
   }
}

در زبان سی پارامترهای ارسالی به توابع از طریق پشته ارسال می شود.
در برنامه فوق از این نکته استفاده شده.
یعنی در قسمت اسمبلی پارامترها به پشته ارسال شده و بعد تابع printf صدا زده شده است.

نتیجه اجرا:
hello world


نکته : در اول و آخر برنامه ebx و eax را push و pop کنید وگرنه مشکلاتی به وجود می آید.
می دانید که نباید رجیسترها دستکاری شود. اگر در اول کارتان همه رجیسترهای مورد استفاده را push و در اتمام کار pop کنید مشکلی پیش نخواهد آمد.
 
Last edited:

saalek110

Registered User
تاریخ عضویت
10 آپریل 2007
نوشته‌ها
212
لایک‌ها
1
برنامه مشابه برنامه بالا با دلفی

کد:
program DelphiAsm;
uses windows;

var
Title :PChar = 'Inline assembly with Reza'#0;//bar hasbeh adat!!
Mes1 : PChar = 'Please press one of the following buttons!!'#0;
Mes2 : PChar = 'You pressed OK button!!'#0;
Mes3 : PChar = 'You pressed Cancel button!!'#0;

label
PRINTPROC;

begin
asm
push 1
push Title
push Mes1
push 0
call MessageBoxA
cmp eax , IDOK
je PRINTPROC
push Mes3
pop Mes2

PRINTPROC:
push 0
push Title
push Mes2
push 0
call MessageBoxA

mov eax,0
call ExitProcess
end;
end.

نكته:در دلفي براي نوشتن دستورات اسمبلي از بلوك asm … end; استفاده ميشود.
منبع: http://delphibaz.blogfa.com
 
بالا