نمايش داده ها

نمايش داده ها

 

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

اعداد صحیح
کاراکترها

نحوه نگهداری اطلاعات در حافظه را نمایش داده (Data Representation) می گویند. روش های نگهداری داده ها بسته به نوع آنها متفاوت است. اطلاعات معمولا به دو صورت ارائه می شوند: عددی ( صحیح و ممیرشناور) و حرفی.

میزان فضای درنظر گرفته در حافظه برای نگهداری داده را طول نمایش می نامند.

 

اعداد صحیح

اعداد صحیح باینری به دو شکل دیده می شوند:

1. اعداد صحیح بدون علامت (unsigned Integer) که شامل اعداد صحیح غیر منفی هستند.
2. اعداد صحیح علامت دار (signed Integer) که می توانند مثبت یا منفی باشند.

نمایش اعداد صحیح بدون علامت

اعداد صحیح بدون علامت همیشه بزرگتر یا مساوی با صفر هستند، مانند سن یا قد، یعنی هیچوقت مقدار منفی نمی گیرند. کلیه بیت های طول نمایش در این اعداد به داده اختصاص داده می شود. کمترین مقدار ممکن یک عدد صحیح بدون علامت وقتی است که کلیه بیت ها صفر باشد که معادل عدد 0 است. در بزرگترین عدد صحیح بدون علامت کلیه بیت های عدد یک است.

مثال. بزرگترین و کوچکترین عدد صحیح بدون علامت با 8 بیت طول.

Unsigned Integer

 

جدول تعداد بيت ها و محدوده مقادير ممکن داده های عددی صحيح بدون علامت

Storage Type

Bits

Range (low - high)

Unsigned byte80 ... 255
Unsigned word160 ... 65,535
Unsigned doubleword320 ... 4,294,967,295
Unsigned quadword640 ... 18,446,744,073,709,551,615

نمایش اعداد صحیح علامت دار

اعداد صحیح علامت دار می نوانند مثبت یا منفی باشند. برای تشخیص علامت عدد یکی از بیت های طول نمایش را به بیت علامت اختصاص می دهند. روش های متعددی برای نمایش علامت عدد وجود دارد در کلیه این روش ها با ارزش ترین بیت (سمت چپ ترین بیت) را به عنوان بیت علامت (sign bit) درنظر می گیرند. اگر این بیت صفر باشد عدد مثبت و اگر 1 باشد عدد منفی است.

Integer

روش نمایش مکمل2

کامپیوترهای امروزی روشی به نام فرم مکمل 2 (2’s Complement) را برای نمایش اعداد صحیح علامتدار استفاده می کنند که روش خوبی برای ذخیره اعداد صحیح علامت دار به صورت باینری است. در این روش از مکمل گیری برای منفی کردن استفاده می شود.

مکمل2 یک عدد در دو مرحله بدست می آید:

1. پیداکردن مکمل1 عدد
2. اضافه کردن 1 واحد به نتیجه مرحله اول

مثال. برای بدست آوردن مکمل2 عدد 56 ابتدا مکمل1 آن محاسبه سپس یک واحد به آن اضافه می شود.

 

56 = 00111000 b

1’s complement = 11000111     مکمل یک عدد ، صفر به یک و یک به صفر تبدیل می شود

2’s Complement = 11000111+1 =11001000      مکمل دوعدد 56

 

یک عدد صحیح مثبت در فرم مکمل2 مانند اعداد بدون علامت نمایش داده می شوند یعنی در مبنای 2 نوشته شده و به اندازه کافی صفر در سمت چپ آن اضافه می شود تا طول نمایش را بسازد.

برای نمایش یک عدد صحیح منفی در فرم مکمل2، ابتدا عدد را به مبنای 2 برده، سمت چپ آن صفر اضافه می شود تا طول نمایش را بسازد سپس مکمل 2 عدد گرفته می شود.

مثال. نمایش عدد +1116 به فرم مکمل2 در 16بیت به صورت زیر نمایش داده می شود.

+1116 = 0000 0100 0101 1100b =045C h

مثال: نمایش عدد -97 به فرم مکمل2 در 8 بیت.

 

Decimal: -97

Binary: 01100001 b

2’Complement: 10011111 b = 9F h

 

عمل مکمل گیری مانند عمل منفی کردن است، به همین دلیل با گرفتن مکمل2 از یک عدد منفی به عدد مثبت مطابق آن می رسیم و برعکس.

مثال. بنابراین عدد 11001000 b نمایش عدد 56- در مثال اول است.

وقتی عددی به فرم مکمل 2 نمایش داده شده است، برای اعداد مثبت بیت علامت باید صفر باشد یعنی در مبنای هگز آخرین رقم عدد بین 0 تا 7 باشد. عدد منفی به بیت علامت 1 ختم می شود و می تواند ارقام بین 8 تا F را در آخرین رقم هگز داشته باشد. وقتی علامت عدد مکمل2 تشخیص داده شد برای پیدا کردن عدد در مبنای 10 در اعداد مثبت کافی است به مبنای 10 برده شود و برای اعداد منفی ابتدا مکمل2 گرفته شود سپس به مبنای 10 برده شود.

مثال. 0D43h یک عدد مکمل 2 با طول 16 بیت است که معادل مبنای 10 آن عدد 3395+ است.

مثال. B2EBh نمایش یک عدد صحیح در سیستم مکمل 2 است معادل آن در مبنای 10 به صورت زیر بدست می آید.

B2EB h = 1011 0010 1110 1011 b بیت علامت یک است یعنی عدد منفی است
2’Complement : 0100110100010101 مکمل دو عدد محاسبه می شود و تبدیل به مبنای 10 می شود
  = 19733 ==> -19733

نمایش مکمل دو باعث می شود اعداد منفی یکی بیشتر از اعداد مثبت باشند (وقتی همه بیت ها 1 است).

مثال. بزرگترین و کوچکترین عدد صحیح علامت دار با 8 بیت طول.

Signed Integer

 

جدول تعداد بيت ها و محدوده مقادير ممکن داده های عددی صحيح علامت دار به روش مکمل2

Storage Type

Bits

Range (low - high)

Signed byte8-128...+127
Signed word16-32,768...+32,767
Signed doubleword32-2,147,483,648...+2,147,483,647
Signed quadword64

-9,223,372,036,854,775,808

+9,223,372,036,854,775,807...

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

کاهش و افزایش طول داده

در اسمبلی کلیه داده ها اندازه مشخص شده ای دارند. گاهی ناچار به تغییر اندازه داده هستیم. برای کاهش اندازه داده کافی است بیت های با ارزش حذف شوند. این روش برای اعداد بدون علامت و علامت دار کار می کند. قاعده کلی این است که برای اعداد بدون علامت کلیه بیت های حذف شده باید صفر باشند. و برای اعداد علامت دار بیت های حذف شده باید همگی یا 1 و یا همگی 0 باشند. البته اگر عدد را نتوان به طرز صحیح در اندازه کوچکتر نمایش داد کاهش اندازه درست کار نمی کند.

افزایش داده پیچیده تر از کاهش است. عدد هگز FF را اندازه بگیرید. گسترش آن بستگی دارد که آن را چطور تفسیر کنیم. اگر آن را یک عدد بدون علامت درنظربگیریم(یعنی عدد 255)، به صورت 00FF گسترش داده می شود و اگر علامت دار باشد(یعنی 1-) به صورت FFFF. به طور کلی برای گسترش اعداد بدون علامت کلیه بیت های جدید عدد گسترش یافته صفر می شوند ولی برای گسترش یک عدد علامت دار باید بیت علامت را بسط داد، به این معنا که.بیت های جدید بیت علامت را در خود کپی می کنند.

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

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

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

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

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

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

 

سیستم عددی اعشاری

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

 

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

     = 200 + 30 + 4

 

 

سیستم عددی دودوئی

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

تبدیل باینری به دهدهی

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

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

Binary: 11001

Decimal: 1 × 24 + 1 × 23 + 0 × 22 + 0 × 21 + 1 × 20

    = 16 + 8 + 0 + 0 + 1

    = 25

 

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

 

Binary: 1 0 0 1 0 0 0 0

Decimal: 1×27 + 0×26 + 0×25 + 1×24 + 0×23 + 0×22 + 0×21 + 0×20

    =128 + 0 + 0 + 16 + 0 + 0 + 0 + 0

    =144

 

تبدیل دهدهی به باینری

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

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

عددخارج قسمتباقیمانده
43 ÷ 2211
21 ÷ 2101
10 ÷ 250
5 ÷ 221
2 ÷ 210
1 ÷ 201

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

روش دیگر برای تبدیل مبنای 10 به 2 استفاده سری توان های 2 است. به این صورت که بزرگترین عدد در سری زیر را که از 43 کوچکتر است را از آن کم می کنیم و این عمل را مجدد ادامه می دهیم. زیرهر عددی که در تفریق شرکت می کند 1 می گذاریم و بقیه اعداد را صفر قرار می دهیم.

        
1286432168421
  101011

 

43-32=11

11-8=3

3-2=1

1-1=0

 

مشاهده می کنید که همان عدد باینری 101011 بدست می آید.

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

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

 

0 + 0 = 0

0 + 1 = 1

1 + 1 = 10

1 + 1 + 1 = 11

 

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

   11 
 11011
+00001
 11100

 

سیستم عددی هگزادسیمال

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

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

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

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

مثال. تبدیل عدد 000111100000011110110100b به هگز

000111100000011110110100
1E07B4

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

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

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

 

Hex: 6 0 7 9 4

Binary: 0110 0000 0111 1001 0100

 

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

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

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

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

عددخارج قسمتباقیمانده
589 ÷ 163613
36 ÷ 1624
2 ÷ 1602

با قرار دادن باقیمانده های تقسیم از پایین به بالا عدد باینری 24D بدست می آید (به جای عدد 13 حرف D قرار می گیرد).

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

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

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

 

Hex : 3BA4

Decimal: 3×163 + 11×162 + 10×161 + 4× 160

     = 3×4096 + 11×256 + 10×16 + 4×1

     = 15268

 

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

چند جمع ساده در مبنای 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

 1 1 
 7EC6
+340A
 B2D0

 

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

 

 

اعداد ممیزشناور

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

مثال. عدد 523.0 به صورت علمی می تواند به صورت های 523.0×100، 52.30×101، 5.230×102 نوشته شود.

البته ممیزشناور روش تقریبی برای یک عدد حقیقی است زیرا اعدادی مانند عدد پی ...3.14159265 انتهایی ندارد و بینهایت بیت برای نمایش آن نیاز می شود.

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

مثال. 34.890625 شامل بخش صحیح 34 و بخش کسر .890625 است. معادل باینری عدد 34 عدد 100010 b است.

برای تبدیل قسمت کسر به جای تقسیم از ضرب های متوالی بر دو استفاده می شود. هر بار قسمت کسر دوباره در 2 ضرب می شود تا وقتی که حاصل به 1.0 برسد. البته ممکن است گاهی این اتفاق نیافتد بنابراین عمل ضرب به تعداد بیت های مانتیس ادامه پیدا می کند ( 23 بیت برای دقت معمولی)

مثال. تبدیل بخش کسری 0.890625 به باینری که عدد 111001. می شود.

عددخارج قسمتباقیمانده
.890625 * 21.781251
.78125 * 21.56251
.5625 * 21.1251
.125 * 20.250
.25 * 20.50
.5 * 21.01

عدد 34.890625 به باینری می شود 100010.111001 یا 20×100010.111001

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

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

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

مقایسه زبان اسمبلی و زبان های سطح بالا

 

زبان های برنامه نویسی در دو سطح کلی طبقه بندی می شوند: زبان های سطح بالا و سطح پایین.

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

اکثر برنامه نویسان با زبان های سطح بالا مانند C++ یا Java کار می کنند که هر عبارت آن به چند دستورالعمل زبان ماشین ترجمه می شود. نوشتن برنامه در زبان های سطح بالا خصوصا در محیط های ویژوال راحت تر، سریع تر و با هزینه کمتری انجام می شود.

 

مثال 1. اعداد دودئی زیر یک دستورالعمل زبان ماشین خانواده اینتل است که عدد 5 را در ثبات AL قرار می دهد.

1011 0000 0000 0101

مثال 2. کلمه mov نمادی برای عمل انتقال داده است. دستور اسمبلی زیر مقدار 5 را در ثبات AL قرار می دهد که معادل کد زبان ماشین مثال 1 است.

mov AL,5

یک برنامه اسمبلی مانند برنامه های سطح بالا به صورت متنی نوشته می شود. هر دستورالعمل زبان اسمبلی یک کد الفبائی کوتاه (mnemonic) از یک دستورالعمل ماشین است، که به این صورت معنی دستور واضح تر از کد زبان ماشین می شود. بین عبارات زبان اسمبلی و دستورالعمل های زبان ماشین تناظر یک به یک برقرار است. یعنی هر دستورالعمل اسمبلی دقیقا یک دستورالعمل زبان ماشین را نشان می دهد و بالعکس، در حالیکه در زبان سطح بالا یک عبارت معمولا به چندین دستورالعمل ماشین تبدیل می شود.

مثال 3. کلمه add یک نماد برای دستورالعمل جمع است. دستور جمع ثبات های EAX و EBX به صورت زیر نوشته می شود.

add EAX, EBX

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

0000 0011 1100 0011

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

فرم کلی دستورالعمل های اسمبلی به صورت زیر است:

(mnemonic operand(s

هر دستور اسمبلی می تواند تعدادی عملوند به دنبال خود باشد. عملوند (operand) محل داده ای که قرار است دستورالعمل روی آن اجرا شود را مشخص می کند و می تواند به شکل های زیر باشد :

• ثبات. عملوندهائی که مستقیما به محتوای ثبات های پردازنده مراجعه می کنند. مانند ثبات AL در مثال 2.
• متغیر یا حافظه ای. عملوندهائی که به داده ای در حافظه اشاره دارند. مانند متغیر Count در مثال 6.
• فوری. این عملوندها مقادیر ثابتی هستند که در داخل دستورالعمل قرار می گیرند. مانند عدد 5 در مثال 2.
• ضمنی. عملوندهائی که صریحا در دستور ذکر نمی شوند. در مثال 5عدد 1 با ثبات AL جمع می شود. عدد 1 عملوند ضمنی است.

مثال 4. دستوری که عملوندی ندارد و فلگ carry را صفر می کند.

clc

مثال 5. دستور زیر عدد یک را به ثبات AX اضافه می کند.

inc AX

مثال 6. دستور جمع مقدار متغیر Count با محتوای ثبات به صورت زیر است.

add AX,Count