تالارهای پادشاه ایرانی

بازگشت   تالارهای پادشاه ایرانی > علمی فرهنگی > علوم ریاضی و فنی > مهندسی الکترونیک

مهندسی الکترونیک تمامی مباحث الکترونیک در اينجا

پاسخ
 
ابزارهای تاپیک

  #11  
قدیمی 13/11/2011
آواتار k2318
k2318 k2318 آفلاین است
تازه وارد
 

نام: kazem
جنسيت: مرد
محل سکونت: darab
مدرک تحصيلی: کارشناسی
پست: 1
سپاس: 0
از این کاربر 0 بار در 0 پست سپاسگزاری شده
اعتراض ها: 0
به این کاربر 0 بار در 0 پست اعتراض شده
چوب: 0
سلاممن یک برنامه ای می خوام به زبان بیسیکیک پتاننسیومتر به ورودی میکرو می دهیم و در خروجی بر روی ال سی دی نمایش دهد اگر با زیاد کردن پتانسیومتر بین 0تا100نشان دادیک ال ای دیروشن شود اگر 100تا200نشانداد 2 ال ای دی روشن شود و الی تا اخر مثلا تا 8 ال ای دی راستی باید به ورودی پتانسیومتر بین0تا5 ولت بدهیم (فقط كاربران عضو مجاز به دیدن لینک ها هستند)
پاسخ با نقل قول

آموزش زبان اسمبلی (قسمت اول)
  #12  
قدیمی 17/02/2012
آواتار asuka
asuka asuka آفلاین است
كاربر عالی
 

نام: Mohamadreza
جنسيت: مرد
شغل: Daneshjoo
پست: 629
سپاس: 770
از این کاربر 1,244 بار در 588 پست سپاسگزاری شده
اعتراض ها: 0
به این کاربر 0 بار در 0 پست اعتراض شده
چوب: 27
آموزش زبان اسمبلی (قسمت اول)

درود به همه شما دوستان گرامی!
امروز میخوایم به سراغ زبان اسمبلی بریم.
همونطور که میدونید زبان اسمبلی، بسیار شبیه به زبان ماشین است. از اینرو سطح پایین ترین زبان به شمار میرود.
از اون جایی که دوست ندارم هیچ کاری رو از وسطش شروع کنم، آموزش اسمبلی رو هم از اول اول شروع می کنیم!
در ابتدا از سیستم اعداد شروع می کنیم. البته این قسمت های اولیه رو به طور خلاصه توضیح می دم که خیلی حوصله تون سر نره!
در کامپیوتر نیاز به دو مبنای 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
__________________
Nothing is true
Everything is permitted
پاسخ با نقل قول
کاربر زیر بخاطر پست مفید از asuka سپاسگزاری کرده اند :

آموزش برنامه نویسی به زبان اسمبلی (قسمت دوم)
  #13  
قدیمی 17/02/2012
آواتار asuka
asuka asuka آفلاین است
كاربر عالی
 

نام: Mohamadreza
جنسيت: مرد
شغل: Daneshjoo
پست: 629
سپاس: 770
از این کاربر 1,244 بار در 588 پست سپاسگزاری شده
اعتراض ها: 0
به این کاربر 0 بار در 0 پست اعتراض شده
چوب: 27
آموزش برنامه نویسی به زبان اسمبلی (قسمت دوم)

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





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

توجه داشته باشید که این زبان نسبت به بزرگ و کوچک بودن حروف حساس نیست.
دستور MOV:
این دستور مقدار عملوند 2 را در عملوند 1 قرار می دهد.

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

دستور LEA:
این دستور آدرس آفست (Offset) عملوند 2 را در عملوند 1 قرار می دهد. در این دستور، عملوند 1 ثبات و عملوند 2 حافظه است.


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

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



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

دستورات INC و DEC:
دستور inc برای اضافه کردن یک واحد به عملوند و دستور dec برای کم کردن یک واحد از عملوند کاربرد دارند.

بنابراین دستور inc معادل ++ و دستور dec معادل - - خواهند بود.

ساختار یک برنامه به زبان اسمبلی:
در شکل زیر ساختار برنامه به زبان اسمبلی رو می بینید:

به غیر از قسمت data، سایر قسمت ها در هر برنامه ای وجود دارند و بدون آن ها برنامه دچار خطا می شود.
در قسمت model باید مدل حافظه را انتخاب کنیم. این مدل شامل small، medium، huge و غیره است.

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

آموزش برنامه نویسی به زبان اسمبلی (قسمت سوم)
  #14  
قدیمی 17/02/2012
آواتار asuka
asuka asuka آفلاین است
كاربر عالی
 

نام: Mohamadreza
جنسيت: مرد
شغل: Daneshjoo
پست: 629
سپاس: 770
از این کاربر 1,244 بار در 588 پست سپاسگزاری شده
اعتراض ها: 0
به این کاربر 0 بار در 0 پست اعتراض شده
چوب: 27
آموزش برنامه نویسی به زبان اسمبلی (قسمت سوم)

تعریف داده ها در اسمبلی:
در اسمبلی انواع داده ها شامل db(Data Byte)، dw(Data Word و dd(Data Double Word می شوند. نوع داده ی db هشت بیتی، dwشانزده بیتی و نوع dd سی و دو بیتی است. در شکل زیر انواع داده ها را به همراه یک مثال می بینید:

البته باید توجه داشته باشید که در برنامه های ساده و معمولی از نوع dd کم تر استفاده می شود و بیشتر استفاده از دو نوع دیگر است.
در خطوط 6 و 7، نحوه ی تعریف یک آرایه آورده شده است. توجه کنید که دسترسی به عناصر آرایه مانند زبان C از اندیس صفر آغاز می شود. اما تفاوت در شماره های بعدی است. به این صورت که در نوع db خانه ی بعدی با اندیس 1 فراخونی می شود، در نوع dw با اندیس 2 و در نوعdd با اندیس 4.
مثلاً برای دسترسی به عنصر دوم b باید بنویسیم: [b[2
البته می توان این کار را به شکل زیر هم انجام داد:

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

آموزش برنامه نویسی به زبان اسمبلی (قسمت چهارم)
  #15  
قدیمی 17/02/2012
آواتار asuka
asuka asuka آفلاین است
كاربر عالی
 

نام: Mohamadreza
جنسيت: مرد
شغل: Daneshjoo
پست: 629
سپاس: 770
از این کاربر 1,244 بار در 588 پست سپاسگزاری شده
اعتراض ها: 0
به این کاربر 0 بار در 0 پست اعتراض شده
چوب: 27
آموزش برنامه نویسی به زبان اسمبلی (قسمت چهارم)

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


وقفه در اسمبلی:
در زبان اسمبلی این امکان وجود دارد که از وقفه های موجود در سیستم استفاده کنیم. از جمله این وقفه ها می توان به وقفه ی داس(21h)، وقفه ی بایوس(10h و 13h) اشاره کرد. هر یک از این وقفه ها سرویس های زیادی دارند که می توان آن ها را فراخوانی کرد.
برای فراخوانی سرویس، شماره ی سرویس را در قسمت High bit ثبات ax یعنی ah قرار می دهیم.
سایر ورودی های وقفه نیز در صورت وجود توسط ثبات های مربوطه مقداردهی شده و در پایان شماره ی وقفه توسط دستور int تعیین می گردد. برای مثال در عکس زیر، دو سرویس چاپ رشته و پاک کردن صفحه را می بینید:

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


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

آموزش برنامه نویسی به زبان اسمبلی (قسمت پنجم)
  #16  
قدیمی 17/02/2012
آواتار asuka
asuka asuka آفلاین است
كاربر عالی
 

نام: Mohamadreza
جنسيت: مرد
شغل: Daneshjoo
پست: 629
سپاس: 770
از این کاربر 1,244 بار در 588 پست سپاسگزاری شده
اعتراض ها: 0
به این کاربر 0 بار در 0 پست اعتراض شده
چوب: 27
آموزش برنامه نویسی به زبان اسمبلی (قسمت پنجم)

در این قسمت، قصد داریم اولین برنامه را به زبان شیرین اسمبلی بنویسیم! در اغلب زبان ها به این برنامه Hello World گفته می شود. در طول این برنامه سعی داریم تا یک رشته در خروجی چاپ کنیم:


برنامه را در Notepad بنویسید و با پسوند .asm در پوشه ی bin اسمبلر Masm ذخیره کنید. حالا فایل CMD را که در پوشه ی bin کپی کرده بودید، را اجرا کنید. برای تولید فایل اجرایی، به ترتیب دستورات زیر را اجرا کنید:


با اجرای دستور masm، اسمبلر، برنامه را از نظر وجود خطا بررسی می کند. در صورت وجود خطا، این خطاها به همراه محل رخداد خطا گوشزد می شوند.
در صورتی که خطایی وجود نداشته باشد، اسمبلر فایلی هم نام فایل اصلی و با پسوند .obj ایجاد می کند. با اجرای دستور لینک، این فایل به فایل اجرایی تبدیل می گردد.
بعد از دستور Link می تواند به کمک 4 قسمت زیر اطلاعاتی را به برنامه اضافه کنید. مثلاً نام فایل خروجی (مورد اول) و کتابخانه های مورد استفاده (مورد سوم). در صورتی که نمی خواهید چیزی اضافه کنید، باید 4 بار Enter بزنید.
با بازگشت به خط آدرس (انتهای عکس)، در صورتی که خطایی رخ نداده باشد، برنامه ی شما با پسوند .exe آماده ی اجراست.


با توجه به این که برنامه به دستور معادل return 0 می رسد، با اجرای مستقیم برنامه، خروجی را نخواهید دید. پس باید از محیط CMD برنامه را اجرا کنید. برای این کار در خط آدرس نام برنامه را تایپ کرده و Enter کنید. خروجی در شکل آمده است:






در این قسمت به روش های مختلف دسترسی به حافظه می پردازیم. در زیر این روش ها را با مثالی از هر کدام بررسی می کنیم:
(توجه داشته باشید که این مثال ها تنها بخشی از برنامه ی اصلی هستند و به تنهایی قابل استفاده نخواهند بود!)
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 استفاده کرد. این کار بسیار به آن چیزی که در زبان های امروزی استفاده می شود، شباهت دارد.
__________________
Nothing is true
Everything is permitted
پاسخ با نقل قول

آموزش برنامه نویسی به زبان اسمبلی (قسمت ششم)
  #17  
قدیمی 17/02/2012
آواتار asuka
asuka asuka آفلاین است
كاربر عالی
 

نام: Mohamadreza
جنسيت: مرد
شغل: Daneshjoo
پست: 629
سپاس: 770
از این کاربر 1,244 بار در 588 پست سپاسگزاری شده
اعتراض ها: 0
به این کاربر 0 بار در 0 پست اعتراض شده
چوب: 27
آموزش برنامه نویسی به زبان اسمبلی (قسمت ششم)

دستور equ:
از این دستور برای تعریف Constantها یا ثابت ها در اسمبلی استفاده می شود. به قطعه کد زیر توجه کنید:

در این قطعه کد، اسمبلر هرجا که به دو ثابت 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 معادل کاراکتر فاصله است).




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


خواندن کاراکتر از ورودی:
برای این کار از سرویس 1h وقفه ی 21h استفاده می کنیم. بعد از این دستور کاراکتر ورودی نمایش داده شده و ودر ثبات al ذخیره می گردد.

در صورتی که بخواهید کاراکتر نمایش داده نشود از سرویس 8h استفاده کنید.



خواندن رشته از ورودی:
برای این کار نیز از سرویس 0ah از وقفه ی 21h استفاده می کنیم. آدرس محل ذخیره ی رشته نیز باید در ثبات dx قرر گیرد. توجه داشته باشید که برای این کار حتماً باید از ساختمان داده ای استفاده کنیم که دو بایت اول آن برای حداکثر رشته و طول واقعی آن جدا شده باشد. برای این کار از دستور label استفاده می کنیم.

در این صورت برای دسترسی به رشته ی اصلی باید از String[2 استفاده کنیم. طول رشته هم در len قرار خواهد گرفت.



__________________
Nothing is true
Everything is permitted
پاسخ با نقل قول
کاربر زیر بخاطر پست مفید از asuka سپاسگزاری کرده اند :

آموزش برنامه نویسی به زبان اسمبلی (قسمت هفتم {محاسبات در اسمبلی})
  #18  
قدیمی 17/02/2012
آواتار asuka
asuka asuka آفلاین است
كاربر عالی
 

نام: Mohamadreza
جنسيت: مرد
شغل: Daneshjoo
پست: 629
سپاس: 770
از این کاربر 1,244 بار در 588 پست سپاسگزاری شده
اعتراض ها: 0
به این کاربر 0 بار در 0 پست اعتراض شده
چوب: 27
آموزش برنامه نویسی به زبان اسمبلی (قسمت هفتم {محاسبات در اسمبلی})

1.محاسبات اعداد بدون علامت در اسمبلی
نکته:
اگر نتیجه ی محاسبات در در ثبات مورد نظر جا نشود، فلگ CF برابر یک می شود (Set می شود). برای مثال اگر ثبات ما هشت بیتی باشد و نتیجه در هشت بیت جا نشود، این فلگ مقدار می گیرد.
در صورتی که در همان مثال بیت هفتم تغییر علامت دهد، Overflow Flag (OF) برابر یک می شود.
دستورات Add و Sub
از این دستور مانند جمع معمولی استفاده می شود. در تصویر نحوه استفاده از این دو دستور را می بینید:


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




دستور MUL و DIV
از این دستورات نیز برای ضرب و تقسیم اعداد استفاده می کنیم. برخلاف زبان های دیگر، در اسمبلی، این دو دستور تنها یک عملوند دارند و عملوند دیگر حتماً باید در ثبات Ax قرار گیرد. یعنی مقسوم در عمل تقسیم و مضروب فیه در عمل ضرب.
عملوند این دو دستور می تواند ثبات، حافظه یا یک مقدار ثابت باشد.
دستور ضرب:
در تصویر نحوه ی استفاده از این دستور آورده شده است.
باید توجه داشته باشید که در صورت ضرب دو عدد 8 بیتی که مثلاً در نتیجه 16 بیتی شده و در ثبات Ax قرار می گیرد و در صورت ضرب دو عدد 16 بیتی حاصل 32 بیتی در Dx:Ax خواهد بود.

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






__________________
Nothing is true
Everything is permitted
پاسخ با نقل قول

شيفت دادن نوشته روي lcd 16*2
  #19  
قدیمی 18/02/2012
آواتار asuka
asuka asuka آفلاین است
كاربر عالی
 

نام: Mohamadreza
جنسيت: مرد
شغل: Daneshjoo
پست: 629
سپاس: 770
از این کاربر 1,244 بار در 588 پست سپاسگزاری شده
اعتراض ها: 0
به این کاربر 0 بار در 0 پست اعتراض شده
چوب: 27
شيفت دادن نوشته روي lcd 16*2

برنامه زير با كامپايلر بسكام نوشته شده و بسيار جالب است اين برنامه روي ال سي دي 2*16 است كه نوشته ها روي آن حركت كرده و اگر تعداد حروف (اندازه نوشته) تغيير كند نحوه نمايش نوشته روي ال سي دي نيز تغيير ميكند آي سي به كار رفته در اين برنامه atmega16 با كريستال 10000 ميباشد



$regfile = "m16def.dat" : $crystal = 1000000

Config Lcdpin = Pin , Rs = Pinc.0 , Db4 = Pinc.4 , Db5 = Pinc.5 , Db6 = Pinc.6 , Db7 = Pinc.7 , E = Pinc.2
Config Lcd = 16 * 2 : Cursor Off : Cls

Dim Ss As String * 255 , S As String * 16
Dim B As Byte , C As Byte , A As Byte

Ss = "happy birthday to you i wish you will be happy - (فقط كاربران عضو مجاز به دیدن لینک ها هستند) - asuka"

Do

B = Len(ss)

If B < 17 Then :

For A = 16 To 1 Step -1
S = Mid(ss , A , 1 ) : Locate 1 , A : Lcd S
Waitms 200
Next

Wait 1

For A = 1 To 16
Locate 1 , A : Lcd " "
Waitms 200
Next

Wait 1

Else :

S = Left(ss , 16)

For A = 15 To 1 Step -1
Locate 1 , A : Lcd S
Waitms 200
Next

C = B - 16

For A = 2 To C
S = Mid(ss , A , 16 ) : Locate 1 , 1 : Lcd S
Waitms 200
Next

For A = 16 To 1 Step -1
S = Right(ss , A) : Locate 1 , 1 : Lcd S ; " "
Waitms 200
Next

Locate 1 , 1 : Lcd " " : Wait 1

End If

Loop

End
__________________
Nothing is true
Everything is permitted
پاسخ با نقل قول

آشنایی با تراشه های fpga
  #20  
قدیمی 04/03/2012
آواتار asuka
asuka asuka آفلاین است
كاربر عالی
 

نام: Mohamadreza
جنسيت: مرد
شغل: Daneshjoo
پست: 629
سپاس: 770
از این کاربر 1,244 بار در 588 پست سپاسگزاری شده
اعتراض ها: 0
به این کاربر 0 بار در 0 پست اعتراض شده
چوب: 27
آشنایی با تراشه های fpga

fpga
ها آخرین نسل از خانواده میکروکنترلرها می باشند که حداکثر انعطاف پذیری را در طراحی و پیاده سازی انواع سخت افزار رادارند.در واقع FPGA هاتراشه هایی خام هستند که از تعداد بسیار زیادی گیت های منطقی پایه(مانند گیت هایAND ،OR ،Mux و...)تشکیل شده اند که به وسیله سوئیچ های قابل برنامه ریزی به یکدیگر ارتباط دارند که بسته به تکنولوژی ساخت انواع مختلفی دارند.
برای برنامه ریزی(Program )کردن FPGA ها زبان های متعددی وجود دارد. زبان هایی از قبیل ABEL ،AHDL ،VHDL ،Verilog و...
زبان VHDL زبان استانداردی است که همه کامپایلرهایی که توسط شرکت های مختلف(در صورت قدم نهادن در این راه نام شرکت هایXilinx ،Actel،Alteraو چندین شرکت دیگر را به وفور خواهید دید)ارائه شده آن را پشتیبانی می کنند.
هر یک از این شرکتها نرم افزاری را به بازار عرضه کرده اند که آن ها را نه چندان راحت! می توان تهیه واستفاده کرد.
نرم افزار Quartus ارائه شده توسط شرکت Altera
نرم افزارXilinx ISE ارئه شده توسط شرکت Xilinx
نرم افزار Active HDL ارائه شده توسط شرکت Actel
و....
از بین آنها نرم افزار Quartus محبوبیت زیادی دارد ولی متاسفانه من موفق به تهیه آن نشدم ، یعنی تهیه کردم ولی هر کدام به دلیلی اجرا نشدند; یکیش فایل licence را می خواست; یکیش نصب میشد درست اجرا نمی شد...(می دونید که این نرم افزارها کرک شده هستندو...)
و پس از کش و قوس فراوان با نرم افزار Xilinx ISE7.1 راه افتادم که کار با اون ساده است.
حال با این آشنایی مختصر شما را با منابع موجود آشنا می کنم:
1-آشنایی با FPGA و زبان VHDL ،اثر دکتر سید رضی ،انتشارات ناقوس، همراه با نرم افزار Quartus .این کتاب با اینکه نرم افزارآن نصب نشد ولی برای یادگیری زبان VHDL کتابی خوبیه
2-آشنایی با FPGA وزبان VHDL ،اثر کاوه فارغی،انتشارات کامپیوتر پایتخت،همراه با نرم افزار 7.1 Xilinx ISE و modelism (نرم افزار modelism توسط شرکت Xilinx ارائه شده است که درواقع مکمل Xilinx ISE میباشد وبرای شبیه سازی طرح است و بررسی عملکرد طرح است)،زبان VHDL را خیلی خلاصه گفته ولی بخشی در رابطه با برد آموزشی داره که فصل خوبیه،البته این کتاب از زیر چاپ دراومده با انتشاراتش که تماس گرفتم گفتند ویرایش جدیدش رو در نمایشگاه کتاب تهرون عرضه مکنن(من از این کتاب یه نسخه اضافه دارم اگر تصمیم گرفتید اینو تهیه کنین ولی گیروتون نیمد می تونم براتون پستش کنم)
3-آموزش VHDL با مثال،اثر داگلاس پری،ترجمه فرزاد شکاری زاده، انتشارات؟؟؟.
همرا با نرم افزارهای:modelism،Xilinx ISE5 وچند نرم افزار دیگر که کابرد زیادی ندارند.
عمکرد این نرم افزارها تقریبا" مثله همه و تفاوت زیادی با هم ندارن.
اگر در این زمینه سوءالی داشتید در خدمتتون هستم.
__________________
Nothing is true
Everything is permitted
پاسخ با نقل قول
پاسخ


ابزارهای تاپیک

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

کد بی بیفعال است
شکلک ها فعال است
کد [IMG] فعال است
کدهای HTML غیر فعال است



زمان محلی شما با تنظیم GMT +4.5 هم اکنون 17:34 میباشد.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Copyright © 2006 - 2018 ParsiKing. All Rights Reserved to Parsiking Group
دامین های زیر جهت ارائه خدمات در مالکیت سایت پادشاه ایرانی می باشد
parsiking.com - parsiking.biz - parsiking.org - parsiking.net - parsiking.in - parsiking.ir
vBCredits v1.4 Copyright ©2007 - 2008, PixelFX Studios