آموزش برنامه نویسی با زبان اسمبلی

sayyad84

متخصص زبان Assembly
کاربر ممتاز
سلام به همه،
قصد دارم تو این تاپیک آموزش اسمبلی رو شروع کنم، امیدوارم مدیر محترم موافق باشند و مورد توجه قرار بگیره!
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
آموزش اسمبلی، قسمت اول: آشنایی با مبناها

آموزش اسمبلی، قسمت اول: آشنایی با مبناها

با سلام،

از اون جایی که دوست ندارم هیچ کاری رو از وسطش شروع کنم، آموزش اسمبلی رو هم از اول اول شروع می کنیم!
در ابتدا از سیستم اعداد شروع می کنیم. البته این قسمت های اولیه رو به طور خلاصه توضیح می دم که خیلی حوصله تون سر نره!
در کامپیوتر نیاز به دو مبنای 2 و 16 و گاهی هم مبنای 8 داریم پس لازمه که با نحوه ی رسیدن به این مبناها آشنا باشیم. در کاربردهای معمول از اعداد دهدهی استفاده می کنیم. برای تبدیل این اعداد به مبنایی غیر از ده از تقسیمات متوالی استفاده می شه. فرض کنید که می خوایم عدد 12 رو به مبنای دو ببریم. در این صورت باقی مونده ی تقسیم مقسوم (در این جا 12) به 2 راست ترین رقم عدد مبنای دو خواهد بود و خارج قسمت جای مقسوم رو می گیره و به همین ترتیب تا جایی که خارج قسمت برابر صفر بشه.
مثال:
6= 2 / 12
باقی مانده = 0 => عدد دودویی : 0
3= 2 / 6
باقی مانده = 0 => عدد دودویی : 00
1= 2 / 3
باقی مانده = 1 => عدد دودویی : 100
0= 2 / 1
باقی مانده = 1 => عدد دودویی : 1100
به همین سادگی!
در مورد تبدیل در هر مبنای دیگه ای هم از همین روش استفاده می کنیم. باید توجه کنید که مرتبه ی رقم های هر عدد از راست به چپ و از صفر شروع می شه. مثلاً مرتبه ی چپ ترین رقم در 1100، 3 خواهد بود.
حالا اگر بخوایم عدد دودویی به دست آمده رو به عدد دهدهی برگردونیم هر رقم رو در مبنا (این جا 2) به توان مرتبه ی رقم ضرب می کنیم و این ضرب ها رو با هم جمع می کنیم تا عدد دهدهی بدست بیاد:
1100 : 0x2^0 + 0x2^1 + 1x2^2 + 1x2^3 = 4 + 8 = 12
باید بدونید که هر عدد در مبنای دو رو به سادگی می شه به مبنای 8 و 16 برد.
برای تبدیل به مبنای 8، از سمت راست 3 تا 3 تا جدا می کنیم. عدد دهدهی مربوط به این سه رقم رو همون طور که بالا گفتم به دست میاریم.
مثال:
233 : 011 011 10 : 10011011
پس این عدد معادل 233 در مبنای هشته! برای مبنای 16 هم هر 4 رقم رو جدا می کنیم.
نکته ی پایانی این بخش در رابطه با اعداد اعشاریه. برای تبدیل این اعداد بخش صحیح رو به روشی که گفته شد تبدیل می کنیم اما برای بخش اعشاری از ضرب های متوالی استفاده می کنیم. در این جا شرط پایان نداریم و تعداد رقم های اعشار رو برامون مشخص می کنن. برای این کار قسمت اغشاری رو در مبنا ضرب می کنیم، قسمت صحیح این حاصل ضرب اولین رقم از سمت راست خواهد بود و قسمت اعشاری مجدداً ضرب می شه!
مثال برای عدد 0.36 تا 4 رقم اعشار:
0.72= 0.36 * 2
قسمت صحیح = 0 => عدد دودویی : 0
1.44= 0.72 * 2
قسمت صحیح = 1 => عدد دودویی : 10
0.88 = 0.44 * 2
قسمت صحیح = 0 => عدد دودویی : 010
1.76= 0.88 * 2
قسمت صحیح = 1 => عدد دودویی : 1010

این متن رو می تونید از طریق ضمیمه دانلود کنید.
امیدوارم به دردتون بخوره!
 

پیوست ها

  • Assembly._Tabdil e Mabna.rar
    12.4 کیلوبایت · بازدیدها: 1

sayyad84

متخصص زبان Assembly
کاربر ممتاز
با سلام،
تو قسمت اول راجع به مطالب زیر صحبت شد:
تبدیل مبناها
تبدیل عدد دهدهی به دودویی
تبدیل مبنا برای اعداد اعشاری

*/اگه سؤالی راجع به این قسمت دارید، "پاسخ با نقل قول" این پست رو بزنید و سؤالتون رو مطرح کنید. در غیر این صورت سؤالتون رو خارج از تاپیک مطرح کنید که پیوستگی مطلب حفظ بشه! متشکرم!/*
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
آموزش اسمبلی، قسمت دوم: مقدمات

آموزش اسمبلی، قسمت دوم: مقدمات

با سلام،
در این قسمت با رجیسترها و مقدمات برنامه نویسی اسمبلی آشنا می شوید.
در شکل زیر انواع ثبات ها را می بینید:


http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42053&d=1289808874


تمامی این ثبات ها 16 بیتی هستند.
گروه اول، ثبات های عمومی و دو گروه دیگر اشاره گر به حافظه اند.
هریک از ثبات های عمومی، دارای دو بخش High (برای مثال Ah) و Low (برای مثال Al) هستند.
ثبات IP، اشاره گر به شماره ی خط بعدی از برنامه است.
و ثبات Flag وضعیت برنامه را مشخص می کند. بیت های مهم این ثبات شامل:
بیت C: برای رقم نقلی، که اگر 1 باشد، نشانگر وجود رقم نقلی است.
بیت D: برای جهت مقایسه، که اگر 1 باشد، مقایسه ی دو رشته از راست به چپ صورت می گیرد.
بیت P: در صورتی یک است که تعداد بیت های شیفت داده شده زوج باشد.
بیت S: اگر حاصل منفی باشد، مقدار 1 خواهد داشت.

توجه داشته باشید که این زبان نسبت به بزرگ و کوچک بودن حروف حساس نیست.
دستور MOV:
این دستور مقدار عملوند 2 را در عملوند 1 قرار می دهد.
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=43580&d=1289808918​

محدودیت ها:
هر دو عملوند باید هم اندازه باشند.
عملوند اول باید باید ثبات و با حافظه باشد.
امکان انتقال از حافظه به حافظه وجود ندارد.
هر دو عملوند نمی توانند ثبات سگمنت باشند.
بنابراین این دستور همان عمل انتساب (مثلاً X=Y) است. در شکل فرم دستور و نمونه هایی از دستورات اشتباه را می بینید.
 

پیوست ها

  • Registers.JPG
    Registers.JPG
    24.2 کیلوبایت · بازدیدها: 0
  • move.JPG
    move.JPG
    5.1 کیلوبایت · بازدیدها: 0
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
دستور LEA:
این دستور آدرس آفست (Offset) عملوند 2 را در عملوند 1 قرار می دهد. در این دستور، عملوند 1 ثبات و عملوند 2 حافظه است.
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42055&d=1289809293

توجه کنید که آدرس آفست آدرس محل ذخیره ی عملوند دوم نسبت به ابتدای CS است. به جای این دستور می توانید از دستور mov نیز همان طور که در شکل نشان داده شده است، استفاده کنید.

دستورات PUSH و POP:
دستور push برای اضافه کردن عملوند به پشته و دستور pop برای برداشتن عملوند از بالای پشته استفاده می شوند.

http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42056&d=1289809335

همان طور که می دانید این دو دستور یک عملوند دارند که باید حتماً 16 بیتی باشد.
 

پیوست ها

  • lea.JPG
    lea.JPG
    4 کیلوبایت · بازدیدها: 0
  • PuPo.JPG
    PuPo.JPG
    2.2 کیلوبایت · بازدیدها: 0
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
دستورات INC و DEC:
دستور inc برای اضافه کردن یک واحد به عملوند و دستور dec برای کم کردن یک واحد از عملوند کاربرد دارند.
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42057&d=1289809431
بنابراین دستور inc معادل ++ و دستور dec معادل - - خواهند بود.

ساختار یک برنامه به زبان اسمبلی:
در شکل زیر ساختار برنامه به زبان اسمبلی رو می بینید:
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42058&d=1289809466
به غیر از قسمت data، سایر قسمت ها در هر برنامه ای وجود دارند و بدون آن ها برنامه دچار خطا می شود.
در قسمت model باید مدل حافظه را انتخاب کنیم. این مدل شامل small، medium، huge و غیره است.

در اغلب برنامه هایی که می نویسیم این مدل
small انتخاب می شود.
در قسمت stack، میزان حافظه ای که باید به پشته اختصاص یابد، را مشخص می کنیم. این مقدار نیز در اغلب برنامه ها 64h (64 در مبنای 16) است که برابر 64 کیلوبایت خواهد بود.
در قسمت data در صورتی که متغیری داشته باشیم، تعریف می شود. آدرس این بخش از حافظه باید توسط دستورات خطوط 6 و 7 در Data Segment قرار گیرد. بنابراین اگر این بخش را نداریم، این دو خط نیز حذف خواهند شد.
 

پیوست ها

  • inc_dec.JPG
    inc_dec.JPG
    2.1 کیلوبایت · بازدیدها: 0
  • Program.JPG
    Program.JPG
    8.5 کیلوبایت · بازدیدها: 0
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
فایل متنی قسمت دوم رو می تونید از این جا دانلود کنید.
 

پیوست ها

  • Assembly 01.rar
    31.9 کیلوبایت · بازدیدها: 2

sayyad84

متخصص زبان Assembly
کاربر ممتاز
با سلام،
تو قسمت دوم راجع به مطالب زیر صحبت شد:
آشنایی با تعدادی از دستورات اسمبلی : mov, lea, push, pop, inc, dec
آشنایی با ساختار یک برنامه ی اسمبلی
آشنایی با اجزای یک برنامه ی اسمبلی
*/اگه سؤالی راجع به این قسمت دارید، "پاسخ با نقل قول" این پست رو بزنید و سؤالتون رو مطرح کنید. در غیر این صورت سؤالتون رو خارج از تاپیک مطرح کنید که پیوستگی مطلب حفظ بشه! متشکرم!/*
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
آموزش اسمبلی، قسمت سوم: آشنایی با داده ها و وقفه ها

آموزش اسمبلی، قسمت سوم: آشنایی با داده ها و وقفه ها

باسلام،
تعریف داده ها در اسمبلی:
در اسمبلی انواع داده ها شامل db(Data Byte)، dw(Data Word و dd(Data Double Word می شوند. نوع داده ی db هشت بیتی، dw شانزده بیتی و نوع dd سی و دو بیتی است. در شکل زیر انواع داده ها را به همراه یک مثال می بینید:
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42060&d=1290411397

البته باید توجه داشته باشید که در برنامه های ساده و معمولی از نوع dd کم تر استفاده می شود و بیشتر استفاده از دو نوع دیگر است.
در خطوط 6 و 7، نحوه ی تعریف یک آرایه آورده شده است. توجه کنید که دسترسی به عناصر آرایه مانند زبان C از اندیس صفر آغاز می شود. اما تفاوت در شماره های بعدی است. به این صورت که در نوع db خانه ی بعدی با اندیس 1 فراخونی می شود، در نوع dw با اندیس 2 و در نوع dd با اندیس 4.
مثلاً برای دسترسی به عنصر دوم b باید بنویسیم: [b[2
البته می توان این کار را به شکل زیر هم انجام داد:
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42061&d=1290411452

همان طور که می دانید استفاده از ' ' به معنای کاراکتر و " " به معنای رشته است.
بعد از کلمه ی کلیدی dup، اگر داخل پرانتز 0 بگذارید، به معنای یک آرایه با مقادیر صفر است، اگر می خواهید این مقادیر بعداً افزوده شوند، می توانید از کاراکتر ? استفاده کنید.
 

پیوست ها

  • DataType.JPG
    DataType.JPG
    10.3 کیلوبایت · بازدیدها: 0
  • Array.JPG
    Array.JPG
    5.8 کیلوبایت · بازدیدها: 0
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
در زبان اسمبلی می توان از هر سه نوع داده ی باینری(b)، دسیمال و هگز(h استفاده کرد. برای این کار با قرار دادن حروف داخل پرانتز بعد از عدد مورد نظر امکان پذیر خواهد بود.

http://www.www.www.iran-eng.ir/attachment.php?attachmentid=43719&d=1296471203​
وقفه در اسمبلی:
در زبان اسمبلی این امکان وجود دارد که از وقفه های موجود در سیستم استفاده کنیم. از جمله این وقفه ها می توان به وقفه ی داس(21h)، وقفه ی بایوس(10h و 13h) اشاره کرد. هر یک از این وقفه ها سرویس های زیادی دارند که می توان آن ها را فراخوانی کرد.
برای فراخوانی سرویس، شماره ی سرویس را در قسمت High bit ثبات ax یعنی ah قرار می دهیم.
سایر ورودی های وقفه نیز در صورت وجود توسط ثبات های مربوطه مقداردهی شده و در پایان شماره ی وقفه توسط دستور int تعیین می گردد. برای مثال در عکس زیر، دو سرویس چاپ رشته و پاک کردن صفحه را می بینید:

توضیح:
برای عمل پاک کردن صفحه(CLS)، از سرویس 6h وقفه ی 10h استفاده می کنیم. ورودی های سرویس در عکس آمده است. نکته ی مهم نحوه ی بدست آوردن رنگ مورد نیاز است که در ادامه به آن می پردازیم:

http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42062&d=1290412330​

همان طور که در شکل می بینید بایت رنگ شامل 4 بیت با ارزش برای رنگ زمینه و 4 بیت دیگر برای رنگ قلم است. مثلاً رنگ استفاده شده در خط 15 یا همان 1fh برابر 0001 1111 است، یعنی رنگ زمینه ی آبی و رنگ قلم سفید روشن.
همین طور برای چاپ رشته از سرویس 9h وقفه ی 21h استفاده شده است.
سرویس پایانی نیز برای اعلام پایان برنامه به سیستم عامل است و باید در انتهای تمام برنامه ها قرار گیرد.
ورودی های این سرویس ها را نیز در شکل می بینید.
نکته:
در انتهای تعریف هر رشته باید کاراکتر نشان گر پایان رشته یا '$' را قرار داد. همان طور که در خط پنجم برنامه می بینید. در صورتی که به جای آن از 0dh,0ah استفاده کنید، پس از چاپ رشته کنترل به خط بعد می رود.(عملی همانند \n در زبان C)
برای درک بهتر برنامه، آن را به بلوک های جداگانه تقسیم کنید. این کار با یک خط خالی بین دو بخش به راحتی امکان پذیر است.
توجه داشته باشید که ورودی های هر سرویس دقیقاً در ثبات مربوطه وارد شوند، مثلاً قرار دادن آدرس رشته در ثبات bx منجر به چاپ نتیجه ی اشتباه خواهد شد.
 

پیوست ها

  • D_B_H.JPG
    D_B_H.JPG
    4.1 کیلوبایت · بازدیدها: 0
  • Cls_Puts_return.JPG
    Cls_Puts_return.JPG
    32.1 کیلوبایت · بازدیدها: 0
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
با سلام،
تو قسمت سوم راجع به مطالب زیر صحبت شد:
آشنایی با انواع داده ها در اسمبلی
آرایه ها در اسمبلی
آشنایی با وقفه ها و سرویس های آن ها
سرویس چاپ و پاک کردن صفحه
ضمناً می تونید از فایل ضمیمه، مطلب رو دانلود کنید.
*/اگه سؤالی راجع به این قسمت دارید، "پاسخ با نقل قول" این پست رو بزنید و سؤالتون رو مطرح کنید. در غیر این صورت سؤالتون رو خارج از تاپیک مطرح کنید که پیوستگی مطلب حفظ بشه! متشکرم!/*
 

پیوست ها

  • Assembly 02.rar
    110.5 کیلوبایت · بازدیدها: 1
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
فراهم کردن مقدمات برنامه نویسی با زبان اسمبلی

فراهم کردن مقدمات برنامه نویسی با زبان اسمبلی

با سلام،
برای این که کد نوشته شده رو به فایل exe تبدیل کنید لازمه که از یه اسمبلر استفاده کنید. برنامه ای که من در این تاپیک استفاده می کنم Masm 6.11 که می تونید از این جا دانلود کنید. دو قسمت در این پست و قسمت سوم در پست بعدی!
برای سهولت کار یه کپی از cmd که در windows\system32 قرار دارد را به پوشه ی bin منتقل کنید.
برای تایپ برنامه ها بهتره از یه محیط بهتر مثل ++notepad استفاده کنید که با یه سرچ کوچیک پیدا می شه!
اگه از سیستم های 64بیتی استفاده می کنید، Masm جوابگو نیست و بهتره از emu8086 استفاده کنید که در بخش اسمبلی و "مشکل با ویستا" لینک دانلودش رو پیدا می کنید.
 

پیوست ها

  • Masm v611.part2.rar
    1.4 مگایابت · بازدیدها: 1
  • Masm v611.part1.rar
    1.4 مگایابت · بازدیدها: 1

computer_soft

اخراجی موقت
با سلام،
تو قسمت سوم راجع به مطالب زیر صحبت شد:
آشنایی با انواع داده ها در اسمبلی
آرایه ها در اسمبلی
آشنایی با وقفه ها و سرویس هی آن ها
سرویس چاپ و پاک کردن صفحه
ضمناً می تونید از فایل ضمیمه، مطلب رو دانلود کنید.
*/اگه سؤالی راجع به این قسمت دارید، "پاسخ با نقل قول" این پست رو بزنید و سؤالتون رو مطرح کنید. در غیر این صورت سؤالتون رو خارج از تاپیک مطرح کنید که پیوستگی مطلب حفظ بشه! متشکرم!/*


فکر کنم یادتون رفت بگین space یا همون فاصله در زبان اسمبلی چه کد ای دارد؟
برای برنامه ی جدول ضرب میخوام .
با کد ای که مثل ربان سی t\ که 8 کاراکتر میبرد جلو .
تشکر از آموزش اش تون
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
فکر کنم یادتون رفت بگین space یا همون فاصله در زبان اسمبلی چه کد ای دارد؟
برای برنامه ی جدول ضرب میخوام .
با کد ای که مثل ربان سی t\ که 8 کاراکتر میبرد جلو .
تشکر از آموزش اش تون

با سلام،
هنوز به قسمت برنامه نویسی نرسیدیم و یه خروار نکته ی دیگه غیر از اینا که گفتید مونده!
قرار شد این سؤالا رو بیرون بپرسید اما برای space از 20h استفاده کنید و بره اون یکی از gotoxy!
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
آموزش اسمبلی، قسمت چهارم: نخستین برنامه

آموزش اسمبلی، قسمت چهارم: نخستین برنامه

با سلام،
در این قسمت، قصد داریم اولین برنامه را به زبان شیرین اسمبلی بنویسیم! در اغلب زبان ها به این برنامه Hello World گفته می شود. در طول این برنامه سعی داریم تا یک رشته در خروجی چاپ کنیم:
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42069&d=1292056718
برنامه را در Notepad بنویسید و با پسوند .asm در پوشه ی bin اسمبلر Masm ذخیره کنید. حالا فایل CMD را که در پوشه ی bin کپی کرده بودید، را اجرا کنید. برای تولید فایل اجرایی، به ترتیب دستورات زیر را اجرا کنید:
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42068&d=1292056716
با اجرای دستور masm، اسمبلر، برنامه را از نظر وجود خطا بررسی می کند. در صورت وجود خطا، این خطاها به همراه محل رخداد خطا گوشزد می شوند.
در صورتی که خطایی وجود نداشته باشد، اسمبلر فایلی هم نام فایل اصلی و با پسوند .obj ایجاد می کند. با اجرای دستور لینک، این فایل به فایل اجرایی تبدیل می گردد.
بعد از دستور Link می تواند به کمک 4 قسمت زیر اطلاعاتی را به برنامه اضافه کنید. مثلاً نام فایل خروجی (مورد اول) و کتابخانه های مورد استفاده (مورد سوم). در صورتی که نمی خواهید چیزی اضافه کنید، باید 4 بار Enter بزنید.
با بازگشت به خط آدرس (انتهای عکس)، در صورتی که خطایی رخ نداده باشد، برنامه ی شما با پسوند .exe آماده ی اجراست.
 

پیوست ها

  • CMD.JPG
    CMD.JPG
    36.5 کیلوبایت · بازدیدها: 0
  • P1_HW_S.JPG
    P1_HW_S.JPG
    16.5 کیلوبایت · بازدیدها: 0
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
با توجه به این که برنامه به دستور معادل return 0 می رسد، با اجرای مستقیم برنامه، خروجی را نخواهید دید. پس باید از محیط CMD برنامه را اجرا کنید. برای این کار در خط آدرس نام برنامه را تایپ کرده و Enter کنید. خروجی در شکل آمده است:
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42070&d=1292056994

در ضمن متن این قسمت رو هم می تونید از ضمیمه دانلود کنید.
 

پیوست ها

  • P1_HW.JPG
    P1_HW.JPG
    4.7 کیلوبایت · بازدیدها: 2
  • Assembly 03.rar
    110.5 کیلوبایت · بازدیدها: 1
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
تو قسمت چهارم راجع به مطالب زیر صحبت شد:
نوشتن اولین برنامه با زبان اسمبلی
نحوه ی اجرای برنامه ی اسمبلی
*/اگه سؤالی راجع به این قسمت دارید، "پاسخ با نقل قول" این پست رو بزنید و سؤالتون رو مطرح کنید. در غیر این صورت سؤالتون رو خارج از تاپیک مطرح کنید که پیوستگی مطلب حفظ بشه! متشکرم!/*
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
آموزش اسمبلی، قسمت پنجم: آشنایی با روش های آدرس دهی حافظه

آموزش اسمبلی، قسمت پنجم: آشنایی با روش های آدرس دهی حافظه

با سلام،
در این قسمت به روش های مختلف دسترسی به حافظه می پردازیم. در زیر این روش ها را با مثالی از هر کدام بررسی می کنیم:
(توجه داشته باشید که این مثال ها تنها بخشی از برنامه ی اصلی هستند و به تنهایی قابل استفاده نخواهند بود!)
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42072&d=1292577313
1.این روش، ساده ترین راه برای دسترسی به حافظه است. در این جا یک متغیر داریم و با استفاده از دستور mov مقدار مورد نظر را به آن منتسب می کنیم.
2.گاهی لازم است که مقداری را به آدرس خاصی منتسب کنیم. برای این کار از [] استفاده می کنیم و عددی داخل آن آدرس مورد نظر است. بعد از این دستور مقدار 14 در آدرس 3210قرار می گیرد.
روش آدرس دهی گفته شده با استفاده از آدرس آفست است، اما باید توجه داشت که به طور ضمنی از آدرس سگمنت نیز استفاده می شود. که به عنوان معادل دستور آورده شده است.
3.دسترسی به شیوه ی 2 چندان مناسب به نظر نمی رسد، خصوصاً زمانی که بخواهیم به چند آدرس پست سرهم دسترسی داشته باشیم. در این جا می توان آدرس مورد نظر را در ثبات bx قرار داد و مقدار آدرس شماره ی bx را تعیین کرد. در این مورد مقدار آدرس 3210 برابر 14 و مقدار آدرس 3211 برابر 15 خواهد شد.
4.در اسمبلرهای غیر هوشمند برای مشخص کردن مقدار بایت باید از byte ptr و word ptr استفاده شود. در این مثال، دستور خط 17 یک بایت از مقدار x را در ثبات al قرار می دهد.
5.این مثال طرقه ی دسترسی و تغییر یک کاراکتر در یک رشته را نشان می دهد. در این مثال اولین کاراکتر 'l' در کلمه ی Hello به 'O' تبدیل شده و کلمه به HelOoتبدیل خواهد شد.
در داخل [] تنها اجازه ی استفاده از bx، si و di را دارید. همین طور اعمال جمع و تفریق نیز در آن مجاز است.
اگر می خواهید که متغیری را بعداً مقداردهی کنید، باید از علامت ? استفاده کنید.
6.این مثال نحوه ی دسترسی و تغییر یکی از عناصر آرایه را نشان می دهد. روش به کار رفته در این جا راه دیگری برای تعریف یک آرایه ی عددی است که تعداد و مقدار عناصر آن مشخص است.
در این مثال به جای عدد 3 عدد 6 قرار می گیرد.
با دو مثالی که اخیراً دیدید معلوم می شود که ابتدای یک آرایه در اسمبلی با صفر آغاز می شود. یعنی در مثال 5 اگر bx با 0 جمع شود، کاراکتر 'H' تغییر خواهد کرد.
7.همان طور که گفته شد اعمال جمع و تفریق در داخل [] مجاز است. در این مثال عدد 4 جایگزین عدد 1 خواهد شد.
8.برای دسترسی راحت تر به عناصر آرایه ی یک بعدی می توان از خط 35 استفاده کرد. این کار بسیار به آن چیزی که در زبان های امروزی استفاده می شود، شباهت دارد.
در پایان: ضمناً می تونید متن این قسمت رو از اینجا دانلود کنید.
 

پیوست ها

  • Memory_A.jpg
    Memory_A.jpg
    27.9 کیلوبایت · بازدیدها: 0
  • Assembly 04.rar
    62.1 کیلوبایت · بازدیدها: 1
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
تو قسمت پنجم راجع به مطالب زیر صحبت شد:
روش های مختلف آدرس دهی به حافظه در اسمبلی
کار با آرایه های کاراکتری و عددی در اسمبلی
*/اگه سؤالی راجع به این قسمت دارید، "پاسخ با نقل قول" این پست رو بزنید و سؤالتون رو مطرح کنید. در غیر این صورت سؤالتون رو خارج از تاپیک مطرح کنید که پیوستگی مطلب حفظ بشه! متشکرم!/*
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
آموزش اسمبلی، قسمت پنجم

آموزش اسمبلی، قسمت پنجم

با سلام،
دستور equ:
از این دستور برای تعریف Constantها یا ثابت ها در اسمبلی استفاده می شود. به قطعه کد زیر توجه کنید:
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42075&d=1294741527
در این قطعه کد، اسمبلر هرجا که به دو ثابت cr و ln برسد، مقدار آن ها را با مقادیر تعیین شده، جایگزین می کند. همان طور که قبلاً هم اشاره شده بود، برای رفتن به سطر بعد در اسمبلی می توان از دو مقدار 0ah و 0dh قبل یا بعد از رشته استفاده کرد که معادل مقادیر دهدهی 10 و 13 هستند.
نکته این که برای مقداردهی یک متغیر با مقادیر Hex که در ابتدایشان حروف لاتین دارند، باید از یک صفر پیش از حرف استفاده کنید. در غیر این صورت برنامه دچار خطا می شود.
دستور xchg:
از این دستور برای جابه جایی یا swap کردن دو مقدار استفاده می شود. هر دو مقدار نمی توانند حافظه باشند و برای این کار باید از یک متغیر کمکی بهره گرفت. هم چنین باید توجه کنید که دو عملوند باید یک اندازه باشند.
فراخوانی وقفه های نرم افزاری:
همان طور که می دانید بردار وقفه در رم قرار دارد و آدرس روتین وقفه ها 4 بایت 4بایت پشت سر هم در رم قرار گرفته اند. مثلاً وقفه ی 10h در آدرس 64 است.
با رسیدن به فراخوانی وقفه آدرس خط بعد که شامل آدرس IP و آدرس CS است، در قالب 4 بایت در stack قرار می گیرد و به آدرس شروع وقفه در رم پرش می کند. با پایان اجرای وقفه و رسیدن به دستور IRET آدرس خط بعد از پشته برداشته شده و اجرای برنامه ادامه می یابد.
چاپ کاراکتر:
برای این کار از سرویس 2h وقفه ی 21h (وقفه ی داس) استفاده می کنیم. کاراکتر مورد نظر نیز در ثبات dl قرار می گیرد. البته می توانید ثبات dx را با کاراکتر مقداردهی کنید و خودبه خود مقدار کاراکتر در بخش dl قرار می گیرد.
همان طور که می بینید، ورود کاراکتر می تواند به دو صورت خود کاراکتر (مثلاً کاراکتر : ) و یا کد آن باشد (مثلاً مقدار 20h یا 32 معادل کاراکتر فاصله است).
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42074&d=1294741516​
 

پیوست ها

  • Putc.JPG
    Putc.JPG
    5.5 کیلوبایت · بازدیدها: 0
  • EQU.JPG
    EQU.JPG
    5.6 کیلوبایت · بازدیدها: 0
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
تعیین موقعیت مکان نما:
برای این کار از سرویس 2h وقفه ی 10h (وقفه ی بایوس) استفاده می کنیم. ورودی های این سرویس dh برای سطر، dl برای ستون و bh برای شماره ی صفحه است.

http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42076&d=1294741790
خواندن کاراکتر از ورودی:
برای این کار از سرویس 1h وقفه ی 21h استفاده می کنیم. بعد از این دستور کاراکتر ورودی نمایش داده شده و ودر ثبات al ذخیره می گردد.

در صورتی که بخواهید کاراکتر نمایش داده نشود از سرویس 8h استفاده کنید.
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42077&d=1294741792​
 

پیوست ها

  • Gotoxy.JPG
    Gotoxy.JPG
    4.3 کیلوبایت · بازدیدها: 0
  • Getc.JPG
    Getc.JPG
    5.6 کیلوبایت · بازدیدها: 0
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
خواندن رشته از ورودی:
برای این کار نیز از سرویس 0ah از وقفه ی 21h استفاده می کنیم. آدرس محل ذخیره ی رشته نیز باید در ثبات dx قرر گیرد. توجه داشته باشید که برای این کار حتماً باید از ساختمان داده ای استفاده کنیم که دو بایت اول آن برای حداکثر رشته و طول واقعی آن جدا شده باشد. برای این کار از دستور label استفاده می کنیم.
http://www.www.www.iran-eng.ir/attachment.php?attachmentid=42078&d=1294742001
در این صورت برای دسترسی به رشته ی اصلی باید از String[2 استفاده کنیم. طول رشته هم در len قرار خواهد گرفت.

متن این قسمت رو هم می تونید از این جا دانلود کنید.
 

پیوست ها

  • Gets.JPG
    Gets.JPG
    10.5 کیلوبایت · بازدیدها: 0
  • Assembly 05.rar
    67.5 کیلوبایت · بازدیدها: 1
آخرین ویرایش توسط مدیر:

sayyad84

متخصص زبان Assembly
کاربر ممتاز
تو قسمت ششم راجع به مطالب زیر صحبت شد:
آشنایی با دستورات equ و xchg
سرویس های چاپ کاراکتر و خواندن آن، خواندن رشته از ورودی و تعیین موقعیت مکان نما در زبان اسمبلی
*/اگه سؤالی راجع به این قسمت دارید، "پاسخ با نقل قول" این پست رو بزنید و سؤالتون رو مطرح کنید. در غیر این صورت سؤالتون رو خارج از تاپیک مطرح کنید که پیوستگی مطلب حفظ بشه! متشکرم!/*

 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
آموزش اسمبلی، قسمت ششم: محاسبات در اسمبلی

آموزش اسمبلی، قسمت ششم: محاسبات در اسمبلی

با سلام،
1.محاسبات اعداد بدون علامت در اسمبلی
نکته:
اگر نتیجه ی محاسبات در در ثبات مورد نظر جا نشود، فلگ CF برابر یک می شود (Set می شود). برای مثال اگر ثبات ما هشت بیتی باشد و نتیجه در هشت بیت جا نشود، این فلگ مقدار می گیرد.
در صورتی که در همان مثال بیت هفتم تغییر علامت دهد، Overflow Flag (OF) برابر یک می شود.
دستورات Add و Sub
از این دستور مانند جمع معمولی استفاده می شود. در تصویر نحوه استفاده از این دو دستور را می بینید:
AddSub.JPG
منظور از عملگر += این است که عملوند 1 با عملوند 2 جمع شده و نتیجه در عملوند 1 قرار می گیرد. بنابراین تنها عملوند 2 دست نخورده باقی می ماند.
نکته ی قابل توجه این که دو عملوند می توانند هر ترکیبی از "ثبات" و "حافظه" باشند، و یا عملوند 2 یک عدد باشد، اما هر دو عملوند نمی توانند حافظه باشند.
توجه داشته باشید که در نتیجه ی این اعمال ممکن است مقدار فلگ ها نیز تغییر کند. مثلاً با صفر شدن حاصل، فلگ Z و با تعییر علامت آن فلگ S مقدار خواهند گرفت.
دستورات ADC و SBB
نحوه ی استفاده از این دستورات هم مانند دو دستور قبلی است، با این تفاوت که این دو دستور مقدار موجود در فلگ CF را نیز به حاصل اضافه یا از آن کم می کنند.
اغلب از این دستورات در مواردی استفاده می شود که بخواهیم چند جمع یا تفریق پیاپی داشته باشیم. مثلاً جمع یا تفریق دو کلمه ی مضاعف و یا حتی خانه های متناظر دو آرایه.
مثلاً برای جمع دو عدد 32 بیتی لازم است که آن را در دو بخش 16 بیتی ذخیره کنیم. حال بخش های کم ارزش را با هم ADD می کنیم و از آن جا که ممکن است یه رقم نقلی حاصل از این بخش داشته باشیم، بخش های پرارزش را با هم ADC می کنیم تا رقم نقلی مرحله ی قبل هم به حاصل اضافه گردد.
مثلاً در قطعه کد مقابل، x[2 بخش کم ارزش و x[0 بخش پرارزش عدد 32 بیتی x است.
ADC.JPG

 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
دستور MUL و DIV
از این دستورات نیز برای ضرب و تقسیم اعداد استفاده می کنیم. برخلاف زبان های دیگر، در اسمبلی، این دو دستور تنها یک عملوند دارند و عملوند دیگر حتماً باید در ثبات Ax قرار گیرد. یعنی مقسوم در عمل تقسیم و مضروب فیه در عمل ضرب.
عملوند این دو دستور می تواند ثبات، حافظه یا یک مقدار ثابت باشد.
دستور ضرب:
در تصویر نحوه ی استفاده از این دستور آورده شده است.
باید توجه داشته باشید که در صورت ضرب دو عدد 8 بیتی که مثلاً در نتیجه 16 بیتی شده و در ثبات Ax قرار می گیرد و در صورت ضرب دو عدد 16 بیتی حاصل 32 بیتی در Dx:Ax خواهد بود.
mul.JPG
در تصویر منظور از a، al یا ax است، که یکی از عوامل ضرب باید در آن قرار گیرند.
همان طور که می بینید، دو عدد 8 بیتی ضرب شده و حاصل 16 بیتی در z قرار گرفته است.
دستور تقسیم:
برای عمل تقسیم حتماً باید مقسوم در ثبات ax قرار گیرد. نکته ی قابل توجه این که همواره مقسوم باید دو برابر تعداد بیت های مقسوم علیه باشد، یعنی اگر مقسوم علیه 8 بیتی است (مانند bl)، مقسوم باید 16 بیتی باشد مانند ax . همین طور اگر مقسوم علیه 16 بیتی باشد، مقسوم باید 32 بیتی انتخاب شود که برای این کار از Dx:Ax استفاده می شود. برای این کار کافی است که مقسوم را در ax قرار دهید و مقدار dx را صفر کنید.
پس از انجام عمل تقسیم بر یک مقدار 8 بیتی، خارج قسمت در al و باقی مانده در ah قرار می گیرد و در صورت 16 بیتی بودن مقسوم، خارج قسمت در ax و باقی مانده در dx خواهند بود.
برای مثال:
Div.JPG

 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
تو قسمت هفتم راجع به مطالب زیر صحبت شد:
محاسبات اعداد بدون علامت در اسمبلی
شامل:
Add، ADC، Sub، SBB، Mul، Div
در ضمن متن این بخش رو هم می تونید از طریق ضمیمه دانلود کنید.
*/اگه سؤالی راجع به این قسمت دارید، "پاسخ با نقل قول" این پست رو بزنید و سؤالتون رو مطرح کنید. در غیر این صورت سؤالتون رو خارج از تاپیک مطرح کنید که پیوستگی مطلب حفظ بشه! متشکرم!/*


 

پیوست ها

  • Assembly 06.rar
    73.3 کیلوبایت · بازدیدها: 1

Ros3

عضو جدید
تو قسمت چهارم راجع به مطالب زیر صحبت شد:
نوشتن اولین برنامه با زبان اسمبلی
نحوه ی اجرای برنامه ی اسمبلی
*/اگه سؤالی راجع به این قسمت دارید، "پاسخ با نقل قول" این پست رو بزنید و سؤالتون رو مطرح کنید. در غیر این صورت سؤالتون رو خارج از تاپیک مطرح کنید که پیوستگی مطلب حفظ بشه! متشکرم!/*

درود بر شما دوست عزیز:smile:
من تمام اون کارایی که گفتید واسه اجرای یه فایل لازمه رو انجام دادم و رسیدم به قسمت دستور masm و این دستور رو اجرا کردم . فایل با پسوند obj ایجاد شد بدون هیچ اروری،
بعدش که خواستم یه فایل اجرایی درست کنه ، یعنی دستور link رو که میزنم هیچ کاری نمیکنه. فایل exe هم تو اون دایرکتوری نمیسازه!:surprised:
لطفا منو راهنمایی کنید.
یه سوال دیگه هم خیلی فکرمو مشغول کرده!!!
چرا تو این تاپیک گزینه تشکر برای من فعال نیستش؟!!
شاد باشد:gol:
 

sayyad84

متخصص زبان Assembly
کاربر ممتاز
درود بر شما دوست عزیز:smile:
من تمام اون کارایی که گفتید واسه اجرای یه فایل لازمه رو انجام دادم و رسیدم به قسمت دستور masm و این دستور رو اجرا کردم . فایل با پسوند obj ایجاد شد بدون هیچ اروری،
بعدش که خواستم یه فایل اجرایی درست کنه ، یعنی دستور link رو که میزنم هیچ کاری نمیکنه. فایل exe هم تو اون دایرکتوری نمیسازه!:surprised:
لطفا منو راهنمایی کنید.
یه سوال دیگه هم خیلی فکرمو مشغول کرده!!!
چرا تو این تاپیک گزینه تشکر برای من فعال نیستش؟!!
شاد باشد:gol:
با سلام،
ممنون از توجه تون!
نقل قول از پست 17
بعد از دستور Link می توانید به کمک 4 قسمت زیرین اطلاعاتی را به برنامه اضافه کنید. مثلاً نام فایل خروجی (مورد اول) و کتابخانه های مورد استفاده (مورد سوم). در صورتی که نمی خواهید چیزی اضافه کنید، باید 4 بار Enter بزنید.
با بازگشت به خط آدرس (انتهای عکس)، در صورتی که خطایی رخ نداده باشد، برنامه ی شما با پسوند .exe آماده ی اجراست.
آیا بعد از دستورlink چهار بار اینتر زدید؟
در مورد سؤال دوم هم فکر می کنم پون زمان زیادی از پست ها گذشته تشکرها غیر فعال شده! البته نیازی به تشکر هم نیست! امیدوارم که بتونم کمکی کنم!
 

Similar threads

بالا