دانلود مقاله کامل درباره آموزش ویژوال بیسیک

دانلود مقاله کامل درباره آموزش ویژوال بیسیک

لینک پرداخت و دانلود *پایین مطلب*
فرمت فایل:Word (قابل ویرایش و آماده پرینت)
تعداد صفحه: 80

 

تابع Array  :

این تابع برای تعریف یک آرایه از نوع variant ( با نوع مختلف ) در زمان اجرا مورد استفاده قرار می گیرد و به صورت زیر به کار می رود :

چنانچه در این تابع تعداد عناصر بیش از یکی باشد با کاما جدا می گردند. به عنوان مثال دستورات زیر را در نظر بگیرید :

Private From – Load ( )

         Dim   var   As   varint ,  I   As   Integer

         Var = Array (1,3,5,7,9)

          List 1.  clear

          For   I = L Bound  (var)  To  U Bound (var)

                     List 1. Add Item   Str  ( var ( i ) )

Next  I

    Var = Array  (“ one” , “tow” , “ three” )

     List  2. clear

     For   I = L Bound  (var)  To  U Bound (var)

     List 2 . Add Item   Str  ( var ( i ) )

Next I

End Sub

در این دستورات، ابتدا یک آرایه به نام var ایجاد می شود که عناصر آن اعداد فرد کوچکتر از 10 می باشند. کلیه عناصر این آرایه را در عنصر List 1 نمایش می دهد و سپس یک آرایه به نام var ( همان نام قبلی ) از نوع دشته ای تعریف کرده مقادیر آرایه را در List 2 نمایش خواهد داد.

 

تابع Msg Box :

این تابع، کادر محاوره ای را برای نمایش اطلاعات ظاهر می کند و به صورت زیر به کار می رود :

Msg  Box ( Promt [ , Buttons] [, Title ] [, Help  File ] [ , Context ])

 

در این تابع پارامتر Promt پیامی است که باید نمایش داده شود. پارامترButtonsنوع آیکن ها ودکمه هایی را که درکادرمحاوره ای نمایش داده می‌شود، تعیین می کند.

پارامترTitle، عنوانی را که درکادرمحاوره ظاهرمی گردد، مشخص می کند، چنانچه در این پارامتر مقداری ذکر نشود، نام پروژه در عنوان کادر محاوره ظاهر می شود.

عنوان کادر محاوره حداکثر می تواند 255 کاراکتر باشد. پارامتر Help File ، نام فایل کمکی و مسیر آن را مشخص می کند و پارامتر Context ، شماره ای است که بر یکی از سرفصل های فایل کمکی اشاره می کند. با استفاده از آرگومان Buttons می‌توان نوع دکمه ها ( مثل ok , cancel , Retry ) و نوع آیکن ها را تعیین کرد. مقادیر این آرگومان در جدول 1 آمده است .

مقادیر ثابت و اعداد این جدول را می توان با هم ترکیب ( جمع ) کرد، مثلاً برای نمایش دکمه Ok ، Yes ، No و آیکن علامت هشدار، در کادر محاوره، باید مقدار زیر را در آرگومان Buttons قرار دهید :

(V b ok only  + V b  Yes  No + Vb Exclamation ) 0 + 4 + 48 = 52

چنانچه در آرگومان Buttons مقدار ذکر نشود، کادر محاوره با یک دکمه Ok ظاهر می گردد تا بتوانید کادر محاوره را ببندید.

پس از غیرفعال شدن کادر محاوره می توان تعیین کرد که کدام یک از دکمه ها کلیک شده است. مقادیری که این تابع برمی گرداند، در جدول 2 آمده است. براساس دکمه ای که کاربر کلیک کرده است، می توان تصمیم گرفت که برنامه چه عملی را انجام می دهد. به عنوان مثال دستورات زیر را در نظر بگیرید :

Result = Msg Box (“Print Docoment. Txt” , vb ok cancel + vb Question)

If  ( Result = o ) Then 

دستوراتی که فایل Document. Txt   را چاپ  می کنند      Else  

دستوراتی که با کلیک کردن دکمه cancel اجرا می شوند   End  If

این دستورات شکل 3-4 را تولید می کنند. کاربر می تواند دکمه های Ok یا Cancle را انتخاب کند که در هر حال مجموعه ای از دستورات مختلف اجرا می شوند. چنانچه کاربر کلید Esc را فشار دهد ویژوال بیسیک فرض می کند که دکمه Cancle کلیک شده است و مقدار 2 را باز می گرداند. ( مطابق جدول 2 ) 

تعریف آرایه در ویژوال بیسیک :

اکنون پی بردیم در بعضی از مسئله های برنامه نویسی به آرایه نیاز است، تعریف آن در ویژوال بیسیک می آموزیم.

 

  ] نوع آرایه1  As [ ( اندیس پایان  ] To اندیس شروع [ ) نام آرایه 1 Dim     (1 )

  ... ] ] نوع آرایه 2  As [  ( ] اندیس پایان ] To  اندیس شروع [ )  نام آرایه 2 و [

  ] نوع آرایه1  As [ (] اندیس پایان To اندیس شروع [ ) نام آرایه 1 Public     (2 )

... ] ] نوع آرایه 2  As [  ( ] اندیس پایان To [ اندیس شروع [ )  نام آرایه 2 و [

در این تعاریف ، برای نامگذاری آرایه، از قانون نامگذاری متغیرها استفاده می کنیم.


Dim و Public کلمات کلیدی در ویژوال بیسیک هستند. نوع اندیس آرایه می تواند عدد صحیح باشد. نوع اعشاری و کاراکتری نمی تواند به عنوان نوع اندیس آرایه انتخاب شود ولی عناصر آن می توانند هر نوعی باشند. چنانچه نوع آرایه ذکر نشود، ویژوال بیسیک نوع آن را عددی اعشاری با دقت معمولی در نظر می گیرد.

دستورات زیر را در نظر بگیرید:

Dim   A  (10)   As   Integer

Public   M  (5  To   10 )   As   Double

Dim   B   (100)

در این آرایهA  از نوع صحیح و آرایه هایM  و B از نوع اعشاری تعریف شده اند. آرایه A دارای 10 عنصر و آرایه M دارای 6 عنصر است. آرایه B دارای 100 عنصر است و نوع عناصر آن، اعشاری دقت معمولی است. شیوه ذخیره و بازیابی عناصر، آرایه های A و M  در شکل 2 آمده است. در این شکل، اعدادی جلوی نام آرایه در داخل ( ) آمده اند، اندیس آرایه نام دارند. اندیس آرایه از تعریف نوع اندیس مشخص می شوند. مثلا اندیس آرایه A از صفر تا 9 است که می توان با دستورoption Base اندیس این آرایه را از 1 تا 10 تعریف کرد. دستور option Base در ادامه توضیح داده می شود. اندیس آرایه M  از 5 تا 10 می باشد.

حافظه مورد نیاز :

مقدار حافظه ای که در اختیار آرایه قرار می گیرد، به طول ارایه و نوع عناصر آن بستگی دارد، به عنوان مثال اگر آرایه ای از نوع صحیح به طول10 داشته باشیم 2 × 10 بایت حافظه به آن اختصاص می یابد. ( چون نوع صحیح 2 بایت از حافظه را اشغال می کند).

 

شکل 2- روش ذخیره و بازیابی عناصر آرایه

تعیین کمترین مقدار اندیس آرایه :

چنانچه اندیس شروع آرایه ذکر نشود، ویژوال بیسیک بطور پیش فرض آن را صفر درنظر می گیرد. با استفاده از دستورoption Base می توان کمترین مقدار اندیس را تعیین کرد. دستور option Base به صورت N  option Baseبه کار می رود.

 N متغیری است که کمترین مقدار اندیس آرایه را تعیین می کند و می تواند 0 یا 1 باشد. پیش فرض سیستم برای حد پایین اندیس آرایه ها عدد صفر می باشد.

دستور option Base  باید قبل از دستور معرفی آرایه قرار گیرد. به عنوان مثال دستورات زیر را در نظر بگیرید‌ :

option Base  1

Dim   A   (100)   As   String

در این مثال آرایه A از نوع رشته ای می باشد که دارای 100 عنصر است و اندیس عناصر از 1 تا 100 می باشد.

معرفی چند تابع :

در این بخش چند تابع را معرفی می کنیم تا بتوانیم اعمالی را بر روی آرایه ها انجام داده، اعمال ورودی – خروجی ساده ای را انجام دهیم.

تابع   L  Bound :

این تابع برای تعیین اندیس اولین عنصر آرایه ( حد پایین ) استفاده می شود و به صورت زیر به کار می رود : (نام آرایه )       L  Bound 

این تابع برای تعیین اندیس آخرین عنصر آرایه ( حد بالا ) استفاده می شود و به صورت زیر به کار می رود : (نام آرایه )       L  Bound     

دستورات زیر را در نظر بگیرید :

Dim  X  (15)   As   Integer

For    I   =   L  Bound  (X) To   U bound (X)

                          X(i)  =  X(i)  +  1

  Next  I

این دستورات مقادیر تمام عناصر آرایه را با اندیس هر عنصر جمع می کند و در آن عنصر قرار می دهد.

تا کنون برای ذخیره داده ها، از متغیرهایی از نوع Byte ،Decimal ، Currency و غیره استفاده کردیم که هر کدام یک سلول از حافظه را اشغال می کردند. به عنوان مثال، دستورات زیر را در نظر بگیرید:

Dim   Yes   As   Booleam

Dim   D   AS   Double

Dim   L   As   Long

Dim   Num   As   Integer

این دستورات متغیر Yes را از نوع منطقی (Boolean  ) ، D را از نوع Double‌ ، L را از نوع Long و Num را از نوع صحیح  (Integer ) تعریف می کنند.

هر کدام از متغیرها به یک سلول از حافظه نیاز دارند تا داده ها را ذخیره نمایند. اما همیشه تعریف اینگونه متغیرها جوابگوی نیاز برنامه نویس نیست. به عنوان مثال فرض کنید می خواهیم 10 عدد صحیح را در حافظه نگهداری کنیم. یک روش این است که 10 متغیر از نوع صحیح تعریف کنیم و هر مقدار را در یک متغیر قرار دهیم. شاید این روش برای 10 عدد مطلوب باشد ولی اگر بخواهیم 500 عدد صحیح را ذخیره کنیم، آیا تعریف 500 متغیر در برنامه کار معقول و پسندیده ای است؟ در اینگونه موارد، باید از متغیرهای دیگری به نام متغیرهای اندیس دار یا آرایه استفاده کرد.

در این صورت، در این مثال، برای 500 عدد فقط یک نام انتخاب می کنیم و هر مقدار را یک عنصر می نامیم و برای دستیابی به هر عنصر از اندیس استفاده می کنیم.

به عنوان مثال، شکل 1 ، یک متغیر اندیس دار به نام a را نشان می دهد که شامل 10 عنصر صحیح است. همانطور که مشاهده می شود، عناصرمتغیر اندیس دار در محل‌های متوالی حافظه و تحت نظام خاصی ذخیره می شوند. به کمک این نظام، می‌توان در هر یک از این محل ها اطلاعاتی را قرار داد و به هر یک از عناصر آرایه دستیابی داشت. از اینجا به بعد متغیرهای اندیس دار را آرایه می نامیم. نامگذاری متغیرهای آرایه از قانون نامگذاری برای متغیرهای معمولی تبعیت می کند.

این فقط قسمتی از متن مقاله است . جهت دریافت کل متن مقاله ، لطفا آن را خریداری نمایید



خرید و دانلود دانلود مقاله کامل درباره آموزش ویژوال بیسیک


دانلود آموزش روت تبلت ایسوس فون پد 7 مدل ASUS Fonepad 7 - k012 هر دو مدل FE170CG و ME170 به روش ساده با لینک مستقیم

دانلود آموزش روت تبلت ایسوس فون پد 7 مدل  ASUS Fonepad 7 - k012 هر دو مدل FE170CG و ME170  به روش ساده با لینک مستقیم

موضوع :دانلود آموزش روت تبلت ایسوس فون پد 7 مدل  ASUS Fonepad 7 - k012 هر دو مدل FE170CG و ME170  به روش ساده با لینک مستقیم

 

 

 

  محصولات این بسته شامل :

فایل آموزشی ساده روت تبلت ایسوس فون پد 7

فایل نرم افزار روت ZenFone

 

 با لینک مستقیم می توانید فایل مورد نظر خود را دانلود نمایید
با تشکر تیم پدوفایل



خرید و دانلود دانلود آموزش روت تبلت ایسوس فون پد 7 مدل  ASUS Fonepad 7 - k012 هر دو مدل FE170CG و ME170  به روش ساده با لینک مستقیم


آموزش حذف FRP و حل مشکل گوگل اکانت سامسونگ Samsung J1 (2016) J120F, J120H, J120M, J120M, J120T بدون دانگرید

آموزش حذف FRP و حل مشکل گوگل اکانت سامسونگ Samsung J1 (2016) J120F, J120H, J120M, J120M, J120T  بدون دانگرید

آموزش حذف FRP و حل مشکل گوگل اکانت سامسونگ Samsung J1 (2016) J120F, J120H, J120M, J120M, J120T  بدون دانگرید

بدون ھیچ گونه ریسک، در کمترین زمان (کمتر از 5 دقیقه ) 

ما بسته ای رو آماده کردیم که در عین سرعت و راحتی می توانید اکانت جمیل گوشی های سامسونگ رو بدون باکس باز می کند. 

این روش کاملا اختصاصی می باشد و تمامی ورژن ها حتی اپدیت جدید اکتبر و سپتابر رو که هیچ روشی قابل بازگشایی نیست باز می کند

شرکت سامسونگ در اپدیت جدیدی که ماه اکتبرو نوامبر برای اندروید 6.0.1 ارایه داده است باگ های امنیتی و راه های نفوذ وامکان bypass کردن FRP را مسدود کرده است و با استفاده از ترفند های پیشین (sidesync و otg و realterm و …) نمی توان از آن رد شد ولی ما طبق این آموزش به شما یاد خواهیم داد که چگونه این کار را انجام دهید

آموزش در تاریخ 20 آبان 1395 به روز شد

حل مشکل رایت و نصب نشدن فایل های fix frp و در اپدیت نوامبر 

مخصوص سکیوریتی جدید در اندروید 6

مخصوص گوشی ھایی که به ھیچ وجه دانگرید نمی شوند

فایل SBOOT ھم رایت نمیشه؟

سایدسینک (sidesync ) گوشیو نمیشناسه؟

حتی فایل کامبینیشن ھم فیلد میده؟

اصلا تماس اضطراری قابل دسترسی نیست؟

روش تماس اضطرای با سیمکارت پین دار ھم جواب نمیده؟

مرورگر اینترنت باز نمیشه؟

گوگل اکانت منیجر ارور میده؟

٣نقطه ای که برای وارد کردن جیمیل لازم دارین غیرفعاله؟

تماس اضطراری 112 یا 911 و ... جواب نمیده

حل مشکل ارور Parse error There was a problem while parsing the package

حل مشکل ارور Google Account Manager

حل مشکل سکیوریتی جدید سامسونگ در اکتبر و نوامبر 2016

حل مشکل که با شماره گیری 112 یا 911 با پیغام “شماره موردنظر در شبکه موجود نمی باشد مواجهید

حل مشکل که با شماره گیری 112 یا 911 ، با پیغام “NOT REGISTERED ON NETWORK” مواجهید 

نمونه برخی از ارورهایی که ممکن است با آنها مواجه شوید که اینها فقط یک سری از ارور ها هستند.هر گونه ارور دیگری هم داشته باشید با این روش ۱۰۰% حل خواهد شد  

 بدون نیاز به باکس  بدون نیاز به فلش رایت فایل یا کامبیشن یا هیچ نوع فایل دیگری روی گوشی  بدون هیچ گونه ریسک   بدون نیاز به دانگرید بدون نیاز به رایت مودم بدون نیاز به رایت sboot  بدون نیاز به sidesync، بدون نیاز به OTG    و...

پشتیبانی از تمامی مدل ها (حتی ۲۰۱۶ ).

پشتیبانی از اندروید ۵٫۱٫۱ و اندروید ۶٫۰ و ۶٫۰٫۱ .

تمامی نسخه های امنیتی حتی نسخه های امنیتی جدید اکتبر و سپتامبر که با هیچ روشی قابل بازگشایی نیست.

قابل انجام در کمتر از ۵ دقیقه 



خرید و دانلود آموزش حذف FRP و حل مشکل گوگل اکانت سامسونگ Samsung J1 (2016) J120F, J120H, J120M, J120M, J120T  بدون دانگرید


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

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

لینک پرداخت و دانلود *پایین مطلب*
فرمت فایل:Word (قابل ویرایش و آماده پرینت)
تعداد صفحه: 126

 

آموزش اسمبلی

برای یاد گرفتن اسمبلی باید با مبناهای عدد نویسی ، ساختمان داخلی کامپیوتر
و برنامه نویسی آشنا باشیم .
ما برنامه هایمان را مستقیما با اسمبلر Macro Assembler خواهیم نوشت و گاها از Debug
استفاده خواهیم کرد . بعلاوه چون برنامه های حجیم نخواهیم نوشت قالب اکثر
رنامه های ما COM. خواهد بود .
برای شروع ابتدا نگاهی به حافظه میکنیم :

حافظه و آدرس دهی

هر کامپیوتر مبتنی بر 8086 دارای حداقل 640 کیلوبایت حافظه است . این 640
کیلوبایت به قطعات 64 کیلوبایتی تقسیم شده و ما این قطعات را "قطعه " یا Segment
مینامیم . هر سگمنت هم به خانه های تک بایتی دیگری تقسیم شده است .

برای بدست آوردن مقدار یک بایت مشخص از حافظه ما باید عد مربوط به سگمنت و
همچنین شماره آن بایت در سگمنت ( که آفست Offset نامیده میشود ) را بدانیم .
مثلا اگر مقدار مورد نظر در قطعه 0030h(h( یعنی عدد در مبنای 16 است ) و آفست 13C4h
باشد ما باید قطعه ای که شماره آن 0030h است را بیابیم و بعد در همان قطعه
مقدار باین شماره 13C4 را بخوانیم .
برای نمایش این حالت بین عدد سگمنت و آفست علامت (:) قرار میدهیم . یعنی
ابتدا عدد مربوط به قطعه را نوشته و سپس عدد آفست را می آوریم :
Segment:Offset

مثال : 4D2F:َ9000 **
همیشه در آدرس دهی ها از اعداد مبنای 16 استفاده میکنیم .

| | |

| CConvertional | 1 Segment=64K | | | | | Memory

| | | | | |
| | | |
| | | |


ثباتها Registers

رجیسترها مکان هائی از CPU هستند که برای نگهداری داده ها (DATA) و کنترل اجرای
برنامه بکار میروند . ما میتوانیم آنها را مقدار دهی کرده و یا بخوانیم و یا
باتغییر محتوای آنها CPU را مجبور به انجام یک پروسه (رویه یا Procedure) کنیم

دسته ای از رجیسترها که ما انها را "ثباتهای همه کاره یا همه منظوره " میخوانیم
و شامل AX/BX/CX/DX هستند ، برای انتقال مقادیر بین رجیستر ها و CPU بکار میروند.
این ثباتها را میتوانیم به هر نحوی تغییر دهیم و مقادیری را به آنهاارسال کنیم .

ثباتهای دیگری هم که نام میبریم کاربردهای خاص خودشان را دارند و برای مقدار دهی
آنها باید قواعد خاصی (که توضیح خواهیم داد) را بکار بریم .

میکند عدد که در این ثبات وجود دارد شماره یک قطعه است و CPU برای یافتن DS : مخفف Data Segment . محل نگهداری متغییرها و ثابتهای برنامه را مشخص
مقادیر لازم به آن قطعه مراجعه میکند . CS

: مخفف Code Segment است و آدرس قطعه ای که برنامه در آن قرار گرفته را
نشان میدهد . ES

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

DataIndex:Dبا DS/ESا مرتبط است و عدد آفست را نگهداری میکند . IP

: این رجیستر معلوم میکند که برنامه در حال اجرائی که در CS قرار دارد از
کدام بایت قطقه (یعنی کدام آفست ) شروع میشود . به همین دلیل همیشه این دو
ثبات را با هم و بصورت CS:IP نشان میدهند.
و ...

تمام رجیسترهای فوق 16 بیتی (دوبایتی ) هستند و اعداد دوبایتی را نگهداری میکنند.
ثباتهای همه منظوره به دو نیم ثبات تک بایتی تقسیم میشوند . بایت بالائی ب
نماد H و بایت پائینی با نماد L نشان داده میشود . مثلا ثبات AX دارای دو نیم -
ثبات AH/AL است :
| AH - 8 Bit | AL -8 Bit |


تمرین :
برای دیدن رجیسترها در DOS، DEBUG، را اجرا کنید و فرمان R را صادر کنید :


D:\MASM>DEBUG
-R
AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=17AA ES=17AA SS=17AA CS=17AA IP=0100 NV UP EI PL NZ NA PO NC
17AA:0100 0F

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

در این قسمت میخواهیم با استفاده از مطالبی که در بخشهای قبلی یاد گرفتیم
برنامه ای بنویسیم که کامل و قابل استفاده باشد . با این برنامه میتوانیم
فلاپی دیسکهای خودمان را با سرعت کپی کنیم ! امروز برنامه را به شکلی مینویسیم که
بتواند دیسکهای 1.44 را بوسیله درایو A کپی کند . بیشتر نیاز ما در کپی (تکثیر)
دیسکها هم به همین شکل هست . با اینحال در قسمت بعدی نگارش (Version) جدیدتری از
برنامه را مینویسیم و قابلیت تشخیص نوع دیسک و قابلیت مشخص کردن درایو را به آن
اضافه میکنیم .
بهترین کاری که میتوانیم بکنیم اینست که بتوانیم داده های خوانده شده از
دیسک را در حافظه EMS بنویسیم (در این نسخه روی هارددیسک مینویسیم ) . وقتی که
نحوه کار را حافظه گسترش یافته (Extended Memory) را هم یاد گرفتیم ، برنامه
خود را کامل کرده و از آن بعنوان اولین دستختمان در برنامه نویسی اسمبلی لذت
میبریم .
لیست برنامه در زیر قرار دارد و توضیحات برنامه را روی آن میبینیم
قبل از آن یاد آوری میکنم که هر دیسک HD َ1.44 دارای دو طرف و در هر طرف 80 شیار
(Track) بوده و هر شیار هم به 18 بخش بنام قطاع (Sector) تقسیم میشود . برنامه
ما باید محتوای تمام این قطاعها را خوانده و در فایلی روی دیسک سخت ذخیره کند.
سپس همین داده ها را از فایل خوانده و مجددا روی دیسک جدید بنویسد.



طول هر قطاع 512 بایت است EQU 512 SECTORSIZE
تعداد شیار ها 80 شیار (79- 0-) است EQU 79 MAXTRACK
هر دیسک دو طرف دارد EQU 2 NUMSIDES
تعداد سکتور در هر شیار 18 تا است EQU 118 SECTOR_PER_TRACK E
.MODEL SMALL
.CODE
ORG 100H
START:
JMP MAIN

بافر برای ذخیره (0)BUF DB SECTORSIZE*SECTOR_PER_TRACK DUP
داده ها . اندازه آن به اندازه بایتهای یک شیار است
معرف رویه فعلی دیسک SIDE D DB 0
معرف تراک جاری TRACK DDB 0
هندل (مشخصه ) فایل HANDLE DW 0

اسم فایل برای دخیره موقت داده ها FILENAME DB 'C:TTEMP.$$$'/0

MSG1 DB 'ENTER A DISK INTO DRIVE A :THEN PRESS A KEY'/13/10/'$'
MSG2 DB 'ENTER A NEW DISK INTO DRIVE A :THEN PRESS A KEY'/13/10/'$'



رویه ReadTrack داده های یک شیار را بطور کامل میخواند . برای خواندن یک شیار
کامل از Int 13h/Ah=02h استفاده کرده ایم . داده ها بعد از خوانده شدن در محلی
که با ES:BX مشخص میشود ذخیره میشوند . (به مرجع اینتراپیتها مراجعه کنید) قبلا
کار با این وقفه را توضیح داده ایم (برنامه Boots.asm را ببینید)


READTRACK PROC ;READ A TRACK
PUSH ES
MOV AX/DS
MOV ES/AX
LEA BX/BUF
MOV AH/2
MOV DL/0 ;DRIVE A:
MOV DH/SIDE
MOV CH/TRACK
MOV CL/1 ;THE 1st SECTOR
MOV AL/SECTOR_PER_TRACK
INT 13H
POP ES
RET
READTRACK ENDP



این رویه داده های موجود در BUF را خوانده و در یک شیار کامل که با متغیر Track
مشخص میشود مینویسد . برای اینکار از INT 13h/AH=03h استفاده شده است . آدرس
متغیر BUF را باید در ES:BX قرار بدهیم .


WRITETRACK PROC
LEA BX/BUF
PUSH ES
MOV AX/DS
MOV ES/AX


شماره تابع برای نوشتن MOV AH/03
تعداد سکتورها برای نوشتن MOV AL/SECTOR_PER_TRACK
شماره تراک MOV CH/TRACK
شماره سکتور شروع MOV CL/1
رویه دیسک (طرف دیسک ) MOV DH/SIDE
شماره درایو که اینجا A است MOV DL/0 INT 13H
POP ES
RET
WRITETRACK ENDP


این پروسیجر به اندازه یک تراک کامل از فایل خوانده و در متغیر BUF قرار میدهد
READFILE PROC
MOV BX/HANDLE

اندازه یک تراک MOV CX/SECTORSIZE*SECTOR_PER_TRACK
آدرس بافر برای ذخیره که DS:DX است LEA DX/BUF MOV AH/3FH
INT 21H
RET
READFILE ENDP


این پروسیجر کلیه داده های داخل BUF که به اندازه یک تراک کامل (18*512 بایت )
است را خوانده و در فایل مینویسد تا بعدا مجددا خوانده و روی دیسک جدید بنویسد


WRITEFILE PROC
MOV BX/HANDLE
MOV CX/SECTORSIZE*SECTOR_PER_TRACK
LEA DX/BUF
MOV AH/40H
INT 21H
RET
WRITEFILE ENDP



منتظر میماند تا کلیدی فشرده شود WAIT PPROC
تابع خواندن کلید MOV AH/0 INT 16H
RET
WAIT _ENDP



این رویه فایل با هندل مشخص شده را میبندد CLOSEFILE PROC MOV AH/3EH
MOV BX/HANDLE
INT 21H
RET
CLOSEFILE ENDP


شروع برنامه اصلی . MAIN:

در این قسمت اعذم میکنیم که دیسکی را در درایو A قرار دهده و کلیدی را
برنند . MOV AH/9
LEA DX/MSG1
INT 21H

مکث برای دریافت کلید _CALL WAIT

ساختن فایل برای ذخیره داده ها MOV AH/3CH
LEA DX/FILENAME
MOV CX/0
INT 21H

MOV SIDE/0
MOV HANDLE/AX
MOV TRACK/1

موتور دیسک خوان مدت زمانی لازم دارد تا به سرعت کافی برسد . بنا براین باید
یک یا دو بار قبل از خواندن دیسک ، تابع خواندن را اجرا کنیم تا موتور دیسک در
حالت مناسب قرار بگیرد.
CALL READTRACK ; START UP THE CASSETTE-MOTOR
COPY:
MOV TRACK/0
COPYTRACK:

خواندن شیار CALL READTRACK
نوشتن داده های خوانده شده در دیسک CALL WRITEFILE
شیار بعدی INC TRACK
آیا شیار80 هستیم / CMP TRACK/80
نه ، شیار بعدی TRACKS َ; COPY 80 JNZ COPYTRACK

طرف بعدی دیسک INC SIDE
آیا طرف دوم دیسک هستیم ? CMP SIDE/1
نه ، پس ادامه بده JZ COPY
وگر نه فایل را ببند CALL CLOSEFILE

حالا اعلام میکنیم که دیسک جدید را در درایو A قرار دهد و کلیدی را بزند MOV AH/09H
LEA DX/MSG2
INT 21H
CALL WAIT_

MOV SIDE/0


همان فایل را برای خواندن باز میکنیم . وقتی که فایلی را میسازیم تنها میتوانیم
در آن فایل بنویسیم . بنا براین برای خواندن از فایل ، باید آن را بسته و مجددا
برای خواندن باز کنیم . LEA DX/FILENAME
MOV AH/3DH
MOV AL/0
INT 21H

مشخصه فایل در Handle قرار میگیرد MOV HANDLE/AX

MOV TRACK/1
MOV SIDE/0

اجرای تابع نوشتن برای راه اندازی موتور دیسک CALL WRITETRACK
WRITE:
MOV TRACK/0
WRITE_ON_TRACK:

داده هارا از فایل بخوان CALL READFILE
داده ها را روی شیار بنویس CALL WRITETRACK
شیار بعدی INC TRACK
آیا شیار 80 هستیم ? CMP TRACK/80
نه ، پس ادامه بده JNZ WRITE_ON_TRACK
بله ، طرف بعدی دیسک INC SIDE
آیا الان طرف دوم را هم خوانده ایم ? CMP SIDE/1
نه ، پس شیار بعدی را بنویس JZ WRITE
بله ، فایل را ببند CALL CLOSEFILE

فایلی که ساخته بودیم فضائی از دیسک سخت را اشغال کرده ، بنا براین بهتر است
آن را با استفاده از وقفه 21h و تابع 3Ah حذف کنیم . LEA DX/FILENAME
MOV AH/3AH
INT 21H ;ERASE THE TEMPORARY FILE
INT 20H
END START

تمام (:

خوب ، رجیسترها را دیدیم و آشنائی کلی با آنها پیدا کردیم .
حالا میخواهیم به رجیتسرها مقدار بدهیم و آنها را بخوانیم و ... . ما معمولا در
ےزبانهای دیگر از علامت =(یا =ا:) برای مقدار دهی استفاده میکنیم ولی در زبان
ےاسمبلی این کار ممکن نیست . در عوض از دستورالعمل MOV کمک میگیریم . با MOV
میتوانیم داده ها را بین رجیسترها یا خانه های حافظه انتقال بدهیم . به این صورت
MOV in_it/Value


در اینجا In_it به معنای یک رجیستر، نام یک متغیر، یا آدرس یک مکان از حافظه
است و Value هم یک مقدار عددی یا حرفی ، نام یک رجیستر و ... میباشد .
ےمانند MOV AX/200 که عدد 200 دسیمال را به رجیستر AX منتقل میکند . (همیشه از
سمت راست به چپ ) .

در زبان اسمبلی ما میتوانیم با مبناهای 2وَ10وَ16 کار کنیم . اعداد به طور پیش
فرض مبنای 10 هستند . برای نشان دادن عدد هگزا (مبنای 16) در انتهای عدد یک
حرف H ( یا h ) و در انتهای اعداد باینری علامت (b) قرار میدهیم . مثلا برای نشان
دادن عدد AC1 مبنای 16 باید حتما آن را بصورت AC1h بنویسیم . به همین ترتیب عدد110b
همان عدد 6 خودمان است .

با این تفاسیر برای دادن مقدار 4Ch به رجیستر AX از دستور زیر استفاده میکنیم :
mov ax/4Ch


به همین شکل میتوانیم به نیم ثباتها هم مقدار بدهیم . مثلا میتوانیم برای مقدار
دهی AH بنویسیم : mov ah/20h . در این حالت مقدار نیم ثبات AL ثابت بوده و
محتوای AH برابر 20h میشود . چون نیم ثباتها تک بایتی هستند ما نمیتوانیم عدد
خارج از محدوده 0 تا 255 یا 128- تا 127 به آنها ارسال کنیم . در مورد اعداد منفی
هم باید از طریق تبدیل به مکمل دو عمل کنیم که به زودی آن روش را توضیح خواهیم
اد .
مثلا ما نمیتوانیم mov ah/100h را انجام دهیم چون 100h برابر 256 بوده و از محدوده
تعریف شده خارج است .
به همین شکل میتوانیم محتوای ثباتها را هم منتقل کنیم . مثلا برای کپی کردن محتوای
ثبات CXبه DX میتوانیم بنویسیم : mov dx/cx ، یعنی مقدار داخل Cx را به Dx کپی
کن .
ےباز هم باید به یک یا دوبایتی بودن ثباتها توجه کنیم . به عبارت دیگر ما
ےنمیتوانیم مقدار یک ثبات تک بایتی را به یک ثبات کامل دوبایتی منتقل کنیم .
مثلا عبارت mov DX/AL قابل قبول نیست چون AL یک بایتی بوده و DX دوبایتی است .
به عبارت ساده و کامل تر دو طرف عملوند MOV باید از نظر اندازه برابر باشند.
بنابر این :
MOV DL/AL
و MOV CL/BHوM درست ولی MOV DS/AH نادرست است .

به علاوه ما فقط میتوانیم ثباتهای همه منظوره AXتا DX را به این صورت مقدار دهی
ےکنیم . در صورتی که بخواهیم ثباتهائی مثل ..DS/ES/ را مقدار دهی کنیم باید از
رجیستر AX به عنوان واسطه استفاده کرده و مقدار را از طریق آن انتقال دهیم .
مثلا:
نمیتوانیم بنویسیم mov ds/20h
ولی میتوانیم داشته باشیم :
mov ax/20h
mov ds/ax


ےبه این ترتیب مقدار 20hبه DS انتقال پیدا میکند ( گرچه تغییر دادن DS ایده خوبی
نیست !)

ےحالا مطالب گفته شده را تمرین میکنیم . ما میتوانیم با DEBUG اسمبلی بنویسیم و
حتی برنامه های COM. درست کنیم . بنا براین در DOS، DEBUG، را اجرا کنید .
D:\LNG\ASM> DEBUG


ےیک خط تیره به صورت - ظاهر میشود . این خط تیره اعلان DEUBG برای وارد کردن
دستورات است .
حرف A (به معنی شروع وارد کردن دستورات اسمبلی ) را وارد کرده و Enter را بزنید .
ےعددی بصورت xxxx:0100 ظاهر میشود . این عدد برای شما (فعلا) مهم نیست ، پس به
آن توجه نکنید .
حالا میتوانید دستورات زیر را وارد کنید :


MOV AX/100
MOV BX/AX
MOV ES/AX



بعد از وارد کردن خط آخر یکبار دیگر کلید Enter را بزنید تا اعلان (-) دوباره ظاهر
شود .
در سطر اول ما عدد 100h ( پیش فرض اعداد در Debug هگزا است ) را به AX منتقل
کردیم . بعد مقدار AXبه BX و سپس مقدار AXبه ES منتقل شده . به این ترتیب همه
ثباتهای AX/BX/ES باید در نهایت برابر 100h باشند .
برای دیدن صحت این مطلب دستور T ( به معنای Trace) را وارد کنید .
با هر بار اجرای این دستور یکی از سطرهای برنامه اجرا میشود . بعلاوه شما میتوانید
محتوای رجیسترها را هم ببینید .
با اولین فرمان T ، سطر اول اجرا میشود . بازهم فرمان T را وارد کنید . الان مقدار100h
به BX داده شد و اگر به محتوای رجیستر AX توجه کنید خواهید دید که مقدار آن
(همانطور که انتظار داشتیم ) برابر 100h است . دوبار دیگر هم فرمان T را صادر
کنید و در نهایت مقدار ثباتهای AX/BX/ES را ببینید . هر سه ثبات (حالا) برابر 100h
هستند .
برای خارج شدن از Debug هم فرمان Q به معنی Quit را وارد کنید .
******


پس امروز یاد گرفتیم گه چطور مقادیر و داده ها را بین ثباتها منتقل کنیم .
خودتان همین تمرینات را با DEBUG انجام داده و در مورد MOV مطالعه کنید .
در قسمت بعد چیزهای بیشتری رو خواهیم خواند و یاد خواهیم گرفت.

تا اینجا یاد گرفتیم که چطور مقادیر را بین ثباتها منتقل کنیم : با فرمان MOV.
با همین دستور میتوانیم مقادیر را از محلهای حافظه خوانده یا در آنجا بنویسیم .
برای کار با حافظه دوحالت ممکن است وجود داشته باشد : 1
- آدرس مورد نظر در سگمنت جاری باشد . در برنامه های COM. کل برنامه (غالبا)
از یک سگمنت تشکیل میشود . 2
- آدرس مورد نظر خارج از سگمنت جاری باشد .

ثبات DS همیشه به قطعه ای اشاره میکند که داده های مورد نیاز برنامه در آن
هستند . این قطعه در برنامه های EXE. یک قطعه مستقل است ولی در برنامه های COM
. ، قطعه داده های و قطعه کد برنامه در یک سگمنت هستند . بنا براین مقدار
ثبات DS در یک برنامه COM. ثابت است .
در حالت کلی آدرس یک محل از حافظه بصورت DS:address مشخص میشود. DS حاوی
آدرس سگمنت داده ها بوده و address آفست را مشخص میکند .
چون همانطور که گفتیم DS در برنامه های COM. ثابت است ، پس در صورتی که آدرس
مورد نظر در همین قطعه باشد از نوشتن DS صرفنظر میکنیم .
به عنوان مثال اگر قطعه داده های برنامه ما 9000h باشد و ما بخواهیم آفست 24h
ام در همین قطعه را بدست بیاوریم ، میتوانیم از یکی از دو شکل زیر استفاده
کنیم :
DS:24h
or
24h


البته چون اسمبلر منظور ما از نوشتن عدد 24h را نخواهد فهمید شکل دوم یک خطای
هنگام ترجمه تولید خواهد کرد ولی ما روش صحیح را هم خواهیم گفت .
ما آدرس ها (یا اشاره گرها) را برای این میخواهیم که بتوانیم به یک خانه از
حافظه دسترسی پیدا کنیم . برای اینکه نشان بدهیم منظور ما از عدد مشخص شده ،
آدرس است نه خود عدد (مثل 24h در مثال قبلی ) آن عدد را داخل [] قرار میدهیم .
بنا براین :
mov ah/24h عدد 24h را به AX منتقل میکند ولی ....
mov ah/[24h] محتوای آفست 24h را به AX منتقل میکند .

در شکل دوم هر مقداری که در آفست 24h ام سگمنت جاری موجود باشد به ثبات Ah
منتقل میگردد.
به همین صورت میتوانیم یک مقدار را به یک خانه از حافظه منتقل کنیم : mov [24h]/ah
: محتوای ثبات AH را به آفست 24h ام منتقل میکند .
ے اگر آدرس مورد نظر خارج از محدوده سگمنت جاری بوده و در قطعه ای جدا قرار داشته
باشد ، میتوانیم از DSیا ESا (ترجیحا) برای دستیابی به حافظه استفاده کرد:
مثال : mov ax/9000h
mov ds/ax
mov ah/ds:[89h]


به این ترتیب ما به آفست 89h از سگمنت 9000h دسترسی پیدا میکنیم .
البته دستورات فوق مارا به مقصودمان میرسانند ولی ما نمیتوانیم به دلخواه خودمان DS
را تغییر دهیم چون همانطور که گفتیم DS به قطعه داده های برنامه اشاره میکند و
برنامه ، داده ها و مقادیر متغیر ها را از سگمنتی که با DS مشخص شده میخواند .
بنا براین ما نباید مقدار DS را تغییر بدهیم مگر اینکه آن را دوباره به حالت اول
برگردانیم . برای ذخیره و بازیابی محتوای رجیسترها، یک روش ساده و عمومی وجود
دارد که به زودی خواهیم گفت ولی در این مثال ما میتوانستیم مقدار قبلی DS را در
یک رجیستر دیگر مثل CX نگهداریم :

انتقال محتوای dsبه AX mov ax/ds
انتقال محتوای AXبه CX mov cx/ax
دادن مقدار9000hبه AX mov ax/9000h
انتقال محتوای AXبه DS mov ds/ax
خواندن آدرس mov ah/ds:[89h]
بازیابی مقدار DS mov ax/cx mov ds/ax


اگر بخواهیم آفست آدرس را با یک رجیستر مشخص کنیم باید به نکات زیر توجه
کنیم : 1
- اگر آدرس سگمنت با DS مشخص شده ، یا آدرس در سگمنت جاری باشد ، باید
مقدار آفست را در ثبات BX قرار دهیم . مثلا mov cx/[BX]یا mov cx/ds:[bx]ا .
2
- اگر از ES به عنوان مقدار سگمنت استفاده میشود باید از DI به عنوان آفست
استفاده کنیم مثل mov cx/es:[di] .

چون ما با برنامه های COM. سرو کار داریم ، پس از شکل اول و BX استفاده خواهیم
کرد .
دستیابی به مکانهای حافظه نکته های جالب دیگری هم دارد که در قسمت بعدی یاد
خواهیم گرفت .

 

دستیابی به مکانهای حافظه

وقتی که ما به روش گفته شده مقداری را از حافظه میخوانیم ، یک داده تک بایتی
از حافظه گرفته میشود . اما ممکن است بخواهیم که یک کلمه یا کلمه
مضاعف ( 4بایتی ) را بخوانیم یا بنویسیم . در این صورت میتوانیم از
پیشوند های زیر استفاده کنیم :
Byte Ptr
: برای دست یابی به یک بایت Word Ptr
: برای دستیابی به یک کلمه (2بایت ) Dword Ptr
: برای دست یابی به یک مقدار 4 بایتی

این پیشوند ها را باید قبل از آدرس مورد نظر قرار دهیم . به عنوان مثال برای
خواندن یک بایت از آفست 10h میتوانیم بنویسیم : mov al/byte ptr ds:[10h]

و برای خواندن دو بایت بصورت : mov ax/byte ptr ds:[10h] .
میتوانیم از همین روش استفاده کرده و مقداری را به حافظه انتقال دهیم . مثلا
میخواهیم یک کلمه دوبایتی را به آفست 34h (در سگمنت برنامه ) منتقل کنیم . کافی
است بنویسیم :

mov word ptr [34h]/1FCAh .
مثال :
mov bx/34h
mov ax/ds
mov cx/ax
mov ax/00h
mov ds/ax
mov ax/word ptr ds:[bx]
mov ax/cx
mov ds/ax

جمع و تفریق

بحث ما در مورد روشهای دستیابی و انتقال داده ها (فعلا) به پایان میرسد . حالا
میخواهیم ببینیم که چطور عمل جمع و تفریق ، و بعدا ضرب و ... ، را روی مقادیر
انجام دهیم .

این فقط قسمتی از متن مقاله است . جهت دریافت کل متن مقاله ، لطفا آن را خریداری نمایید



خرید و دانلود دانلود مقاله کامل درباره آموزش اسمبلی


حل مشکل تاچ ( برعکس کار کردن) سامسونگ S6 بعد فلش

 حل مشکل تاچ ( برعکس کار کردن) سامسونگ S6 بعد فلش

 رفع مشکل تاچ ( برعکس کار کردن) سامسونگ S6 بعد فلش 

با لینک مستقیم و پرسرعت 

همکاران عزیز ممکنه بعد از آبدیت و فلش برای این مدل از گوشی مشکل برعکس کار کردن تاچ به وجود بیاد که با فلش دوباره این مشکل حل نشه اما ما با روشی که به شما خواهیم گفت این مشکل را به راحتی در عرض کمتر از یک دقیقه حل خواهید کرد



خرید و دانلود  حل مشکل تاچ ( برعکس کار کردن) سامسونگ S6 بعد فلش