فرق زبان اسمبلی و زبان ماشین

تفاوت زبان ماشین، زبان اسمبلی و زبان سطح بالا


برنامه نویسان، دستور العمل ها را به زبان های برنامه نویسی گوناگونی می نویسند. برخی از این زبان ها، مستقیما برای کامپیوتر قابل فهمند و برخی دیگر نیز به مراحل میانی ترجمه (translation) نیاز دارند. امروزه از صدها زبان کامپیوتری استفاده می شود. این زبان ها را می توان به سه نوع کلی زیر تقسیم کرد:

۱٫ زبان های ماشین (Machine Languages )

۲٫ زبان های اسمبلی ( Assembly Languages )

۳٫ زبان های سطح بالا ( High-Level Languages )

هر کامپیوتر فقط می تواند زبان ماشین مربوط به خودش را مستقیما بفهمد. زبان ماشین « زبان طبیعی» کامپیوترهاست و توسط طراحی سخت افزار آنها تعریف می شود. (نکته: زبان ماشین را کد هدف (object code) نیز می نامند. این اصطلاح قبل از اصطلاح برنامه نویسی شی گرا (object-oriented programming) به وجود آمده است و Object موجود در دو اصطلاح ارتباطی به هم ندارند) دستور العمل های زبان ماشین به طور کلی، شامل رشته هایی از اعداد ( که در نهایت به ۰ و ۱ تبدیل می شوند) هستند که درهر لحظه ارای ابتدایی ترین اعمال را به کامپیوتر فرمان می دهند. زبان های ماشین، به ماشین وابسته هستند (machine dependent) و این بدان معناست که هر زبان ماشین خاص، تنها می تواند بر روی یک نوع کامپیوتر به کار رود. کار با زبان ماشین برای انسان ها سخت و دشوار است.

برنامه نویسی به زبان ماشین بسیار آهسته و مستعد خطا بوده و برای بیشتر برنامه نویسان کار پرمشقتی است. از این رو، برنامه نویسان به جای اینکه با رشته هایی از اعداد که مستقیما برای کامپیوتر قابل فهمند کار کنند، شروع به استفاده از مخفف های انگلیسی مانندی که بیانگر اعمال ابتدایی کامپیوتر هستند، کردند. این مخفف ها، پایه و اساس زبان اسمبلی را تشکیل داد. به دنبال آن، برنامه های مترجمی (translator program) موسوم به اسمبلر (assembler) نیز ایجاد شدند تا برنامه های زبان اسمبلی را به سرعت به زبان ماشین تبدیل کنند. این کدها برای انسان واضح تر هستند اما تا زمانی که به زبان ماشین ترجمه نشوند برای کامپیوتر مفهومی ندارند.

با پیدایش زبان اسمبلی، میزان استفاده از کامپیوتر ها به سرعت افزایش یافت، اما هنوز برنامه نویسان مجبور بودند، برای انجام ساده ترین کارها دستور العمل های زیادی را بنویسند. برای تسریع فرایند برنامه نویسی، زبان های سطح بالا ایجاد شدند که در آنها با نوشتن یک دستور (statement) کارهای زیادی انجام می شد. برنامه های مترجمی موسوم به کامپایلر (compiler)، برنامه های به زبان سطح بالا را به زبان ماشین تبدیل می کردند. به کمک زبان های سطح بالا، برنامه نویسان می توانستند دستوراتی بنویسند که تقریبا شبیه انگلیسی روزمره بوده و شامل نمادهای متداول ریاضی هستند.

از دیدی برنامه نویس، بدیهی است زبان سطح بالا بسیار مطلوب تر از زبان ماشین و زبان اسمبلی است. از جمله زبان های سطح بالا می توان به زبان C و C++ و زبان های Microsoft’s .Net ( مثل Visual Basic.Net، Visual C++.Net و C#) و Java اشاره کرد که امروزه بسیار متداول هستند.

بسیاری از برنامه نویسان تازه کار تصور می کنند که برنامه نویسی به زبان اسمبلی بسیار مشکل تر از برنامه نویسی به یک زبان سطح بالا است. در یک مثال ساده تفاوت برنامه نویسی در زبان اسمبلی و یک زبان سطح بالا را بررسی خواهیم کرد:

فرض کنید می خواهیم به یک ربات بگوییم تا حصاری دور باغ ایجاد کند. این دستور را در دو زبان مشاهده کنید

زبان سطح بالا:

با استفاده از میله های چوبی به قطره ۵/۲ سانتیمتر و طول یک و نیم متر، و به فاصله ۵/۲ متر از یکدیگر، حصاری دور باغ ایجاد کن.

زبان اسمبلی:

به چوب بری برو و ۷۰۰ عدد میله چوبی به طول یک و نیم و قطر ۵/۲ سانتیمتر خریداری کن. چوب ها را در وانت بگذار. به خانه برگرد و آنها را خالی کن. از گوشه شمال شرقی باغ شروع کرده و سوراخی به عمق نیم متر ایجاد کن. یکی از جوبها را بردار. چوب را در سوراخ قرار بده. در سوراخ سیمان بریز. ۵/۲ متر جلوتر برو اگر به گوشه دیگر نرسیده ای، یک سوراخ به عمق نیم متر ایجاد کن. یک چوب دیگر بردار و ….

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

فرآیند ترجمه زبان سطح بالا به زبان ماشین، می تواند زمان قابل ملاحظه ای از کامپیوتر را به خود اختصاص دهد. از این رو، برنامه هایی به نام مفسر (interpreter) به وجود آمدند که می توانستند برنامه های سطح بالا را مستقیما اجار کنند، اما این کار را بسیار کندتر انجام می دادند. در محیط هایی که دائما با افزودن ویژگی های جدیدی به برنامه و تصحیح خطاها، برنامه باید مجددا کامپایل شود، استفاده از مفسرها از محبوبیت بیشتری برخوردار است. پس از تکمیل برنامه، می توان نسخه کامپایل شده ای تولید کرد که بسیار کارآمد تر اجرا می شود.





سيستم هاي عدد نويسي


محاسبات کامپيوتري در مبناي دو انجام مي شود. به طور معمول از سيستم عددي هگزادسيمال براي نمايش اعداد باينري استفاده مي شود.

سيستم هاي عدد نويسي
سيستم عددی اعشاری
سيستم عددی دودوئی
سيستم عددی هگز


سيستم هاي عدد نويسي

در کارهای روزمره از سيستم عددی اعشاری يا مبنای 10 استفاده می شود. اين سيستم برای کامپيوتر مناسب نيست و برای سادگی سخت افزار، کليه اطلاعات به شکل بيت های روشن و خاموش رمز می شوند. بنابراين سيستم عددی باينری که تنها شامل ارقام صفر و يک است برای اين منظور بسيار مناسب است. عدد 1 (on) مشخص کننده +5 ولت و عدد صفر (off) مشخص کننده 0.5 ولت است.

برای تعيين مبنای عدد يک حرف کوچک در انتهای آن قرار می گيرد. مثاال 45h به معنی عدد 45 در مبنای شانزده است. و 11010011b يعنی اين عدد در مبنای 2 است. اين روشی است که اسمبلر اعداد را در برنامه های اسمبلی تشخيص می دهد.


سيستم عددی اعشاری (Decimal)

اعداد اعشاری يا مبنای 10 از 10 رقم (0 تا 9) تشکيل شده اند. هر رقم به توانی از 10 مرتبط است که نشان دهنده ارزش مکانی رقم در عدد است.

234 = 2 × 102 + 3 × 101 + 4 × 100
     = 200 + 30 + 4

سيستم عددی دودوئي (binary)

سيستم باينری بر اساس تنها دو وضعيت است: روشن (1) يا خاموش (0)، بنابراين درمبنای 2 است. يک رقم باينری يک بيت ناميده می شود (در واقع کلمه Bit مخفف Binary Digit است).


جدول توان هاي 2
جدول نمايش اعداد 0 تا 15 در مبنای دو


تبديل باينری به اعشاری

مقدار يک عدد باينری بر اساس بيت های 1 و ارزش مکانی آنها بدست می آيد. ارزش مکانی هر بيت توانی از 2 است. برای محاسبه مقدار اعشاری يک عدد باينری، کافی است هر رقم از راست به چپ در ارزش مکانی اش ضرب شده سپس کليه اعداد با هم جمع شوند.


مثال 1. تبديل عدد 11001b به مبنای 10.

Binary: 11001
Decimal: 1 × 2^4 + 1 × 2^3 + 0 × 2^2 + 0 × 2^1 + 1 × 2^0
     = 16 + 8 + 0 + 0 + 1
     = 25

مثال 2. تبديل عدد باينری 10010000 به مبنای 10.

Binary: 1 0 0 1 0 0 0 0
Decimal: 1×2^7 + 0×2^6 + 0×2^5 + 1×2^4 + 0×2^3 + 0×2^2 + 0×2^1 + 0×2^0
     =128 + 0 + 0 + 16 + 0 + 0 + 0 + 0
     =144

کاراکتر ^ نشان دهنده عمل توان است.


تبديل اعشاری به باينری

چندين روش برای تبديل اعداد اعشاری به باينری وجود دارد. يک روش متداول تقسيم های متوالی بر 2 است. به اين ترتيب که عدد اعشاری بر 2 تقسيم می شود، باقيمانده بعنوان رقم باينری نگهداشته و خارج قسمت مجدد بر 2 تقسيم می شود اين عمل تا زمانی که خارج قسمت صفر شود ادامه پيدا می کند.


مثال. تبديل عدد 43 به مبنای 2

عدد خارج قسمت باقيمانده
43 ÷ 2 21 1
21 ÷ 2 10 1
10 ÷ 2 5 0
5 ÷ 2 2 1
2 ÷ 2 1 0
1 ÷ 2 0 1

با قرار دادن باقيمانده های تقسيم از پايين به بالا عدد باينری 101011 بدست می آيد.


جمع اعداد باينری

جمع باينری ساده به صورت زير محاسبه می شود:

0 + 0 = 0
0 + 1 = 1
1 + 1 = 10
1 + 1 + 1 = 11

برای جمع و عدد باينری کافی است بيت به بيت از سمت راست به چپ عمل جمع انجام شود. رقم نقلی حاصل از هر ستون در جمع ستون بعدی اعمال می شود.




1 1

1 1 0 1 1
+ 0 0 0 0 1
  1 1 1 0 0

سيستم عددی هگز (Hexadecimal)

هگزادسيمال (يا به طور خلاصه هگز) روش فشرده تری را برای نمايش اعداد باينری ارائه می دهد به همين دليل توسط اسمبلر و ديباگر برای مختصر نوشتن اعداد باينری بکار می رود.

اعداد هگز مبنای 16 را استفاده می کنند و از 16 رقم (0-15) تشکيل شده اند. برای نمايش ارقام بعد از 9 از حروف A تا F استفاده می شود. به عبارت ديگر 16 رقم هگز شامل 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F است که حروف A-F ارقام 10-15 را نشان می دهند (A=10، B=11، C=12، D=13، E=14 وF=15).

هر رقم هگز معادل چهار بيت باينری است. يک عدد چهار بيتی يک نيبل (Nibble) نام دارد. پس هر رقم هگز معادل يک نيبل است. دو نيبل يک بايت (Byte) را می سازد بنابراين هر بايت می تواند دو رقم هگز را نشان بدهد. مقدار يک بايت می تواند از 00000000 تا 11111111 باينری، 00 تا FF در هگز و 0 تا 255 در دسيمال باشد.


تبديل هگز به اعشاری

ارزش هر رقم هگز با توانی از 16 مشخص می شود. برای تبديل اعداد از مبنای 16 به 10 هر رقم عدد در ارزش مکانی اش ضرب می شود.


جدول توان های 16 در مبنای 10

جدول اعداد 0 تا 15 به صورت باينري و هگز


مثال. تبديل عدد 3BA4h به مبنای 10.

Hex : 3BA4
Decimal: 3×16^3 + 11×16^2 + 10×16^1 + 4× 16^0
     = 3×4096 + 11×256 + 10×16 + 4×1
     = 15268

تبديل اعشاري به هگز

برای تبديل دسيمال به هگز مانند باينری تقسيم های متوالی بر 16 انجام می شود.


مثال. تبديل عدد 589 به هگز

عدد خارج قسمت باقيمانده
589 ÷ 16 36 13
36 ÷ 16 2 4
2 ÷ 16 0 2

با قرار دادن باقيمانده های تقسيم از پايين به بالا عدد باينری 24D بدست می آيد.


تبديل هگز به باينری

تبديل هگز به باينری ساده است. کافی است هر رقم هگز به يک عدد چهار رقمی باينری تبديل شود.


مثال. تبديل عدد 160794h به باينری.

Hex: 1 6 0 7 9 4
Binary: 0001 0110 0000 0111 1001 0100

توجه کنيد که صفرهای ابتدای چهار بيت اهميت دارند. اگر اين صفرها برای ارقام ميانی قرار نگيرند حاصل اشتباه است.


تبديل باينری به هگز

تبديل از باينری به هگز هم ساده است. ابتدا عدد باينری از راست به چپ به گروه های چهاربيتی تقسيم شده (اگر آخرين گروه سمت چپ کمتر از چهار بيت بود صفر اضافه می شود)، سپس هر بخش به يک رقم هگز تبديل می شود.


مثال. تبديل عدد 101100000011110010100b به هگز

Binary: 0001 0110 0000 0111 1001 0100
Hex : 1 6 0 7 9 4
= 160794h

جمع اعداد در هگزادسيمال

چند جمع ساده در مبنای 16.

7 + 3 = A
6 + 7= D
F + 1 = 10
10 + 30 = 40
F + F = 1E
38 + 18 = 50
FF + 1 = 100

جمع دو عدد هگز


1
1

7 E C 6
+ 3 4 0 A
  B 2 D 0

6 + A = 6 + 10 = 16 => 10h
C + 0 + 1 = 12 + 0 + 1 = 13 => Dh
E + 4 = 14 + 4 = 18 => 12h
7 + 3 + 1 = 11 => Bh




    ویدیو : فرق زبان اسمبلی و زبان ماشین
این مطلب را به اشتراک بگذارید :

a b