99

Assembly

Embed Size (px)

Citation preview

Page 1: Assembly
Page 2: Assembly

  

  

2

بخش اول : مقدمه

: فصل اول

دليل استفاده از زبان اسمبلي انواع روش هاي نمايش اطالعات در كامپيوتر

: فصل دوم

پروسسور ، حافظه و ساختار كامپيوتر هاي شخصي ) I/O (

Pentium هاي پروسسور اسمبلي بخش دوم : زبان

سومفصل : پروسسور هاي ساختارPentium

چهارمفصل : مروري بر زبان اسمبلي

پنجم فصل : ( ايجاد ، اسمبل ، پيوند و اجراي برنامه هاي اسمبلي ) ساختار برنامه اسمبلي

ششم فصل : برنامه نويسي با ابزارprocedures وstack

هفتم فصل : يتي و داليل استفاده از آنهاب 32بيتي و 16انواع روش هاي آدرس دهي در پروسسور هاي

هشتم فصل :

دستورات محاسباتيarithmetic و رجيسترflag نهم فصل:

دستورات شرطي و حلقه دهم فصل :

دستورات منطقي و دستكاري بيت ها زدهم يا فصل:

String processing دوازدهم فصل:

محاسباتBCD وASCII

Page 3: Assembly

  

  

3

Pentiumپروسسور هاي ) در Interruptمكانيزم پردازش وقفه ( : بخش سوم

سيزدهمفصل :

پردازش وقفهProtected - mode

چهاردهمفصل :

پردازش وقفه Real – mode

بخش چهارم : مباحث پيشرفته در اسمبلي

پانزدهمفصل :

پياده سازيRecursive

شانزدهمفصل :

دستورات Floating - Point پروسسور هاي درPentium

هفدهمفصل :

ماكرو

بخش پنجم : كاربرد

هجدهمفصل : مقيم كردن برنامه در حافظه

نوزدهمفصل :

طرز كار پورت موازي

بيستمفصل :

Mixed-mode Programming

Page 4: Assembly

  

  

4

Introduction to Assembly Language Programming for Pentium and RISC Processors By Sirarama P. Dandamud , school of computer science IBM PC Assembly Language and Programming

By Peter Abel , Prentice-Hall

The 80x86 IBM PC and Computers ( Volume I&II ) By M.A. Mazidi , Prentice-Hall

Peter Nortons Assembly Language Book For the

IBM PC By Peter Norton , Prentice-Hall

زبان ماشين و اسمبلي و كاربرد آن در كامپيوتر هاي شخصي دكتر

ي ، دانشكده فني دانشگاه تهران ، انتشارات ناقوسحسن سيد رض

Page 5: Assembly

  

 

ر را

ن

S

S

P

ي برند .

با آن پروسسور

رد كه به ماشين

System Inde

Applicati High Lev

System Depe

Assembl

Machine

Hardwar

Processor A CISC ( C RISC ( R

RISC بهره ميب low levelح

دستور وجود دا

ر كند .

ependent ion Level ( vel Languag

endent y Language

Language re Level & O

ArchitectureComplex InstReduced Ins

Cري نسبت به

نويس در سطح

عداد محدودي د

ارتباط بر قرا

Word Procege Level ( J

Level OS System

عادل آن

e truction Settruction Se

شتر و پيچيده ترارد كه برنامه ن

پروسسور ) ، تع

 5

با كامپيوتر ا

ي پروسسور essor ) JAVA & C )

مبلي شين Call

سمبلي و مع

t Computerset Computer

ه دستورات بيشخاص خود را د

نام دارد .

طح باال

قل از معماري پ

ن اسمبلياند بر مي تو

ستقل از معماري

)

زبان اسم زبان ماش

سور در زبان اس

s ) INTErs ) MIP

CI از مجموعهوعه دستورات خه زبان اسمبلي

ي به زبان سط

Porta مستقل )

اده از زبانحي كه كاربر

مس

ماري پروسسو

EL PS

SCسسور هاي

روسسور مجمون مي سازد كه

نامه نويسي

ableع ، ساده ،

ته است .

ليل استفاانواع سطوح

انواع معم –

پروس هر پر

ممكن

مزاياي بر –

سريعوابست

ش اول : دل1-1 –

1-2 –

1-3 –

بخش

Page 6: Assembly

  

  

6

داليل استفاده از زبان اسمبلي – 1-4

ميزان مصرف حافظه كمتر

زمان اجراي سريع تر

دسترسي در سطح سخت افزار مانند نوشتنdriver براي يكdevice جديد

درك بهتر از سخت افزار و پروسسور ها جهت كاربرد هاي آموزشي

معموال از زبان سطح باال براي نوشتن برنامه ها استفاده مي شود و در هر بخش كه نياز باشد مي توان آن را با زبان

(Hybrid or Mixed – mode Programming) اسمبلي تركيب نمود .

Page 7: Assembly

  

 

؟

Dec Bin Oct Hex

m را بدست آوريد

يم ؟

C

C ود .

cimal 10ary 10tal 10xadecimal 10

m. م نياز داريم

چند رقم نياز داري

Convert to D 10100111 247 Q = A7 H = (

Convert fromقسمت صفر شو

ست )

Decimal Binary Octal HexadecimBCD & AS

00 = ( 1 × 1000 = ( 1 × 200 = ( 1 × 800 = ( 1 × 16

رقم mهيم ، به

به چ Octalستم

Decimal B = ( 1 × 27

= ( 2 × 82 + ( A × 161 + 7

m Decimal كنيم كه خارج ق( از چپ به راس

مپيوتر ش اعداد

: base : base : base

mal : base CII

02 + 0 × 101 +22 + 0 × 21 + 82 + 0 × 81 + 62 + 0 × 161 +

نمايش د kناي

داريم ؟ در سيس

7 + 0 × 26 +

4 × 81 + 7 × 160 ) = 16

ر تقسيم مي ك مي نويسيم . (

 7

عات در كام و يا نمايش

is 10 is 2

e is 8 is 16

+ 0 × 100 ) 0 × 20 ) 0 × 80 ) + 0 × 160 )

ش اطالعات مبن

به چند رقم نياز

1 × 25 + …

× 80 ) = 16767 D

اطالعات آنقدرش را بر عكس

يش اطالعشماره گذاري

0,1,2,3,4 0,1 0,1,2,3,4 0,1,2,3,4

= 100 D= 4 D = 64 = 256 D

ده از روش نمايش

Binaryسيستم

ش اطالعات

… ) = 167 D 7 D

سيستم نمايشدر طول پردازش

ش هاي نمايستم هاي ش

4,5,6,7,8,9

4,5,6,7 4,5,6,7,8,9

Decimal Decimal Decimal Decimal

مقدار را با استفاد

عدد در س 150

يستم نمايش

ل را بر مبناي سي توليد شده د

نواع روشانواع سيس –

9

9,A,B,C,D,E,

م nاهيم گر بخو

راي نشان دادن

بديل سيت –

عدد دسيمال باقيمانده هاي

: ان ش دوم1-5 –

,F

اگ

بر

1-6 –

بخش

Page 8: Assembly

  

  

8

دسيمال را به سيستم باينري تبديل كنيد : 167عدد

R Q B PN RQBD N 0 5 2 104183216781 2 2 5314128370 1 2 2212024161 0 2 111102205

R Q B D N 7 20 8 16744 2 8 2032 0 8 220 0 8 01

R Q B D N 7 10 16 1673A 0 16 1020 0 16 01

بايد عدد را به سيستم باينري هگزادسيمال ابتدا به سيستم هاي اكتال يااز سيستم دسيمال ي تبديل يك عددبرامعموال

برده سپس به صورت زير عمل مي كنيم .

تا از سمت راست ارقام را جدا مي كنيم 3تا 3رقم در سيستم باينري است . ( 3هر رقم در سيستم اكتال معادل ل را مي نويسيم كه عدد بدست آمده يك رقم عدد در سيستم اكتال است . عدد در سيستم دسيما 3و معادل آن

Q2 4 7   B 111 100 010 167

تا از سمت راست ارقام را جدا 4تا 4( رقم در سيستم باينري است . 4هر رقم در سيستم هگزادسيمال معادلعدد در سيستم دسيمال را مي نويسيم كه عدد بدست آمده يك رقم عدد در سيستم اكتال 3مي كنيم و معادل آن

است .

7 H A  B 0111 1010 167

. عكس همين روش براي تبديل مستقيم عدد از سيستم اكتال و هگزادسيمال به باينري به كار مي رود

167 D 10100111 B

167 D 0247 Q

167 D 0A7 H

Page 9: Assembly

  

 

ه

A

استفاده مورد)

به است داده خ

Co

پيوتر :

Addition

i + 1 ام ) Cin

overflow" رخ

out = Carry ي

un در كامپي (

جمع

1 بيت در نقلي

w" يا "سرريز"

رقم نقلي

nsignedيح (

.

اد .

ن رقم عنوان به

" كه گويند مي . است شده

Inputxi 0 0 1 1

Truth T

Input xi yi 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1

 9

المت يا وصي

خيره مي شوند .2n- نمايش د (

i ام ) Cout (ب

م اصطالحا ، ودبيشتر نمايش

HALF ADDERt bits Outpu

yi zi 0 0 1 1 0 1 1 0

Table for Binary

bits OCin

0 1 0 1 0 1 0 1

عداد ) بي عال

رت باينري ذخ1تا 0دد را از (

بيت در شده د

Cout شو خارجقابل هاي رقم

R ut bits

Cout 0 0 0 1

Addition Output bits zi Cout 0 0 1 0 1 0 0 1 1 0 0 1 0 1 1 1

طالعات ( اع

تر اعداد به صورعد 2nمي توان

ايجاد نقلي رقم . گيرد

t جمع رقم ينر تعداد از جموع

نمايش ا –

در كامپيوتر باn بيت م

جمع در ،مي قرار

آخري از اگرمج عبارتي

1-7 –

Page 10: Assembly

  

 

به ت

S

است داده رخ "

Bout

Subtraction

"underflow

= Borrow ي

تفريق

يا "سرريز" ه

مي كنيم .

50

قرضي رقم

ت

كه گويند مي ا خ مي دهد .

دوم استفاده م D + (- 40

HInputxi 0 0 1 1

Truth Ta

Input xi yi 0 0 0 0 0 1 0 1 1 0 1 0 1 1 1 1

 10

اصطالحا ، شودد اين حالت رخ

ل و منفي عدد D) = 50 D

Half Subtractet bits Outpu

yi zi 0 0 1 1 0 1 1 0

able of Binary Su

bits OBin

0 1 0 1 0 1 0 1

Bout ش خارجفي حاصل شود

از جمع عدد اول – 40 D

er ut bits

Bout 0 1 0 0

ubtraction Output bits zi Cout 0 0 1 1 1 1 0 1 1 0 0 0 0 0 1 1

جمع رقم رينتي كه عدد منف

ه جاي تفريق ا

آخر از اگروقت عبارتي

در عمل به

Page 11: Assembly

  

 

n

M

D

و يك رقم )

Multiplicatio

Division

quotient )

on رب

باشد .

تقسيم

ي خارج قسمت

ضر

ش نياز داشته با

بيتي nك رقم

 11

قم جهت نمايش

سيم كنيم ، يك مي شود .

رق 2nكن است

بيتي تقس nقم( rem ايجاد م

بيتي ممك nم

بيتي را بر رق 2( minderانده

رقم 2ضرب

م اگر رقn

بيتي باقيما

Page 12: Assembly

  

  

12

) در كامپيوتر : signedنمايش اطالعات ( اعداد ) عالمت دار صحيح ( – 1-8

Signed Integer Representation Signed magnitude Excess – M 1’s Complement 2’s Complement اكثر سيستم ها خصوصا سيستم هاي پنتيوم از اين روش استفاده مي كنند

Signed magnitude اگر ماn ، بيت داشته باشيم n-1 بيت براي نمايش عدد و پر ارزش ترين بيت براي بيت عالمت در نظر گرفته

و در غير اين صورت مقدار صفر دارد . 1مي شود . در صورتي كه عدد منفي باشد مقدار

اگرn 2-بيت داشته باشيم مي توان ازn-1 2تاn-1-1 . را نمايش داد

. در اين روش صفر دو نمايش مثبت و منفي دارد

Excess – M Representation مقدارM . را به عدد دلخواه اضافه مي كنيم

M بايد عددي باشد كه مقدارX+M 2ازn بيشتر نباشد كهn . تعداد كل بيت ها مي باشد

Number Representation Using 4-Bit Binary (All numbers except Binary column in decimal)

Unsigned representation

Binary pattern

Signed magnitude

Excess-7 1’s Complement 2’s Complement

0 0000 0 −7 0 0 1 0001 1 −6 1 1 2 0010 2 −5 2 2 3 0011 3 −4 3 3 4 0100 4 −3 4 4 5 0101 5 −2 5 5 6 0110 6 −1 6 6 7 0111 7 0 7 7 8 1000 −0 1 −7 −8 9 1001 −1 2 −6 −7 10 1010 −2 3 −5 −6 11 1011 −3 4 −4 −5 12 1100 −4 5 −3 −4 13 1101 −5 6 −2 −3 14 1110 −6 7 −1 −2 15 1111 −7 8 −0 −1

 

Page 13: Assembly

  

 

2n

2n

n-1-1 است از

n-1-1 است از

ي در ضرب و

1’s Comp

عبارت M كه

2’s Com

عبارت M كه

خ مي دهد .

وجود ندارد ولي

plement

ضافه مي كنيم .

plement

ضافه مي كنيم .

over flow رخ و بي عالمت و

م .

را اض M مقدار

م .

را اض M مقدار

ده برابر نباشد

داد عالمت دار شود .

 13

تبديل مي كنيمند روش قبلي

تبديل مي كنيمند روش قبلي

نقلي ايجاد شدفاوتي ميان اعدب بررسي مي ش

ر ها را به يك عدد منفي مانن

ر ها را به يك عدد منفي مانن

left ( با رقمجمع و تقريق تفبات اين مطلب

به صفر و صفرر اين روش به

به صفر و صفرر اين روش به

t – mostي (

مورد عمليات جمحاسبر فصل

يك ها را در اصل در

يك ها را در اصل در

رين رقم خروجيمه نويسي در م

وت دارد . د تفا

هر آخر در برنام

تقسيم

Page 14: Assembly

  

 

فاده مي كنيم .

كرد .

ري مياني استفا

.

ش زير استفاده ك

لذا از رقم باينر

ار

ار

اري صفر شودي توان از روش

كن نمي باشد

 14

: ي

بخش اعشا

بخش اعشا

كه بخش اعشال و بالعكس مي

شين حساب ممك

داد ) اعشاري

دسيمال در

ه باينري در

ك ه پيدا مي كندناها به دسيمال

بدون ماش 16ا

طالعات ( اعد

ل باينري به

ل دسيمال به

ه تا زماني ادامهشاري تمام مبن

و يا 8قسيم بر

نمايش اط –

تبديلگوريتم

تبديلگوريتم

اين پروسهبديل بخش اعش

و يا تق 16يا 8

1-9 –

الگ

الگ

براي تب

ضربدر

Page 15: Assembly

  

 

(B:

ت

BDC)America

از خطا محافظت

an Standard

اده مي شود .ASCIIكد ال،

0 1 2 3 4 5 6 7 8 9

(BDC)Bin:

Code for Inf

استفا ASCIIاز گيرد تا در انتقا

0000 0001 0010 0011 0100 0101 0110 0111

1000 1001

nary Coded D

formation Int

تر هاي خاص ااده قرار ميستف

 15

Decimalرت

terchangeي

، اعداد و كاركتر paritمورد است

عات به صور

ف در كد اسكي

چك انگليسي ،tyت بيت توازن

و ذخيره اطالع

اعداد و حروف

ف بزرگ و كوچجهت ASCIIد

نمايش و –

ا نمايش – 1

كد كردن حروفت اضافه در كد

1-10 –

1-11

جهت ك يك بيت

شود .

Page 16: Assembly

  

 

B

8

P

In

BUS Address

Data bus

Control b

8086

Data bus Address

Pentium Data bus Address

ntel 64-bit Data bus Address

م كامپيوتر bus ( طرفهs ( طرفهbus ( طرفه

s = 16 bit bus = 20 b

s = 64 bit bus = 32 b

t s = 64 bit bus = 128

صلي يك سيستم ( يك ط ( دو ط ( يك ط

bit ( suppo bit ( suppo bit ( suppo

 16

:مپيوتري

مؤلفه هاي اص

ort maximum

ort maximum

ort maximum

سيستم كام

ارتباطي ميان

m 220 byte

m 232 byte

m 264 byte

Inte

ي اصلي يك

پل

= 1MB m

= 4GB m

e = ?!!! m

erconnect w

مؤلفه هاي –

emory )

emory )

memory )

with bus

2-1 –

Page 17: Assembly

  

 

C

P

باشد .

Control Sign

Memory (I/O )re Interrupt Bus requ

Processor Fetch ins

Decode i

Execute

اشاره مي كند.

و خروجي مي

ZF: SF:

nals read / Me

ead / (I/O) t / Interrupuest / Bus

رت اند از :

structions f

instructions

instruction

بايد اجرا شود مي شود .

ه هاي ورودي

Zero FlaSign Flag

mory Write write pt acknowlegrant

ه است كه عبار

from memor

s s

در حافظه كه به كار گرفته م

حافظه و دستگا

CF :agOF :g

 17

e

edge

وجود در حافظه

ry

س دستور بعديجه محاسبات

ي كنترلي به ح

Carry Fla:Overflow:

Proce (:

برنامه هاي مو

كشي دستور خيص دستور اجرا كردن

Instr به آدرسص وضعيت نتيج

ل سيگنال هاي

PagAw Flag

essorسسور (

مسئول اجراي

واكتشخ

ruction Poin

fla كه تشخيص

ل مسئول ارسا

ParityF:AuxiliF:

پروس – 2-2

پروسسور م

IP ياnter

رجيسترag

واحد كنترل

y Flagiary Flag

2

Page 18: Assembly

  

 

ظيفه

د .

ازنده

) نياز دارد . وظ ي مي نمايد .

ده قرار مي دهدات ارسالي پرد

M

interface (رودي و خروجير اختيار پردازندهمچنين اطالعا

Memory RAM ROM ( S

هاي واسط (تگاه هاي ورس

ل مي كند و درچاپگر است . ه

Store BIOS

روجي به مدارو دس CPUراي

تبديل ASCIIدمشغول بودن چ

)

 18

:) I/Oي (

ي ورودي و خر قابل استفاده برده شده را به كدن آزاد بودن يا م

ودي و خروجي

با دستگاه هايكه اطالعات را، كليد فشار دادول چك كردن

كند .

تگاه هاي ورو

جهت ارتباط بin اين است ك

ط صفحه كليد ،ط چاپگر ، مسئور منتقل مي كن

:حافظه

دستگ – 2-3

پروسسورnterface

مدار واسط مدار واسط

را به چاپگر

2-4 –

2

Page 19: Assembly

  

 

حتما

R

از عملوند ها ح

Register General

D P In

Control ( Segment

.

در ضرب يكي

Data (4) Pointer (2) ndex (2) 3(2) 3t (6) 1

بيتي بهره برد.

به عنوان مثال

32 bit 32 bit 32 bit 32 bit 16 bit

ب 32بيتي و يا ت استفاده كرد .ستفاده كرد . به

ي گيرد .

ره برد .

ده كرد . ستفا

 19

:

16بيتي ، 8تدون محدوديتر ها مي توان ا

استفاده قرار ميي عمومي بهرستر مي توان اس

Pentium ور

توان به صورتتر هاي فوق بد از اين رجيستر

باشد .

رشته اي مورديستر هاوان رج

از اين دو رجيس

هاي پروسسو

هاي فوق مي توان از رجيست فقط از بعضي

A و ياEAX

ب در عمليات رمي توان به عنوصر آرايه فقط

رجيستر ه –

ك از رجيستر محاسبات ميضي از دستورات

AL ،X جيستر

فوق اغلبرهاي سترهاي فوق م

سترسي به عناص

3-1 –

از هر يك در اكثر در بعضي

بايد رجي

رجيستر از رجيس براي دس

Page 20: Assembly

  

 

ند .

مي گيرد .

ره برد .

ست .

شود .

مه اشاره مي كن

 20

رد استفاده قراري عمومي بهر

دستور بعدي اسكي اضافه ميديگري از برنام

مور stackريوان رجيستر ها

جهت اجراي ديك IPي شود به

loop به بخش د

سازي و نگه دارعنو مي توان به

ه مكان حافظهفظه خوانده ميpت پرشي مانند

با هدف پياده سسترهاي فوق م

، اشاره به IPز توري كه از حافنيز در دستورات

بيشتر با از رجيس

هدف از هر دست گاهي ن

Page 21: Assembly

  

 

داكثر

ها

اشد .

شد بنابراين حد

راست سمت م

ك از رجيستر ه

ه داده كافي نبا

مي شود .

بيتي مي باش 16

رقم( باشد يت

D توسط هر يك

ده جهت دخيره

و پشته تقسيم6 اين سگمت

با 16 از ضربي

يت )

(E)BP و درS

ي كند .

مي كند .

گر سگمنت داد

منت كد ، دادهد . چرا ؟ ( زيرا

مي باشد ) 6مض بايد سگمنت

) شود مي

بي 16( گيرد .Pتوسط SSر

 21

همزمان نگهداري پشته استفادههره برد . مثال ا

به چندين سگمباشد 64kbر

64kbت معادل

س دو فاصلهود . نم نوشته يچگاه

قرار مي SSيادر IP(E)وسط

ي شود .

سگمنت را ه 6ت كد ، داده ووارد ضروري به

حافظه معموال بمي تواند حداكثر

بايت 65536يام بندي مي شو

هيچ بنابراين ست

شند.

شند.

داشته باشند .يCS ، DSت در

تو CSگمت در

قسيم بندي مي6ي تواند آدرس

و يا سه سگمنتمي توان در مو

ي اسمبلي در حت در حافظه مي

بايت وي 216آنسگمنت تقسيم

اس) 0( صفر ال ها مي توانند

ال از هم جدا باشOve داشته باش

ال روي هم قراروع هر سگمنت

offs در هر سگ ت .

ه به سگمنت تقسور حداكثر مي هر برنامه از در سگمنت ها م

:حافظه –

برنامه هاي هر سگمنت

گنجايش آ حافظه به س

هگزادسيما سگمنت ه

كامال-1 2-erlap

امالك-3 آدرس شرو آدرسset

ممكن است

حافظه پروسس معموال از ديگر

3-2 –

Page 22: Assembly

  

 

افظه قرار

بخواهيد در حاا شماره بيشتر

ت صفر ) .

ي يا بيشتر ) را را در حافظه با

رقم سمت راست

ه اي ( دو بايتيت پر ارزش تر

باشد ( ر 16ز

DS =

Segment

د . لذا اگر كلمهماره كمتر و بايت

مضربي ابايد

STACK

STAC SS=3

Physica

SS + 20 H =

Address +

 22

ذخيره مي شوندر حافظه با شما

سگمنت بعدي ب

KSG SEGMENTDW 10 DU

CKSG ENDS 303CH

al Address = 3 شد

303C0 H + 2

Offset Add

ذ بايتصورتم ارزش تر را در

آدرس شروع س

T STACK ‘STACUP (0)

303C0H+ 0014ذخيره STACKي

0 H = 303E0

dress = Phy

در حافظه به صد بايد بايت كم

كنيد كه حتما آ

CK’

4H=303D4Hآدرس انتهاي

H

ysical Addre

بايت2

اطالعات دذخيره كنيد

دهيد .

فراموش نك طعه كد زير :

سگمنت بعدي

ess

20كلمه معادل 10

در قط 3 مثال :

شروع سآدرس

0

Page 23: Assembly

  

 

گرد است

بايت 16ضرب ظه مورد درخوا

S درخواستD درخواستS فرض

شده ( كه به مضافظ به ميزان ح

ن خواهد شد .

STACK SEGMEN

DATA SEGMEN

SS=200F

ست تعريف ش همين ترتيب مكانش تعيين

NT = 40 BYTE

T = 40 BYTE

برحسب درخوا مي گردد . بهي سگمنت كد

STACK

STAC DATA

DATAE 48 BYTE

48 BYTE

DS = SS + CS = DS +

 23

يين مي كند .ت داده تعيين

منت بعدي يعني

KSG SEGMENTDW 20 DU

CKSG ENDS ASG SEGMENT

DB 40 DUASG ENDS E ر گرفته مي شودظر گرفته مي شود

30 H = 200F 30 H = 20130

MAX 64

نت پشته را تعيي يعني سگمنت

) ، سگم 16ب

T STACK ‘STACUP (0)

T DATA ‘DATAUP (0)

درنظر درنظ

0 H + 30 H = 0 H + 30 H = 4 KB

مل ابتدا سگمنت ، سگمت بعديظه داده ( مضرب

CK’

20130 H 20160 H

بايت4

بايت 4

سيستم عاممي شود )جهت حافظ

طعه كد زير :

40كلمه معادل 20

40

در قط 4 مثال :

0

Page 24: Assembly

  

  

24

: دستورات زبان اسمبلي – 4-1

دستورات زبان اسمبلي پروسسور كاري را انجام دهد ( instruction Machine language instruction generated )

هيچ كد ماشيني توليد نمي شود .و پروسسور كاري انجام نمي دهد يهدايت اسمبل .

كرو ما( Macro )

نوع دستور فوق به صورت زير نوشته مي شوند 3هر

[label] command [operand] [;comment] Repeat: inc result ; increment result by 1

هاي بيشتر ناديده گرفته مي شوند . spaceفاصله بايد وجود داشته باشد . spaceيك بين هر دو فيلد حداقل در خط مجزايي نوشته شود . labelبهتر است

Repeat: inc result ; increment result by 1

: ) Data Allocationتخصيص داده ( – 4-2

. در برنامه نويسي زبان سطح باال ، تعيين متغير و نوع آن دو چيز را مشخص مي كند

فضاي مورد نياز متغير-1

نحوه تغيير محتويات حافظه مربوط به آن متغير-2

تعريف كرد . اما تفسير و تغيير محتوي حافظه مربوط Define Directiveدر زبان اسمبلي ، مي توان فقط ميزان حافظه مورد نياز يك متغير را با به متغير به برنامه نويس وابسته است .

قرار مي دهيم . ‘ ‘اگر بخواهيم اطالعاتي را در كد اسكي ذخيره كنيم آن را داخل

Define Directive DB Define Byte ; 1 byte DW Define Word ; 2 byte DD Define Double Word ; 4 byte DQ Define Quad Word ; 8 byte DT Define Ten Word ; 10 byte

استفاده مي شود . ?RESبراي رزرو كردن فضاي حافظه بدون مقدار دهي اوليه از دستور

unsigned value1 ;

int value2 ;

5مثال :

DATASG SEGMENT DATA ‘DATA’ Stored DB ‘y’; or Stored DB ‘79H’ Value DW 25159 ; or DW 6247H Balance DW -29255 ; DATASG ENDS

memory x 47

x+1 62

Page 25: Assembly

  

  

25

Reserve Space for uninitialized data :

RESB Reserve Byte ; 1 byte RESW Reserve Word ; 2 byte RESD Reserve Double Word ; 4 byte RESQ Reserve Quad Word ; 8 byte REST Reserve Ten Word ; 10 byte

7 مثال :

DATASG SEGMENT DATA ‘DATA’ Sort DB ‘y’ ; 79H Value DW 25159 ; 6247H Total DD 542803535 ; 205A864FH Msg DB ‘Welcome!’ ; DB ‘w’,’e’,’l’,’c’,’o’,’m’,’e’,’!’ List DB 2 Dup (0) DATASG ENDS

: ) Operands( عملوند ها – 4-2

Operands Register Register addressing mode Immediate addressing mode خود دستور

Memory addressing mode حافظه

I/O

6مثال :

DATASG SEGMENT DATA ‘DATA’ Response RESQ ; Reserve 8 byte Buffer REST ; Reserve 10 byte DATASG ENDS

memory x

x+1 x+2 x+3

memory x 79

x+1 47 x+2 62 x+3 4F x+4 86 x+5 5A x+6 20 x+7 57

memory x+8 65 x+9 6C x+10 63 x+11 6F x+12 6D x+13 65 x+14 00 x+15 00

Page 26: Assembly

  

  

26

: ) Addressing Modes( روش هاي آدرس دهي – 4-3

Addressing modes Register Addressing Mode Immediate Addressing Mode Memory Addressing Modes

Direct Addressing Mode حافظه مستقيما در دستور قرار مي گيرد آدرس

Indirect Addressing Mode در اين روش ، عملوند ها در حافظه قرار دارند و آدرس حافظه در دستور قرار داده مي شود . حافظه است كه كاربرد هاي مختلف دارد . offsetاستخراج تفاوت انواع روش هاي آدرس دهي حافظه در

DS : OFFSET Physical Memory Address 8 مثال :

.data Response DB ‘Y’ .code ; Register Addressing Mode MOV AL , BL بيتي 8انتقال MOV AX , BX بيتي 16انتقال

بيتي 32انتقال MOV EAX , EBX

; Immediate Addressing Mode MOV AX , 75H ( register , immediate )

; Memory Addressing Mode MASM & TASM ; Direct Addressing Mode MOV AL , [4000] ; Indirect Addressing Mode MOV AL , Response ; Memory Addressing Mode NASM ; Indirect Addressing Mode MOV AL , [Response] MOV AL , Response

قرار مي دهد ، نه محتويات آدرس مورد نظر را . ALرا در Responseآدرس NASMدر MOV AL , Responseدستور آدرس MOV AL , Responseو يا دستور LEA AL , Responseيا MOV AL , OFFSET Response، دستور MASM/TASMدر

Response را درAL . قرار مي دهد

جلو مي رويم NASMساس در اين كالس بر ا عيب آدرس دهي مستقيم در اين است كه نمي توان بيش از يك مؤلفه از يك متغير را آدرس دهي نمود . مثال يك آرايه را كه با يك متغير

ؤلفه هاي يك آرايه را يك به يك دسترسي يافت .معرفي مي شود و بايد بتوان م

. انواع آدرس دهي غير مستقيم در فصل هفتم بررسي خواهد شد

مي كند آن اشارهبه Responseمحتويات خانه اي از حافظه كه

قرار مي گيرد AL حافظه در رجيستر 4000محتويات آدرس

مي كند اشارهآن به Responseمحتويات خانه اي از حافظه كه قرار مي دهد ALرا در Responseآدرس

Page 27: Assembly

  

 

دد را توجه

D

M

و پشته .

كار ابتدا بايد عد . به مثال زير ت

E

Data transfe MOV ECHG XLAT MOSX MOVZX

MOV DESTIN Destinat

M M M

Destinat M M

ستورات رشته وS . براي اين ك

ت انتقال دهيم

ECHG DESTI

:

er instructio

ل هشتم ل هشتم

NATION , Stion RegisteMOV RegisteMOV RegisteMOV Registetion RegisteMOV MemorMOV Memor

رد .

م داد مگر در دسDS ،CS ،SS

داخل سگمنت

INATION , S

ECHG EAX ECHG [ Re ECHG [To ECHG [Re

Data Tra (

on

فصل فصل

SOURCE r er , immedier , Registeer , Memorr ry , immediary , Registe تاثير نمي گذارطالعات انجامSسگمنت نمود

داخل ثبات به

.data .code ; Mov M M

. ص كنيد

SOURCE

X , EBX esponse ] , Cotal] , DX esponse] , [To

 27

ansfer Instr

iate er ry

ate er

ها flagام ازانتقال ا حافظه

رد ثبات هاي سنيم و سپس از

e ve Number to SMOV AX , 2MOV DS , A

قال را مشخص

CL

otal] غير مجاز

ruction( ده

كدر روي هيچحافظه به ح

را وار عدديزمومي ذخيره كن

Segment Regis2540 AX

كنيد و نوع انتق

; XCHG EA MOV EC MOV ED MOV EA

ت انتقال داد

MOVستور

M وECHX براز مستقيما ناز مستقيما ن

ثبات هاي عمو

ster

مجددا بررسي XCHGستور

AX , EDX CX , EDX DX , EAX AX , ECX

دستورات –

دس

دستورOV

نمي توان نمي توان

در يكي از .كنيد

را 8مثالدس

4-4

9مثال :

10مثال :

Page 28: Assembly

  

 

S

IN D

د .

A

S

C

Simple Arith INC , DE ADD SUB , CM

NC DESTINDEC DESTIN

مي گيردت صورت

ADD DESTIN

SUB DESTIN

CMP DESTIN

Simpl ( :

hmetic instrEC

MP

ATION , SONATION , SO

ش از حافظه عمليات ت .

NATION , SO

AD AD

ADD ADD

NATION , SO

ADDADD

NATION , SO

le Arithmeti

ructions

OURCE ; DesOURCE ; De

روي آن بخششند ،ر حال پردازش است

OURCE ; De

D AX , DDD BL , D [COUNT]D VALUE ,

OURCE ; De

D AX , DXD BL ,

OURCE ; Co

 28

ic Instructio

stination = stination =

،WORD و ... باشد واحد از حافظه در

INC EBX DEC DL INC [COU DEC [VALU DEC [ESI]

DEC WORD DEC BYTE

estination =

DX CH ] , DX 10H

estination =

X CH

ompare Sour

ons( ساده

INC Destination Destination

BYTEنكه از نوع

مشخص شود چند

UNT] UE] غير مجاز ; [D [ESI] [ESI]

Destination

;

SUB Destination

;

rce & Dest رد دارد .

.

ت محاسباتي

C , DECستور

+ 1 n - 1

VALU بسته به ايناره مي كنيد ، بايد

ADDستورn + SOURCE

; INC EBX ADD EBX ,

CMP , ستور

n – SOURCE

DEC EBX SUB EBX , 1

ination ت شرطي كاربر ها تاثير ندارد .

توراتدس –

دس

COUNT ،Eتغير

هرگاه به حافظه اشا

دس E

1

دس E

در دستورات در عملوند

4-5

10مثال :

مت ه

Page 29: Assembly

  

  

29

نتيجه درFlag ها ( مانند ZF. تاثير دارد (

دستورCMP اگر مقصد حافظه باشد ، نسبت بهSUB يك ،clock زيرا نتيجه را در حافظه دخيره كمتر نياز دارد نمي كند .

: ) Loop , Branch ( بعضي از دستورات – 4-6

Unconditional Jump JMP LABLE ; LABLE پرش غير شرطي به آدرس دستور

11مثال :

MOV EAX , 1 Inc_again :

INC EAX JMP Inc_again

Conditional Jump J<condition> LABLE ; پرش كند LABLE ت برقراري شرط بهدر صور

;تغيير مي كند LABLEبه IP آدرس

12مثال :

Read_char : MOV DL , 0 ; ************************* Code for reading a character into AL ; ************************* CMP AL , 0DH ; JE CR_received ; INC CL ; JMP Read_char ; CR_received : MOV DL , AL

از دستورات شرطي بعضي

JE ; Jump if Equal JGE ; Jump if Greater than or Equal JG ; Jump if Greater JLE ; Jump if Less than or Equal

JL ; Jump if Less JNE ; Jump not Equal JC ; Jump if Carry JNC ; Jump if not Carry

Iteration Instruction MOV CL , 50 Repeat1 : < Loop Body > Dec CL JNZ Repeat1 ; jumps back to repeat1 if CL is not 0

دستورات زير است :معادل اتاين دستور MOV EAX , 50

(ZF=0)

مقايسه enterكاركتر دريافتي را با كد اسكي است ، به enterكن . اگر كاركتر دريافتي

برو در غير اين صورت CR_receivedآدرس دستور بعدي را اجرا كن .

از آنجايي كه دستورCMP نتيجهرا ذخيره نمي كند چگونه مساوي يا عدم مساوي را به خاطر

مي سپارد ؟

Page 30: Assembly

  

 

قرار

ر مي ط در

L

ي مورد استفاده

وند مقصد تاثيرو فقط ي گذارد

نياز دارد .

S

Logical Instr AND De OR De XOR De NOT De

ت پرش شرطي

دستور بر عملومقصد تاثير نمي

TEST D

راي اجرا شدن

Shift Instruc SHL De SHR De

ruction estination , estination , stination ,

estination لذا در دستورات

است كه اين دكه در عملوند م

Destination

clock كمتر بر

ction estination ,estination

د

Re

Source Source Source

ير مي گذارد ،

Bit Sk

كردن ) اين ااستفاده كرد ك

, Source

ظه باشد ، يك

, Count ; S, Count ; S

رود .

تاثير دار ZFدر

 30

epeat1 : < Loop Body Dec CL JNZ Repe

تاثي Flag هاي

AND AL , JE Bit_i < code to JMP Skip1 t_is_zero :

< code tokip1 :

< rest of

testستورات

testز دستور

گر مقصد حافظ

Shift Left Shift Right

CF از بين مي

> eat1 ; jumps

بعضي از بيت

01H is_zero o be executed

o be executed w

code >

and در دس )تور مي توان از

نيز اگ testتور

sh مقدار قبلي

back to repea

ات منطقي بر

when the bit is

when the bit is

شكالت دستور جاي اين دست مي گذارد .

، دست cmpتور

hrو shlستور

at1 if CL is not

اين دستورامي گيرد .

s not zero >

s zero >

يكي از مشرد . بهگذا

flag تاثير

همانند دست

با اجراي دس

0

13مثال :

Page 31: Assembly

  

 

تفاده است shiftراي

R

R

را بر count يا

if desti if desti

Rotate Instr Rotate w Rotate w

ي شود .

Rotate With ROL De ROR De

low_ درcl و

nation is 16nation is 8

bit_ skip

ruction with Carry without Carrرج شده گم مي

out Carry Inestination ,estination ,

SHL d SHR

w_orderبيت

6 bit 4 l bit 3 l

SHR A JNC bit_ <code JMP Skis_zero: <code 1: <rest o

ry ت كه بيت خار

nstructions, Count ; R, Count ; R

 31

destination , destination

sباشد ، فقط

بيتي باشد ) 3low_order bow_order b

AL , 1 _is_zero to be execuip1

to be execu

of the code>

shi در اين استR

Rotate Left Rotate Right

, count , cl

c بيشتر ب 31ازdestinat ،32

bit of cl or cbit of cl or c

uted when t

uted when t

>

ftب دستورات

Rotateتورات

t

cl و ياcount

tion( البته اگر

count are ccount are co

the bit is on

the bit is ze

يكي از معايبراه حل : دست

اگر مقدارl

مي كند . (onsider onsider

ne>

ero>

14مثال :

Page 32: Assembly

  

 

R

م .

D

Rotate throu RCL De RCR De

.

دهيم shiftت

Defining Con

EQU %ASSIGN %DEFINE

ugh Carry Inestination ,estination ,

تفاده مي كنند

ت به سمت راستSHR EDX RCR EAX

nstants هد .

N E

NUM

زيابي شود .

NUM_ NUM_

NUM_O

nstructions, Source ; , Source ;

وان ورودي است

ED را يك بيت , 1 ,

ت به ما مي ده

ته مي شود .

M_OF_STUD

ان اسمبل ، ارز_OF_ROWS _OF_ROWS OF_ROW EQ

 32

Rotate thro Rotate thro

به عنو cfكه از

DX : EAXتي

هت تعريف ثابت

وف بزرگ نوشت

DENTS EQU

باشد كه در زما EQU 50 EQU 10 QU NUM_O

ough carry lough carry

وراتي هستند كMult

بيت 64يك رقم

هاي مختلفي جه

ي ثابت با حرو

U 90

ك عبارت نيز ب OF_ROWS*

left right

تور ، تنها دستوtiword Shift

م يم مي خواهي

Directive ها

ت كه متغير ها

EQ مي تواند يك *NUM_OF_C

اين دو دست : كاربردt

فرض كنيم

NASM ،

مرسوم است

عملوندQU

COLS

Page 33: Assembly

  

  

33

Macros ماكرو ها اميم .به مجموعه اي از دستورات ( شامل كد و داده و ... ) كه با يك نام مشخص شود ماكرو مي ن

. زماني كه اسمبلر اين نام را ديرتر در برنامه مشاهده كند ، بلوك دستورات مربوط به آن نام اجرا خواهد شد

% MACRO macro_name Para_count

< macro body >

% END MACRO

ماكرو بدون پارامتر : 15مثال

% Macro multEAX_by_16 SAL EAX , 4 % End Macro MOV EAX , 27

multEAX_by_16 ماكرو با پارامتر 16مثال :

% Macro mult_by_16 SAL %1 , 4 % End Macro

mult_by_16 DL ; or mult_by_16 Count

انتقال داده از حافظه به حافظه با ماكرو: 17مثال

% Macro mxchg 2 ECHG EAX , %1 ECHG EAX , %2 \ ECHG EAX , %3

mxchg % End ; ************************* mxchg Value1 , Value 2

; *************************

Sal EAX , 4 ،EAX بيت 4را به اندازه به سمت چپ شيفت مي دهد .

16=24

16اين ماكرو يك پارامتر دريافت و آن را در ضرب مي كند .

و Byte ،Wordاين پارامتر مي تواند يك باشد كه در يك Double Wordيا حتي

ريجيستر و يا حافظه قرار دارد .

16اين ماكرو يك پارامتر دريافت و آن را در ضرب مي كند .

و Byte ،Wordاين پارامتر مي تواند يك باشد كه در يك Double Wordيا حتي

ريجيستر و يا حافظه قرار دارد .

Page 34: Assembly

  

  

34

:ساختار برنامه اسمبلي – 5-1

Program Data Segment 1 Data Segment 2 Code Segment

Procedures Procedures …

Stack Segment ساختار برنامه اسمبلي باAssembler Directive . ها شكل مي گيرد

Assembler Directive ها درAssembler . هاي مختلف متفاوت است

Assemblers TASM ( Turbo Assembler ) MASM ( Microsoft Assembler ) NASM ( Netwide Assembler )

Open Source Case Sensitive Windows or Linux

Page 35: Assembly

  

  

35

ساختار برنامه اسمبلي در 18مثال :MASM

TITLE ‘SAMPLE’ STACKSG SEGMENT STACK ‘STACK’ DW 32H DUP (0) ; اختصاص فضاي مورد نياز پشته STACKSG ENDS DATASG SEGMENT DATA ‘DATA’ متغير ها و ثابت هاي برنامه اينجا تعريف مي شوند ; DATASG ENDS CODESG SEGMENT CODE ‘CODE’ ASSUME SS: STACKSG , DS: DATASG , CS: CODESG MAIN PROC FAR ; INITIALIZING MOV AX , DATASG MOV DS , AX ; دستورات برنامه ; ; ; FINALIZING MOV AX , 4C00H INT 21 H ; MAIN ENDP CODESG ENDS END MAIN

روال هايFAR از برنامه هاي ديگر نيز قابل صدا زدن مي باشد اما روالNEAR فقط در همان برنامه قابلرا بگذاريد . END lableاستفاده كنيد بايد در انتهاي برنامه FARاست . توجه كنيد در صورتي كه از روال استفاده

همانند خط آخر برنامه باال .

MOV AX , 4C00H وINT 21 H . براي بازگرداندن كنترل برنامه به سيستم عامل است

دقت كنيد اكثر دستورات ساختار اسمبلي ، كد ماشين ندارند و فقطAssembly Directive .هستند

از آنجايي كه ممكن است بيش از يك سگمنت داده در برنامه اسمبلي وجود داشته باشد ، با دستوراتMOV AX , DATASG وMOV DS , AX مقدارDS را مي توان در هر لحظه در برنامه تعيين كرد كه به

منت داده مورد نظر اشاره كند .سگ

Page 36: Assembly

  

  

36

ساختار ساده شده برنامه اسمبلي در 19مثال :MASM

TITLE ‘SAMPLE’ .MODEL SMALL .STACK 64 .DATA متغير ها و ثابت هاي برنامه اينجا تعريف مي شوند ; .CODE MAIN PROC FAR ; INITIALIZING MOV AX , @DATA MOV DS , AX ; دستورات برنامه ; ; ; FINALIZING MOV AX , 4C00H INT 21 H ; MAIN ENDP CODESG ENDS END MAIN

اتبراي اشاره به سگمنت داده از دستور MOV AX , @DATA وMOV DS , AX . استفاده مي كنيم

برنامه اسمبلي در : ساختار ساده شده 19مثالNASM

.DATA ; Initialized Data .UDATA ; Uninitialized Data .CODE .STARTUP ; دستورات برنامه ; ; .EXIT ; باز گرداندن كنترل به سيستم عامل

Page 37: Assembly

  

 

با نام

MAS

بسته

پس برنامه را ب

SM تا برنامه

ب LINK برنامه

Notep و سپس (

را فشار دهيد

فشار دهيد تا

++ padشنهاد

Enterبار 2

را Enterبار

را نماييد .زير مي باشد .

( پيشيپ كنيد

برنامه و سپس

2مه و سپس

اشد .

 37

اسمبلي را اجرمبلي به شرح ز

ايشگر متن تاي

نام ب asm.يد

.obj نام برنام

نامه شما مي با

:سمبلي

بلي بايد برنامهجراي برنامه اسم

را در يك ويراذخيره كنيد .

رده و تايپ كني

و تايپ كنيد

تيجه نهايي برن

مه ها در استن برنامه اسمبرد نياز براي اج

يد برنامه خودasm.ا پسوند

MAS ررا باز ك.

LI را باز كرده

نام برنامه ، نت .

وند برنامپي – بعد از نوشت مراحل مور

در ابتدا بايددلخواه و با

برنامهSM

بسته شود برنامهNK

شود .

فايلEXE

5-2–

Page 38: Assembly

  

  

38

:وظايف اسمبلر –5-3

تبديل كد اسمبلي به كد ماشين و ايجاد فايلObject ).obj ( مرور اول

را مشخص مي كند.تعداد بايت هاي هر دستور

جدولsymbolic شامل برچسب دستورات و متغير ها و آدرس آنها را ايجاد مي كند

مرور دوم

با استفاده از جدولsymbolic . ترجمه برنامه را كامل مي كند ،

بررسي اشتباهات احتمالي در برنامه اسمبلي و اعالم آن به برنامه نويس كد اسمبلي غير معتبر

MOVE . استفاده از برچسب دستوري كه قبال تعريف نشده است

LOOP PROC1 اماPROC1 . قبال تعريف نشده است

ايجاد فايلlist ( خط سوم تصوير قبل ) ( اختياري ) براي كمك به برنامه نويس اصل برنامه

كد زبان ماشين برنامه

OFFSET هر دستور برنامه

:وظايف پيوند دهنده –5-4

برنامه اي است كه يك يا چند برنامهObject file را دريافت مي كند و كد.exe آن را ايجاد مياست كه آدرس واقعي ( فيزيكي ) دستورات در حافظه را مشخص مي Linkerنمايد. در حقيقت اين

كند .

خروجي اسمبلي آدرسoffset دستورات است و آدرس فيزيكي دستورات بعد ازlink كردنobject file ها ايجاد مي شود

برنامه اصلي -: نمونه خروجي 20مثال

اسمبلرمرور اول -

مرور دوم اسمبلر -

فايل ليست -

0100 JMP MAIN 0103 DATA1 DB 35H 0104 DATA2 DB 32H 0105 DATA3 DB ? 0106 MAIN PROC NEAR 0106 MOV BL , DATA1 010A SUB BL , 30H

( تعيين تعداد بايت ) رخروجي مرور اول اسمبل

Page 39: Assembly

  

 

010001030104010501060106010A

24 25

SYMBOL N

DATA1

DATA2

DATA3

MAIN

د دستور

0 EB 04 3 35 4 32 5 ?? 6 6 8A 1E 0A 80 EB

0008 02 06 000C A2 00

ول سمبل ها )

NAME

1

2

3

رسمبل

كد

90 JM DA DA DA MA0103 M30 SU

يست

0001 R ADD 002 R MOV

 39

ول اسمبلر ( جد

TYPE

BYTE

BYTE

BYTE

BYTE

اس دومي مرور

MP MAIN ATA1 DB 3ATA2 DB 3ATA3 DB AIN PROC OV BL , UB BL ,

اي از خروجي لي

AL , DATAY ; AV DATAZ , AL ;

خروجي مرور او

CO

CO

CO

CO

خروجي

35H 32H ? NEAR DATA1 30H

نمونه ا

ADD 25 to it ; MOV AL to DA

خ

VALUE

ODESG:0103

ODESG:0104

ODESG:0105

ODESG:0106

ATA2

Page 40: Assembly

  

 

ر اين

S ، (

ضاي

تداي

يافت

ن مؤلفه كه در

Stack Point

به خارج از فض

در ابت SP . لذا

stack ov دري

ست .

معني كه آخرين

SP )terستر

مي باشند )SPتداي كار

فته شده است

verflowخطاي

s دخيره شده ا

بدين م كند .

همچنين رجيس

بايت مجاز نمر است . در ابت

STA STA

st در نظر گرف

آن بخوانيد ، خ

stackي كه در

) استفاده مي ود .

اره مي كند .

شته هستند . (با آدرس كمتر

كند .

ACKSG SEG DW

ACKSG SEGtackي حافظه

، چيزي را از آ

آخرين داده اي

 40

: پشته )

Da ) ، (LIFOن خارج مي شو

:هاي پنتيوم

اشا Stackظه

خيره شدن در پشتر به حافظه بست اشاره مي

MENT STA 32H DUP (MENT END

بايت براي 100

ي آن بخواهيد

كند. يعني مي

ه ( حافظه پ

ata Structu است كه از آن

پروسسور ها

ه ابتداي حافظ ست .

Do مجاز به ذخ با آدرس بيشت

s تعريف شده ا

ACK ‘STAC( 0 ) DS

) ) يا 3 × 16.

دون مقدار دهي

stack اشاره

stac يا پشته

ureختار داده (ولين مؤلفه اي

در stackزي

Stack S به (حافظه پشته اس

ouble Wordsta از حافظه

stackسگمنت

K’

)50 =2 ) +6ي كنداشاره م

، بد stackكار

باالترين مؤلفه

ckتعريف –

queue از ساخر مي گيريد ، او

پياده ساز –

S )egmentرس در داخل ح

و Wordفقط ackجهت رشد

stack كه در س

كلمه ( 50ل ، SS : 100س

گر در ابتداي ك مي كنيد .

SP همواره به ب

6-1 –

بر خالفeحافظه قرار

6-2 –

رجيسترSoffset آد

ف ج

k: 21مثال

در اين مثالكار به آدرس

اگم P

Page 41: Assembly

  

  

41

اگر مقدار ESP=0 شود ، بدين معني است كهstack پر شده است و در صورت قرار دادن مؤلفه جديد رويstack ) SS = SPدريافت مي كنيد . ( stack overflowپيغام

همانند حافظه معمول ، وقتي مؤلفه اي رويstack ذخيره مي كنيد ، بايت پر ارزش تر در خانه حافظه بيشتر ذخيره صفحه قبل ) c( شكل مي شود .

6-3 – عمليات پشته :

Stack Instructions PUSH Source POP Destination

Source وDestination بايد از نوعWord و ياDouble Word .باشند

Source به اندازه بيتي و يا بخشي از حافظه 32يا 16واند عملوند مستقيم ، رجيستر هاي مي ت )Word و ياDouble Word ( .باشد

Destination به اندازه بيتي و يا بخشي از حافظه 32يا 16مي تواند رجيستر )Word و ياDouble Word ( باشد.

خانه حافظه ( بايت ) كم مي SP ،2ز مقدار رجيستر ا

شود و سپس مقدار دهي مي شود . ESP = ESP − 2

SS:ESP = source16push source16

حافظه ( بايت ) كم مي خانه SP ،4از مقدار رجيستر شود و سپس مقدار دهي مي شود .

ESP = ESP − 4 SS:ESP = source32

push source32 مقدار داخل پشته در مقصد قرار مي گيرد و به مقدار

خانه حافظه ( بايت ) اضافه مي شود SP ،2رجيستر dest16 = SS:ESP ESP = ESP + 2

pop dest16 مقدار داخل پشته در مقصد قرار مي گيرد و به مقدار

خانه حافظه ( بايت ) اضافه مي شود SP ،4رجيستر dest32 = SS:ESP ESP = ESP + 4

pop dest32 همچنين مي توان ازstack جهت ذخيره وrestore كردن رجيسترflag . بهره برد

Stack Operations On Flag PUSHFD ( push 32 bit flags ) ( double word ) POPFD ( pop 32 bit flags ) ( double word ) PUSHFW ( push 16 bit flags ) ( word ) POPFW ( pop 16 bit flags ) ( word ) PUSHF ( push 16 or 32 bit flags ) POPF ( pop 16 or 32 bit flags )

Page 42: Assembly

  

  

42

رجيستر عمومي را موقتا در 8همچنين مي توانstack ذخيره و سپسrestore . نمود Stack Operations On All General-Purpose Registers

PUSHAD POPAD PUSHAW POPAW PUSHA POPA

: stackكاربرد هاي – 6-4

كاربرد هايstack ذخيره موقتي داده

انتقال كنترل برنامه

انتقال پارامتر در صدا زدنprocedure

ذخيره موقتي داده هدف : جابه جايي دو مقدار در دو آدرس حافظه

MOV EAX , VALUE 1 MOV EBX , VALUE 2 MOV VALUE1 , EBX MOV VALUE2 , EAX PUSH EAX PUSH EBX MOV EAX , VALUE 1 MOV EBX , VALUE 2 MOV VALUE1 , EBX MOV VALUE2 , EAX POP EBX POP EAX PUSH VALUE 1 PUSH VALUE 2 POP VALUE 2 POP VALUE 1

نكته جالب در اين است كه بر خالف دستورmov كه مجاز نيستيد ، از حافظه به حافظه داده اي را جا به جا كنيد ، درstack اين عمل مجاز مي باشد . ( همانند دستوراتstring كه بعدا ياد مي گيريم (

pushad به ترتيب رجيستر هايEAX ،ECX ، EDX ،EBC ،ESP ،EBP ،ESI وEDI را درstack قرار مي

ذخيره stackآخرين مؤلفه اي است كه در EDIدهد . ( مي شود )

popad همه رجيستر ها را ( غير ازESP (restore مي نمايد .

اشكال برنامه : مقادير قبلي رجيستر از بين مي رود 4استفاده از حافظه :

2استفاده از رجيستر :

8استفاده از حافظه : 2استفاده از رجيستر :

4استفاده از حافظه : استفاده از رجيستر : ( از رجيستر استفاده نمي كند )

Page 43: Assembly

  

  

43

انتقال كنترل برنامه در صدا زدن procedure

زماني كهprocedure اي را صدا مي زنيد ، آدرس برگشت درstack ذخيره مي شود تا كنترل دوباره به مكان قبلي برنامه به پايان مي رسد ) procedureبازگردد . ( وقتي اجراي

انتقال پارامتر در صدا زدن procedure

يكي از ديگر كاربردهايstack انتقال مقادير بهprocedure ست .ا

MOV EBX , VALUE 2 MOV VALUE1 , EBX MOV VALUE2 , EAX PUSH EAX PUSH EBX MOV EAX , VALUE 1 MOV EBX , VALUE 2 MOV VALUE1 , EBX MOV VALUE2 , EAX POP EBX POP EAX PUSH VALUE 1 PUSH VALUE 2 POP VALUE 2 POP VALUE 1

نكته جالب در اين است كه بر خالف دستورmov كه مجاز نيستيد ، از حافظه به حافظه داده اي را جا به جا كنيد ، درstack اين عمل مجاز مي باشد . ( همانند دستوراتstring كه بعدا ياد مي گيريم (

 

 

 

 

 

 

 

 

 

 

 

 

8استفاده از حافظه : 2استفاده از رجيستر :

4استفاده از حافظه : استفاده از رجيستر : ( از رجيستر استفاده نمي كند )

اشكال برنامه : مقادير قبلي رجيستر از بين مي رود 4استفاده از حافظه :

2استفاده از رجيستر :

Page 44: Assembly

  

  

44

 

6-5 – Procedures :

برنامه ها ، كد هاي مستقلي هستند كه براي انجام كار خاص طراحي شده اند و نقش بسيار مهمي در زيرModular Programing دارند .

زير برنامه ها Procedures

. صفر يا بيشتر مقدار به برنامه صدا زننده بر مي گرداند

Functions . يك مقدار را به برنامه صدا زننده بر مي گرداند

: 22مثال

INT SUM (INT X , INT Y ) { RETURN ( X + Y ) ; } TOTAL = SUM ( NUM1 , NUM2 );

انواع روش هاي انتقال مقادير بهprocedure Call_By_Value

مقادير مستقيما بهprocedure 22انتقال داده مي شود . ( مثال (

Call_By_Refrence آدرس بخشي از حافظه كه مقادير در آنجا قرار دارد ، بهprocedure . داده مي شودprocedure مي

) 23تواند با تغيير محتويات همين آدرس ها ( خروجي ها ) را به برنامه صدا زننده برمي گرداند . ( مثال

: 23مثال

VOID SWAP (INT *A , INT *B ) { INT TEMP ; TEMP = *A ; *A = * B ; *B = TEMP ; } SWAP ( & DATA1 , & DATA2 );

معموال اگر بيش از يك مقدار بايد به برنامه صدا زننده برگردانده شود ، از روشCall_By_Refrence استفاده مي شود .

X وY پارامتر = NUM1 ،NUM2 مقادير يا =argument

X وY پارامتر = NUM1 ،NUM2 مقادير يا =argument

Page 45: Assembly

  

  

45

تورات رويه هادس CALL PROC نام RET ; return

زننده بر مي گردد ؟ به برنامه صداچگونه كنترل برنامه به برنامه صدا شونده منتقل مي شود و پس از اجراي برنامه دوباره

انتقال كنترل برنامه

دستورCALL وقتي دستوري با دستور ، نامproc Call اجرا شود ، ابتدا بهEIP . يكي اضافه مي شود

EIP = EIP + 1

به دستور بعدي اشاره مي كند . EIPبا اين كار سپس مقدارEIP درstack . ذخيره مي شود

بهEIP اضافه مي شود . برنامه صدا شوندهبا ابتداي فاصله نسبي دستور فعلي عالمتدارمقدار offset machine code

(in hex) (in hex) MAIN: . . . 00000002 E81600000 CALL SUM 00000007 89C3 MOV EBX , EAX . . . ; end of main procedure ;******************************************************************* SUM: 0000001D 55 PUSH EBP . . . ; end of sum procedure ;******************************************************************* AVG: . . . 00000028 E8F0FFFFFF CALL SUM 0000002D 89D8 MOV EAX , EBX . . . ; end of avg procedure ;*******************************************************************

. مقدار فاصله نسبي عالمت دار است ، پس مي تواند مثبت باشد و يا منفي 0000001DH

- 00000002H 16H

16 BYTE (IN HEX)

Page 46: Assembly

  

  

46

ESP = ESP – 4 ; در پشته دو خانه آزاد مي شود SS : ESP = EIP ; آدرس بعد از فراخواني رويه در پشته ذخيره مي شود

EIP = EIP + Relative displacement ; اشاره گر به ابتداي دستورات رويه مورد نظر اشاره كند

دستورRET

پس از پايان اجرايprocedure و استفاده از دستورret . كنترل مجددا به برنامه صدا زننده باز مي گردد ،

EIP = SS : ESP ; آدرس ذخيره شده در پشته در رجيستر اشاره گر ريخته مي شود ESP = ESP + 4 ; مجددا اشاره گر پشته به حالت اول باز مي گردد ( مرحله پاك سازي پشته )

پس از پايان اجراي دستوراتprocedure بايد دستورret . قرار بگيرد

Page 47: Assembly

  

  

47

امتر ( مقادير ) به انتقال پارProcedure از طريق Stack

يكي ديگر از كاربرد هايStack انتقال مقادير به پارامتر هايProcedure . است

در زبان اسمبلي ، برنامه صدا زننده ، بايد مقادير را در مكان هايي كه برنامه صدا شونده نياز دارد قرار دهد وو يا حتي ( call_by_value )سپس برنامه صدا شونده را صدا زد . مكان اين مقادير ممكن است رجيستر

باشد . ( call_by_reference ) پشته و يا حافظه

دارد : در روش رجيستر ها دو مشكل وجود

تعداد رجيستر ها محدود است-1

ذخيره كنيم . stackامكان دارد كه رجيستر آزاد نداشته باشيم كه در اين صورت بايد ابتدا آن را در -2

call_by_value: 24مثال .CODE .STARTUP MOV AX , 05 MOV BX , 06 CALL SUM SUM : ADD BX , AX RET

و از طريق حافظه call_by_reference: 25مثال .DATA VALUE 1 DB ? VALUE 2 DB ? .CODE .STARTUP MOV VALUE 1 , 05 MOV VALUE 2 , 06 CALL SUM SUM : MOV AX , VALUE 1 MOV BX , VALUE 2 ADD BX , AX MOV VALUE 2 , AX RET

Page 48: Assembly

  

  

48

و از طريق پشته call_by_reference: 26مثال

.DATA VALUE 1 DW ? VALUE 2 DW ? .CODE .STARTUP MOV VALUE 1 , 05 MOV VALUE 2 , 06 PUSH VALUE 1 PUSH VALUE 2 CALL SUM CALL SUM PUSH EIP عنصر بااليي پشته SUM : POP ECX ; MOV CX , EIP POP BX ; MOV BX , VALUE 2 POP AX ; MOV CX , VALUE 1 PUSH ECX ; PUSH EIP ADD BX , AX RET

استفاده شده است . اين در حالي است كه ممكن است برنامه اصلي مقادير در هر دو مثال قبل از رجيستر ها در رويه باشد .معتبر در آنها قرار داده

: قرار دادن مقادير رجيستر ها در پشته قبل از صدا زدن رويه 1راه حل كپي كردن آنها در رجيستر ها بدون: استفاده از مقادير پشته 2راه حل

چه رجيستر هايي بايد درstack قرار گيرد ؟

در رويه نيز تغيير داده مي شود . پاسخ : رجيستر هايي كه در برنامه اصلي استفاده مي شود و

) بهتر است در برنامه اصليcalling procedure ) رجيستر ها را ذخيره نمايد يا رويه ، (called procedure ( ؟

در رويه زيرا در غير اين صورت بايد با هر بار تغيير رويه در برنامه اصلي مجددا رجيستر هاي جديدي را در پشته پاسخ : ذخيره كنيد .

چه ايرادي دارد اگر با دستورpusha ؟ در رويه همه رجيستر ها را قبل از دستورات رويه ذخيره كنيد

پاسخ : ) clock 5اجراي دستور فوق زمان بر است . ( -1روجي ها توسط رجيستر ها برگردانده مي شود . از طرفي در انتهاي رويه ها ، بايد معموال در انتهاي رويه ها ، خ -2

مقادير رويه از پشته به رجيستر بازگردد كه دو مورد فوق با هم مغايرت دارند . پس بهتر است فقط رجيستر هاي ضروري در پشته ذخيره شود .

Page 49: Assembly

  

 

pr را

را در

rocedureس

تغيير نمايد . MOV ،EBP

مي شود .

مي كند ، سپسشاره مي كند .

SPEكن است

V EBP,ESPر

MOV EBP , E MOV AX , [ MOV BX , [ ADD AX , B

stack گفته م

pro :

stack ذخيرهاش stackالي

.DATA NUMBER NUMBER .CODE .STARTUP MOV NU MOV NU PUSH NU PUSH NU CALL SU

SUM : … RET

كنيد زيرا ممكت قبل از دستور

ESP [ EBP + 10 ] [ EBP + 8 ] BX

procedur

frameشوند ،

ocedureسط

p مقادير را درk

به باال SPيستر

R 1 DW ? R 2 DW ?

UMBER 1, 05 UMBER 2, 06 UMBER 1 UMBER 2

UM

proce استفادهنند . بهتر است

reت استفاده از

st ذخيره مي ش

 49

توس stack درprocedureن

و رجي stackي

CALL

sta درedure

استفاده مي كن

جهت stackدر

proc درtack

ذخيره شدهل از صدا زدن

به ابتداي SSر

L SUM PUS

ackاده مقادير

pr ها ازEBP

ر ذخيره شده دreturn addr

cedure اصلي

ده از مقاديررنامه اصلي قبلي زند ، رجيستر

SH EIP ي پشته

EB جهت استفاrocedureهمه

نيد .

مقادير -1موعه 2- ress

3- EBP

ل از اجراي كد

ريقه استفاد

وقتي برصدا مي

صر باالييعن

BPاز مي توانيد

ز آنجايي كه هstack حفظ كن

به مجم كه قبل

طر

م از

k

Page 50: Assembly

  

 

        

 MAIN : ... ; push p CALL PR PROCEDURE: PUSH E MOV E

; save r … ; pop re

MOV POP RET NUM

RET

parameters ROCEDURE

EBP EBP , ESP ;

registers

egisters

ESP , EBP EBP M ; NUM = شته

:

PROCEFURE … RET N EIP = SS : ES ESP=ESP + 4

ENTER

; LEAخيره شده در پش

.DATA VALUE 1 VALUE 2 .CODE .STARTUP MOV VA MOV VA PUSH VA PUSH VA CALL SW

SWAP : ENTER ( PUSH EB MOV E XCHG EB MOV [ POP EB LEAVE RET 4

procedure : :

NUM ( INTEGESP 4 + NUM

R (0,0)

AVE ذخي هاي مقادير

DW ? 2 DW ?

LUE 1 , 05 LUE 2 , 06 ALUE 1 ALUE 2

WAP

(0,0) ; BX ; BX , [ EBP +BX , [ EBP +EBP + 10 ] , EBX

; value 1 , val

 50

قبل از ترك

ER )

تعداد بايت

call_by_ref

CALL

+ 10 ] ; value 2+ 8 ] ; value 1 EBX

ue 2

Stack Cle( ق

ference با روش

SWAP PUS

2

stac )eanup

دو مقدار در حافظه

SH EIP ي پشته

EB ESEBEBEB

ckميز كردن

كردن د swapامه

عنصر بااليي

STACK BP - 2 SP, EBP

BP + 4V BP + 8V BP + 10

SS

تم

: برنا 27مثال

EBX EBPEIP

VALUE1VALUE2

Page 51: Assembly

  

 

proc

صلي ca در

cedure آنكه

توسط برنامه اصallرست بعد از

گيرد ، قبل از ر دارد .

ت stackكردن ن عمل بايد در

جمع مي كند .

sta قرار مي گقرار stackدر

لذا عمل تميزكتفاده نمود . اين

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

.CODE .STARTUP SUB EC READ_NUMBقرار بده ; CMP EA JE STOP PUSH EA INC ECX

JMP REA STOP_READ PUSH EC

CALL VA

; STACK

INC ECX

ADD ECX ADD ECX ADD ESP

pr :

ckست كه در

EIPت قبل از

pa . مي شوداست stackدن

رد كند ، رويه اي اي

CX , ECX BER : خوان و درEAX ق

AX , 0 P_READING AX خوانده شده ; AD_NUMBER DING : CX ; ARIALBE_SUM

K تميز كردن ; ; incre

X , ECX ; ECX X , ECX P , ECX ; UPD

 51

rocedureك

رين مقداري اساد پارامتر درست

proced ،ass

r براي تميز كر

ربر عدد صفر را وار

ي را از كاربر بخ

تعداد مقادير خ

ي شود

ement ECX to i

= ECX × 4 ( S

DATE ESP TO C

متغير به يك پارامتر ها آخربارت ديگر تعدا

dureغيري به

retن از دستور

اند تا زماني كه كار

مقداري

pass pr داده مي

CALL VAR

nclude count هSPACE IN BYT

CLEAR STACK

پارامتر عداد صورت تعدادده شود . به عب

عداد مقادير متغنرد و نمي تواورت بگيرد .

از كاربري مي خوا

rocedure كه به تRIALBE_SUM

م بايد پاك بشهTE )

pas كردن تع در اين

فراخواند

ز آنجايي كه تعايد صورت بگيررنامه اصلي صوداد مقادير متفاوتي

ين پارامتري است PUSH EIP ه

خودشم

ss

ازبابر

: تعد 28مثال

عداد مقادير آخريصر بااليي پشته

تع عنص

Page 52: Assembly

  

  

52

VARIABLE_SUM :

ENTER (0,0) ; PUSH EBX ; SAVE EBX , ECX PUSH ECX MOV ECX , [ EBP + 8 ] ; به تعداد مقادير اشاره مي كند MOV EBX , EBP ; ADD EBX . 12 ; last parameter SUB EAX , EAX ADD_LOOP : ADD EAX , [ SS : EBX ] ; توجه شود ( نكته مهم ) ADD EBX , 4 ; بايت مي باشد 4پارامتر ها در اين مثال طول LOOP ADD_LOOP POP ECX POP EBX LEAVE ; RET ; stack clear in main

توجه كنيد :را به عنوان مبدا و نقطه صفر انتخاب مي كنيم . هر عنصري كه بعد از دستور EBPما

ENTER فراخواني شود ازEBP به مقدار حافظه اي كه اشغال مي كنند كم مي شوند . و هرپارامتري كه قبل از آن وارد پشته شده باشد به مقدار حافظه اي كه اشغال مي كنند به مبدا

اضافه مي شود زيرا پشته از انتها به ابتدا پر مي شود . :مبدا است . همواره EBPپس با توجه به اينكه

[EBP+4] محل قرار گيريEIP هست زيرا EBP 32 بايت حافظه اشغال مي كند . 4بيت يا

[EBP+8] محل قرار گيريECX ( شمار پارامتر ها ) هست زيرا EIP 32 بايت 4بيت يا حافظه اشغال مي كند .

[EBP+12] محل قرار گيري آخرين پارامتر ورودي هست زيرا ECX 32 بايت 4بيت يا حافظه اشغال مي كند .

طول پارامتر آخر هست و به Lدر پشته قرار مي گيرند كه [EBP+12+L] مابقي پارامتر ها از همين ترتيب تا انتها پشته پر مي شود تا به اولين پارامتر ورودي برسد .

خالصه مطلب گفته شده در جدول زير :

STACKECX EBP - 4 EBX EBP - 2 EBPESP, EBPEIPEBP + 4ECX EBP + 8

VALUE1EBP + 12VALUE2EBP + 16

…SS

Page 53: Assembly

  

 

ست ،

تفاده

proc فعال نيس

است stackهاي

%DE %DE MO

Fib(1) = 1 Fib(2)= 1 Fib(n)= F

ود :

cedureي كه

گذاري مكان ه

EFINE a dwoEFINE temp

OV temp , E

Fib ( n-1 ) + Fib

ENTER ( 8

PUSH EBP MOV EBP SUB ESP

ت مي دهند .شنهاد نمي شو حتي در زماني

INT { I }

%d جهت نام گ

ord [EBP+1 dword [EB

AX

b ( n-2 ) دارد .

ت ( 0 , 8P P , ESP , 8

p . معني دارندي خود را از دست

زير پيشدليل 2Stati است و

كند .

T COMPUTE

INT temp , …

defineوان از

2] BP-4]

f( را نگه مي ددل كد زير است

 53

procedureل

متغير ها معنايين متغير ها به

Data Se ،c

ند .

recu كار نمي

E (INT a , IN

N ;

وش فوق مي تو

fib مقدار ،(n)

معاد

ه فقط در داخلprocedure م ،

جهت تعريف ايgmentده در

ا اشغال مي كندp هايursive

NT b )

به رو ي محلي

b_hiو متغير

Lo :

هايي هستند كهe اتمام اجراي

Data Segm جصيص داده شدضاي حافظه را

procedureبا

ي به متغير هاي

f(n-1) مقدار

ocal Variable

متغير ه پس از

mentستفاده از

فضاي تخص-1 همچنان فض

اين روش ب-2

ه جاي دسترسي مود .

بوناچي

، fib_loمتغير

es

اس1

2

: 29مثال

بهنم

: فيبو 30مثال

م

Page 54: Assembly

  

  

54

جهت حذف كردن فضاي ذخيره سازي متغير هايlocal وrestore كردنEBP . از دستورات زير استفاده مي كنيد

LEAVE معادل با كد زير است MOV ESP , EBP POP EBP

.CODE .STARTUP EDX قرار بده ; داري را از كاربر بخوان و درمق

CALL FIBONACCI كه عدد فيبوناچي در آن قرار دارد را چاپ كن ; EAX مقداري DONE : .EXIT % DEFINE fib_lo dword [EBP-4] % DEFINE fib_hi dword [EBP-8] FIBONACCI : ENTER ( 8 , 0 ) PUSH EBX MOV fib_lo , 1 MOV fib_hi , 1 FIB_LOOP : MOV EAX , fib_hi MOV EBX , fib_lo ADD EBX , EAX MOV fib_lo , EAX MOV fib_lo , EBX CMO EBX , EDX JLE fib_loop POP EBX LEAVE RET

STACKEBX EBP - 12

fib_hi EBP - 8 fib_lo EBP - 4 EBP ESP, EBPEIP EBP + 4… SS

Page 55: Assembly

  

 

شود .

M

R

BEE M

قل مي كند

ي ناميده مي شMemory Add

Immedia Register Direct

Indirect

ر د

R B In B

Register Ind

Based RegisEffective adEffective ad

MOV AX , [منتق AXرا به #

هاي آدرس دهيdressing Mote r

ي شودر داده م

ندارد ، بلكه درقرار دارد از آنها

BRegister Based ndexed Based-Index

direct گيرد .

ster Indirectdd = [ BX +dd = [ BP +

[ BX + 46 ] registered يلد

لوند ) ، روش هodes

ملوند به دستور

در دستور قرار نو يا تركيبي ر

BX , BP , SI

xed

BX قرار ميt

Data + disp ]Stac+ disp ]

محتويات في

 55

دستورات ( عملو

يم به عنوان عم

ي آدرس داده دجيستر هاي زيرI , DI

, BP , SI , D

Segment k Segment

: ي

صيص داده به د

رس داده مستقي

ه مي شود يعني يكي از رج

DIيستر هاي

ي آدرس دهي

وش هاي تخص

مقدار آدر

م به دستور داده

ر يكي از رجيي د

روش هاي –

انواع رو

ت غير مستقيم

آدرس داده

7-1 –

س داده به صور

آدرس

Page 56: Assembly

  

 

In[[

MOV EAX

ESI = 9(

B[[

B[[[[

ndexed Reg[ DISP + SI [ DISP + DI

, [ marks_tab

(مي خوانيم .

Based_Index[ BX + SI ] [ BX + DI ]

Based_Index[ BX + SI + [ BX + DI + [ BP + SI + [ BP + DI +

gister Indire ] ]

ble + ESI * 4 ]

به روش باال مي

xed with no [ BP + SI ] [ BX + SI ]

xed with Dis DISP ] DISP ] DISP ] DISP ]

ect

]

ام را ب 9 . فيلد

Displaceme] ]

splacement

 56

بايت است 4ه

ent

. هر فيلد آرايه

از ركورد ها )

اشاره مي كند

ست ( آرايه اي

به ابتداي آرايه

اي دو بعدي اس

marks_tabبه

آن در آرايه ها

ble

كاربرد

Page 57: Assembly

  

  

57

آرايه يك بعدي

C Language INT test_marks [10] ;

) 9تا 0، محدوده ( (int)بايت ) نوع عنصر 4) ، سايز هر عنصر ( 10تعداد عناصر ( نام آرايه ،

ASSEMBLY Language test_marks resdw 10

يدو بعدآرايه

C Language INT class_marks [5][3] ;

ل روش زير آرايه دو بعدي به يك آرايه يك بعدي تبدي 2حافظه واقعي يك بعدي است و بايد به يكي از شود

Order the array elements row-by-row, starting with the first row ( C Language ) Order the array elements column-by-column, starting with the first column. ( Fortran

Language )

دانشجو 5: هدف جمع نمرات 31مثال .DATA NO_ROWS EQU 5 NO_COLUMNS EQU 3 NO_ROW_BYTES EQU NO_COLUMNS×2 class_marks DW 90 , 89 , 99 DW 79 , 66 , 70 DW 70 , 60 , 77 DW 60 , 55 , 66 DW 51 , 59 , 57 .CODE MOV ECX , NO_ROWS ; loop iteration SUB AX , AX

SUB EBX , EBX MOV ESI , NO_COLUMNS-1 ; ESI = class_marks [ 0 , 2 ]

SUM_LOOP : ADD AX , [class_marks + EBX + ESI × 2] ADD EBX , NO_ROW_BYTES LOOP SUM_LOOP

STACKclass_marks [ 0,0] class_marks [ 0,1] class_marks [ 0,2] class_marks [ 0,3] class_marks [ 0,4]

توضيح : EBX به ابتداي هر سطر اشاره مي كند ESI به ستون مورد نظر در هر سطر اشاره مي كند class_marks كندابتداي آرايه را مشخص مي

Page 58: Assembly

  

 

S

Z

Status Flags ZF , CF

A I P

ZF ( ZERO F

J J

C

SM O I E

s , OF , SF , ADD , SUB NC , DEC PUSH , POP

FLAG )

JZ ( JJNZ (

CMP CHAR ,

SUB MOV

OUTER_LOOMOV

NNER_LOOINC LOOP DEC JNZ

EXIT_LOOPSMOV

AF , PF ( affect all ( affect all

P ( affect no

Jump if ZF Jump if ZF

, ‘$’ ; ( if E

EAX , EAEDX , M

OP: ECX , M

OP: EAX INNER_LOOEDX OUTER_LOS: SUM , E

 58

: تي

status flag status flagone of statu

= 1 ) = 0 )

Equal then Z

AX M

M

OP

OOP

EAX

هاي محاسبا

gs ) s except CFus flags )

دن

ZF = 0 ) ي مشخص

; EAX store

و رجيستر ه

F )

رتبط

ست مساوي بود

مارش تا مقداريes SUM

دستورات –

دستورات مر

كاربرد

تس

شم

8-1 –

Page 59: Assembly

  

 

چند

C ي دهد .

جمع و تفريق

.

را carryخداد

CF ( CARRY

Carry رخ مي

Under Flo (

J J

b در عمليات ج(

overflo است

تاثير بگذارد . Z مي توان رخ

CI

FLAG ) رجيستر باشد ،

owن است . (

JC ( JJNC ( J

)borrowed

shift /

ت .

wمنزله رخداد

carryارد در

Fنند ، از روي

CL = 225 NC CL Z

ده حافظه و يا ر

از محدوده بود

Jump if CF Jump if CF =

carryاز فته

U

rotate /واده

overflow استoverflow به م

ت و ضرورتي ند يا كسر مي كن

ZF=0 CA

 59

خارج از محدود

به منزله خارج

= 1 ) = 0 )

) يا قرض گرف

UnderFlowو

ستورات از خانو

car به منزلهw

wبا carryدن

كرار حلقه است به عدد اضافه

ARRY

خ عالمت بي

22

65537

4294967295نتيجه منفي ، ب

propagate (

OverFlowت

عد از اجراي دس

rryمت رخداد

دار متفاوت بود

نمي گذارد ؟مارش تعداد تك

D اره يكيهمو

اعدادحاسبهداد بي عالمت

25تا 0بيتي : 7تا 0بيتي : 15تا 0بيتي : 3

يهي است كه ن رتبط

( carryشار مه اي

شخيص وضعيتست يك بيت بع

اعداد بي عالم اعداد عالمت

D درCF تاثير

DEC معموال شمDECو INCكه

اگر نتيجه مح محدوده اعد

8 16 32 بدي

دستورات مر

كاربرد

انتشكلم

تش تس

نكته

در در

DECو INC ت

Cو INCكاربرد

في از آنجايي كص داد .

چرا دستورا زيرا كا 1-از طرف 2-

تشخيص

Page 60: Assembly

  

 

خير

گر به

O

ه شده است يا

( CF=0 و اگ

OF ( OVERF

خارج از محدوده

Under Flo (MA

0 (ه شود آنگاه

J J

LOW FLAG

خ عالمت دار

owن است . (

MOV ADD

. د .

ت در نظر گرفته

JO ( JuJNO ( Ju

)

اعداد عسبات

2

از محدوده بودAL , 72HAL , 0EH

تفسير مي كندSET نمايد مي

عدد بي عالمت

ump if OF = ump if OF =

ت دار

Divide

 60

ست .

آيا نتيجه محا

3

2147483647به منزله خارجH ; 114D H ; 14D

; result

بي عالمت ؟امه بيت ها را ت

را OFو CFلبه عنوان ع 12

O (

1 ) = 0 )

عالمت در اعداد ،Multiply و

ات عالمتدار اس كه نشان دهد

128تا

32767تا - 32تا - 2147483

نتيجه منفي ، ب

1000 000t is 128D ou

ت دار است و يااند . منطق برناي كند و معادل

8شد اگر 128( OF = 1شود

د overflowتShift اجراي

CF در محاسباOF اين است

دار داد عالمت- 128بيتي : 2768بيتي : 13648بيتي : 3

يهي است كه ن

0 ≠ 128D ut of range

كه عدد عالمت) چيزي نمي دا

سير را فرض مي8كنيد . حاصل

در نظر گرفته ش

رتبط

شخيص وضعيتست بيت بعد از

OF شريك هدف اصلي.

محدوده اعد 8 16 32 بدي

( OF = 1 )

كجا مي داند كسور ( سيستم )ستور هر دو تفسل قبل توجه كت بي عالمت د

دستورات مر

كاربرد

تش تس

سيستم از ك پروسسپروسسبه مثالصورت

Page 61: Assembly

  

 

S

SF ( SIGN F

MS

J J

M F F

FLAG )

MOV SUB

S

JS ( JuJNS ( Ju

MOV

FOR_LOOP :<LOOPBDEC ECJNS

FOR_LOOP_<LOOPBCMP JL

EAX , 15EAX , 97

F=1

ump if SF = ump if SF =

ECX , M

: BODY>

CX FOR_LOOP

_WCMP : BODY> ECX , 0 FOR_LOOP

 61

(The M

5 7

00001 + 10011 01011

1 ) = 0 )

محاسباتي

COU

M

P

P_WCMP

ost Signific

1111B (81111B (8110B

س از عمليات مUNTING LOO

(cant Bitيت

8-bit signe8-bit signe

رتبط

ست عالمت پس OPاده سازي

CM

CM

مهم ترين بي

ed form ofed number

دستورات مر

كاربرد

تس پيا

MPده از دستور

MPده از دستور

f 15) r for −97)

بدون استفا

با استفاد

Page 62: Assembly

  

 

مي

ده از

ت

A AF ،SETد ،

B نياز به استفاد

Pر نتيجه عمليات

AF ( AUXILAlow_or شود

MA

BCDتي با فرم

م .

A A A A D D

PF ( PARITY شود ، حتي اگر

P

P

J J

ARY FLAG ) rderچهار بيت

MOV ADD

مليات محاسباتت آشنا مي شويمAAA ; ASCII AAS ; ASCII AAM ASCII;

ASCII AAD ; DecimDAA ; DecimDAS ;

Y FLAG ) نظر گرفته مي

PF = 1 ; اشدPF = 0 ; اشد

JP ( JumpJNP ( Ju

Enc

carry / از چ

AL , 43AL , 84

ي كند . اما عمبا اين دستورات adjust for adjust for I adjust for adjust for

mal adjust fomal adjust fo

در نظ PFكردن

زوج با 1 هايفرد با 1ت هاي

p if PF = 1 )ump if PF =

codingش هاي

 62

borrowجاد

3 MOV 4 SUB

AF را چك نميب ) BCDورات

addition subtraction

r multiplicatdivision or addition or subtracti

ك clearردن يا

تعداد بيت تعداد بيت

0 )

در انواع روش

تي منجر به ايج

AL , 43 AL , 92

jump ،F نوع

و( دست 12صل

n ion

ion

l جهتset كر

در ارسال داده

عمليات محاسبات

3 2

و كاربرد رتبطيچ دستوري از

A دارند . در فص

low_order

تي باشد .

رتبط

ك كردن خطا

اگر نتيجه ع شود.

دستورات مر هي

AF

بيت 8فقطبيت 32يا 16

دستورات مر

كاربرد

چك

Page 63: Assembly

  

  

63

:دستورات محاسباتي – 8-2

. دستورات جمع و تفريق در بخش هاي قبل ياد گرفته شده است

ضرب اتدستور . دستور ضرب از دو جهت با دستورات جمع و تفريق تفاوت دارد

1- ضرب دو عددn 2بيتي ، يكي عددn . بيتي توليد مي كند

2- در صورتي كه اعداد عالمت دار يا بي عالمت تفسير شوند ، نتيجه ضرب متفاوت است . لذا ضرب دستورات عالمتدار با ضرب دستورات بي عالمت تفاوت دارد .

1010B (4-bit unsigned form of 10) × 0100B (4-bit unsigned form of 4) 00101000B (8-bit unsigned form of 40)

1010B (4-bit signed form of -6) × 0100B (4-bit signed form of 4) 11101000B (8-bit signed form of -24)

ضرب بي عالمت

MUL SOURCE Source ( نمي تواند عدد باشد ) . مي تواند رجيستر يا حافظه باشد

MUL 10 ; invalid بيتي باشد . 32بيتي و يا 16بيتي ، 8ورودي مي تواند

AL × ( 8 BIT SOURCE ) = AH ( HIGH ORDER ) AL ( LOW ORDER )

AX × ( 16 BIT SOURCE ) = DX ( HIGH ORDER ) AX ( LOW ORDER ) EAX × ( 32 BIT SOURCE ) = EDX ( HIGH ORDER ) EAX ( LOW ORDER )

معنايcarry وoverflow در دستور ضرب

اگر نصفhigh_order نتيجه ضرب غير از صفر باشدOF و CF ،set و در غير اين صورتclear مي شوند.

در ضربset شدن دوflag وق به معناي فerror نيست بلكه به معناي اين است كهAH ،DX و ياEDX داراي بيت هاي با معني در نتيجه است.

MOV AL , 10 MOV AL , 10 MOV DL , 25 MOV DL , 26 MUL DL MUL DL < 255 OF=CF=0 >255 OF=CF=1

Page 64: Assembly

  

  

64

مت دار ضرب عال

IMUL SOURCE تفاوت اين دستور با دستور قبلي در اين است كه دوflag ،carry وoverflow در صورتيset مي شوند

د . نباش (lower half)نيمه پاييني sign extension، نتيجه (upper half)كه نيمه بااليي

Sign Extension - 66 10111110 11111111 10111110 66 01000010 00000000 01000010

درIMUL نيز همانندMUL ،set شدن همزمان دوflag به معنيdouble length شدن نتيجه است

MOV DL , OFFH ; DL = -1 MOV AL , 42H ; AL = 66 IMUL DL ( -66 ) OF & CF CLEAR MOV DL , OFFH ; DL = -1 MOV AL , 42H ; AL = -66 IMUL DL ( +66 ) OF & CF CLEAR MOV DL , OFFH ; DL = 25 MOV AL , 42H ; AL = -10 IMUL DL ( -250 ) OF & CF SET

Page 65: Assembly

  

 

DIV S IDIV S

MMD XMMD

SOURCE SOURCE

MOV MOV DIV C

XOR MOV MOV DIV C

(UNSINGED(SIGNED)

AX , 251 CL , 12 CL

DX . DX AX , 141BHCX , 012CHCX

 65

D)

H ; AX = H ; CX = 3

5147D 300D

ستورات تقس سيم دس

Page 66: Assembly

  

  

66

MOV AL , -95 CBW MOV CL , 12 DIV CL

اگر در دستورIDIV مقسوم عدد منفي باشد ، مانند مثال قبل ابتدا ،XOR DX , DX ، را انجام مي دهيم انجام بدهيم . sign extensionمثبت در نظر گرفته مي شود . لذا بايد عدد

CBW ( Convert Byte to Word ) ( sign extend AL to AH for 8 bit IDIV ) CWD ( Convert Word to Dword ) ( sign extend AX to AX for 16 bit IDIV ) CDQ ( Convert Dword to QWord ) ( sign extend EAX to EAX for 32 bit IDIV )

MOVSX DESTINATION , SOURCE ( mov sign extended source to destination ) MOVZX DESTINATION , SOURCE ( mov zero extended source to destination )

DESTINATION = REGISTER SOURCE = MEMORY OR REGISTER 32 bit or 16 bit 8 bit 32 bit 16 bit

در تقسيمoverflow يك مشكل اساسي است . در چنين شرايطي پروسسور ، فقفه نرم افزاري توليد مي كند .

دستوراتSHIFT براي ضرب و تقسيم MOV CX , 12 MUL CX ; 12 CLOCK SAL AX , 5 ; 1 CLOCK

Page 67: Assembly

  

  

67

: دستورات منطقي – 10-1

LOGICAL INSTRUCTIONS AND OR XOR TEST NOT

، ملوند نياز دارند ، غير از ع 2همه دستورات رو به روNOT.

بيتي باشد. 32بيتي و يا 16بيتي ، 8عملوند ها مي تواند

همه دستورات فوق رويstatus flag . تاثير مي گذارند

CF & OF is cleared since do not generate carry or overflow AF is undefined ZF , SF & PF are related to result of instructions

AND INSTRUCTION

اجراي منطقAND

CLEAR كردن يك يا چند بيت

جدا كردن يك يا چند بيت

OR INSTRUCTION اجراي منطقOR

SET كردن يك يا چند بيت

كاربردي : 38ثال مand وor درcut وpaste

AND AL , 55H ; CUT ODD BITS AND BL , 0AAH ; CUT EVEN BITS OR AL , BL ; PASTE THEM TOGETHER

AL = 00000000 55H = 01010101 AND AL , 55H 10101010 ( CUT ODD BITS TO AL )

BL = 00000000 0AAH = 10101010 AND BL , 0AAH 01010101 ( CUT EVEN BITS TO BL )

AL = 10101010 BL = 01010101 OR AL , BL 11111111 ( PASTE THEM TOGHTER IN AL )

Page 68: Assembly

  

 

د .

ثير نمي گذارند

XOR I

AKB

NOT I

TEST

جيستر مقصد تا

INSTRUCTIO

A KEY B

INSTRUCTIO

T INSTRUCT

فاوت كه در رج

ON

XOR

ON

TION

ي كنند با اين تف

 68

چند بيت

تر ها

B KEY

A

and عمل مي

XO

دن به يك يا چ صفر به رجيست

XOR

د

همانند cmpو

ORراي منطق

يير وضعيت دادقدار دهي اوليه

مز نگاري

رمز نگاري :

كردن عدكمل

و testستورات

اجر تغي مق رم

در xorكاربرد

مك

دس

39ثال م :

Page 69: Assembly

  

  

69

: Shiftدستورات – 10-2

SHIFT INSTRUCTIONS SHL SHR SAL ( Shift Arithmetic Left ) SAR ( Shift Arithmetic Right )

دستكاري بيت ها

2ضرب و تقسيم عدد ها به عدد هاي مبناي

OF در شيفت چند بيتي بي تغيير مي ماند ، اما در شيفت يك بيتي اگر بيت عالمت تغيير كند ، مقدار ،OF مي شود. OF ،1، صفر و در غير اين صورت مقدار

AF is undefined CF , ZF & PF are related to output of instruction

كاربرد : 39ثال مshift رمز نگاريدر

; AL contains the byte to be encrypted MOV AH , AL SHL AL , 4 ; move lower nibble to upper SHR AH , 4 ; move upper nibble to lower OR AL , AH ; paste them together

; AL has the encrypted byte چپ بيت سمت راست و 4كردن عوض

در مقصد هم ، همين كار تكرار مي شود تا داده اصلي برگردانده شود

Page 70: Assembly

  

 

( fit more th

ت زير خارج از 176 (

Arithm S S S S

an require

1

0

بي معني استوده مي شود (

metic Shift SAL DESSAL DESSAR DESSAR DES

ست .

bits. ( گيرند

010 ( -6 )

0110 ( +6 )

Sal بمحدو

InstructionTINATION TINATION

STINATION STINATION

بيت عالمت ا

دربر بگز نياز را

1101 ( -3

0011 (

 70

s , COUNT , CL , COUNT , CL

د عالمت دار

Arithme حفظ

ا ت هاي بيشتر

3 )

+3 )

اعداد 2رب درد عالمت دار

eticه صورت

ست ؟

شده اند تا بيت

Sarمت دار

و ضر 2سيم بريفت دادن اعدادف از شيفت بهت حفظ نشده اسsign extene ش

عالم 2سيم بر

تقس شي هد

s بيت عالمت ،edعالمت دار

تقس

چرا درsal

زيرا اعداد ع

Page 71: Assembly

  

 

مي باشد rotat د .

Doubl S S

Rotate R R

te راه حل آن

BT O

BITSC B B

.

e Shift InstSHLD DESHRD DE

e InstructiRotate withoRotate with گم مي شود .

OPERAND ,

CAN InstruBSF BSR D

ند .

جيستر ) باشد .

صفر باشند

tructions STINATION

ESTINATION

ons out Carry Carry شيفت داده شده

BIT POSIT

ctions DESTINATIDESTINATIOصد بر مي گردا

d حافظه يا رج )

تمام بيت ها ص

 71

N , SOURCN , SOURC

ست كه بيت ش

TION

C قرار مي گيرد

ION(REGISTON(REGISTدر رجيستر مقصdouble word

يتي باشد .

يرد زماني كه ت

E , COUNCE , COUN

shift در اين اس

:غيير آنها

CFخاب شده در

:

TER) , OPTER) , OP

عملوند را د 1dو يا wordع

بي 32يا 16يداثير قرار مي گي

NT NT

: Rotateت

tيب دستورات

يت ها و تغ

كپي بيت انتخ

BITSCANت

PERANT ;PERANT ; كان اولين بيت

ملوند بايد از نوعجيستر مقصد باي

تحت تا ZFط

دستورات –

عي

بررسي بي –

دستور 4ر هر

دستورات –

( bit scan ( bit scan r

مك عم رج فقط

10-3

10-4

د

10-5

forward ) reverse )

Page 72: Assembly

  

  

72

در اين مثال مي خواهيم نشان دهيم كه چگونه مي توان عمل ضرب را فقط با استفاده از دو دستور : 40ثال مshift وadd

انجام داد

بيتي بي عالمت را در هر ضرب كنيم . براي اين كار ابتدا الزم است كه اين اعداد را به 8مثال ما نظر داريم كه دو عدد در ايناگر عدد تواني براي انجام عمل ضرب استفاده كنيم . shiftغير اين صورت نمي توانيم از دستور در آوريم در 2صورت تواني از

2حال اگر عدد تواني از مي توان عمل ضرب را انجام داد . SHLبار استفاده از دستور 6به راحتي با ) 26( 64باشد مثل 2از تبديل كنيم . مثال اگر داشته باشيم 2ا به صورت مجموع چند عدد مضرب نبود ، كه در اكثر موارد اينگونه است آنگاه بايد عدد ر

را به صورت زير بنويسيم . 11) ما بايد عدد X× 11عدد ( X × 11 = ( X × 8 ) + ( X × 2 ) + ( X × 1 ) 3 SHL 1 SHL 0 SHL

يد كه ي توانيم عمل ضرب را انجام دهيم . حال ممكن است از خود سوال كندر اين صورت ما استفاده از عمل شيفت و جمع م دويي عدد توجه كنيد :ي اين كار ابتدا بايد به صورت دومضرب را به صورت باال در آوريم . براچگونه

11 = ( 00001011 ) 8و 2، 1عدد يك داريم كه به ترتيب از راست به چپ با اعداد 3دقت كنيد متوجه مي شويد كه 11اگر در صورت دودويي عدد

به سمت چپ شيفت پيدا كند . در مثال 1ما بايد به اندازه شماره آن بيت Xدر مضرب 1هم وزن هستند . پس به ازاي هر عدد بار شيفت به چپ پيدا كند و سپس سه عدد بدست آمده بايد با هم جمع شوند . براي راحتي 0و 1و 3بايد به اندازه Xباال ابتدا

بار به سمت چپ 3را Xدر نظر مي گيرم كه در ابتدا با صفر مقدار دهي شده است . سپس عدد resultكار يك متغير مانند جمع مي resultبار شيفت مي دهيم و حاصل را با 1را Xجمع مي كنيم . سپس عدد resultشيفت مي دهيم و حاصل را با

را تغيير مي Xمحتويات shiftدستور ) . توجه داشته باشيد كه shl = 0جمع مي كنيم ( resultرا با Xكنيم و سپس خود عدد tempمحتويات قبلي را از طريق انتقال Xنگه داريد و قبل از عمل شيفت بعدي عدد tempرا در Xدهد پس يك كپي اوليه از

به حالت اول در آوريد . خالصه مطالب گفته شده را الگوريتم زير مشاهده مي كنيد :

mult8 (number1, number2) result := 0

for (i = 7 downto 0) if (bit(number2, i) = 1) ;

result := result + number1 * 2i end if

end for end mult8

Page 73: Assembly

  

  

73

.CODE .STARTUP READ_INPUT:

; قرار بده AXعدد اول را بخوان و در

; قرار بده BXعدد اول را بخوان و در

CALL MULT8

; قرار دارد ، آن را چاپ كن AXنتيجه در

DONE: .EXIT MULT8: PUSH CX PUSH DX PUSH SI XOR DX , DX ; DX=0 ( KEEP MUL RESULT ) MOV CX , 7 ; CX = # BIT ( # OF SHIFT REQUIRE ) MOV SI , AX ; SAVE ORIGINAL NUMBER 1 IN SI REPEAT1: ; ITERATES 7 TIMES ROL BL , 1 ; TEST BIT OF NUMBER2 FROM LEFT ( CF SET ( BIT = 1 ) OR CLEAR ( BIT = 0 ) )

JNC SKIP1 ; IF BIT = 0 , DO NOTHING MOV AX , SI ; ELSE AX = NUMBER1 * BITWEIGHT SHL AX , CL ; CL = # BIT THAT IS 1 ADD DX , AX ; UPDATE SUM IS DX SKIP1 : DEC CX JNZ REPEAT1 ROL BL , 1 ; TEST THE RIGHTMOST BIT OF AL SHL AX , 0 JNC SKIP2 ADD DX , SI ; ELSE ADD NUMBER 1 SKIP2: MOV AX , DX ; MOVE FINAL RESULT INTO AX POP SI POP DX POP CX RET

Page 74: Assembly

  

  

74

حال مي خواهيم با استفاده از دستورات دستكاري بيت ها اين برنامه را باز نويسي كنيم .

MULT8: PUSH CX PUSH DX PUSH SI XOR DX , DX ; DX=0 ( KEEP MUL RESULT ) MOV SI , AX ; SAVE ORIGINAL NUMBER 1 IN SI REPEAT1: ; ITERATES 7 TIMES BSF CX , BX ; RETURN FIRST 1 BIT POSITION IN CX JZ SKIP1 ; IF ZF = 1 , NO 1 BIT IN BX . DONE MOV AX , SI ; ELSE AX = NUMBER1 * BITWEIGHT SHL AX , CL ; CL = # BIT THAT IS 1 ADD DX , AX ; UPDATE SUM IS DX BTC BX , CX ; COMPLEMENT THE BIT FOUND BY BSF JMP REPEAT 1 ; SKIP1 : MOV AX , DX JNZ REPEAT1 ROL BL , 1 ; TEST THE RIGHTMOST BIT OF AL SHL AX , 0 JNC SKIP2 ADD DX , SI ; ELSE ADD NUMBER 1

Page 75: Assembly

  

  

75

:پردازش رشته – 11-1

String Processing FIXED - LENGTH VARIABL- LENGTH

FIXED - LENGTTH در string هاي با طول ثابت ، اگر طولstring كمتر باشد ، بقيه كاركتر هايstring باblank پر

ناقص ذخيره مي شود . stringباشد ، stringبزرگتر از سايز stringمي شود و اگر طول

: معايب اين روش

برنامه نويس بايد سايزstring . را پيش بيني كند

فضاي حافظه هدر مي رود . در صورتي كه طولstring ها كمتر ازfixed-length . باشد

VARIABLE - LENGTH

وش كه دو عيب روش قبلي در آن برطرف مي شود ، براي هر در اين رstring بايد مقدارlength attribute اي را نشان مي دهد ، نگه داري مي شود . stringكه سايز آن

مقدارlength attribute روش قابل 2باassign است : شدن

ذخيره كردن صريحlength attribute

استفاده ازsentinel character ( نگهبان )

روش اول ) ذخيره كردن صريحlength attribute

STRING DB ‘ERROR MESSAGE’ STR_LEN DW $ - STRING اسمبل)زمان (درطول رشته را بر مي گرداند

روش دوم ) استفاده ازsentinel character

اري نمي شود بلكه هر در اين روش طول جايي نگهدstring با يك كاركتر غير قابل نمايش است خاتمه مي يابد .

است 00H كه كد اسكي آن NULLمثال

STRING1 DB ‘THIS IS OK’, 0 STRING2 DB ‘PRICE = $ 9.99’, 0

در مابقي اين فصل از از اين روش استفاده مي شود

Page 76: Assembly

  

 

mem (

شود . تكرار

پذير

mory to memo

ر داشته باشد. تا اضافه مي شيژگي قدرت تشته اي امكان

REP

REPE/

STRIN (

ory( به حافظه

DEDE

DS ياES قرارت 4، دوتا و يا

باشد . اين و دستورات رشت

W E

/REPZ

W E

NG INSTRUCه دو رشته ، ...

مليات حافظه باز مقادير صحيح .

DS : ESI تيES : EDI تيDS : SI بيتيES : DI بيتي

يكسان مانند index ، يكي ،

double wor

به prefixك

WHILE [ ECEXECUTECX = E

END WHILE

WHILE [ ECEXECUTECX = EIF ( ZF END IF

END WHILE

CTIONS رشته ، مقايسه

توان براي عمال كپي يك آرايه ا

بيت 32ند مبداءبيت 32 مقصدند

16لوند مبداء 16 مقصدوند

ر يك سگمنتxجيستر هاي

word و ياrd

ضافه شدن يك

CX ≠ 0 ] TE the strinECX – 1

CX ≠ 0 ] TE the strinECX – 1 = 0 ) THEEXIT LOOP

 76

د دارد . ( كپي

ستورات را ميستفاده قرار داد . مثال

عملو عملوند

عمل عملو

بداء و مقصد درst به مقادير رج

d روي بايت ،

ي دهد كه با ا

ng instructio

ng instructio

EN ;

وجو stringبا

ست كه اين دسز رشته نيز مورد اس

رشته اي

ر دو عملوند مبtringر دستور

عمليات رشتهي را به ما مي

on;

on;

دستور مرتبط ب

كته مهم اين اسي داده هاي غير از

ها در عمليات ر

ته مي توان هرد از اجراي هرسته به اينكه عمليات رشته اي

ي شود .

5

نكبراي

عملوند ه

البت بعد

بسعممي

Page 77: Assembly

  

  

77

REPNE/REPNZ

WHILE [ ECX ≠ 0 ] EXECUTE the string instruction; ECX = ECX – 1 IF ( ZF = 1 ) THEN EXIT LOOP; END IF END WHILE

Direction Flags DF = 0 Forward Direction DF = 1 Backward Direction STD ; Set Direction Flag CLD ; Clear Direction Flag

جهت عمليات رشته اي به مقدارDirection flag ه خاطر داشته باشيد كه يكي از بستگي دارد . ب بوده است . direction flagهمان flag بيت هاي

String Move Instructions

MOVSB DESTINATION , SOURCE ; move a string ( byte ) MOVSW DESTINATION , SOURCE ; move a string ( word ) MOVSD DESTINATION , SOURCE ; move a string ( double word )

بعد از هرmov مقدار DS : ESI ،ES : EDI واحد اضافه مي شود . 4و يا 2، 1به اندازه

روي هيچflag . اي تاثير ندارد

41ثال م :

.DATA STRING 1 DB ‘the original size ‘ , 0 STRLEN EQU $ - STRING 1 .UDATA STRING2 RESB 80 .CODE

.STARTUP MOV AX , DS ; SETUP ES MOV ES , AX MOV ECX , STRLEN ; MOV ESI . STRING1 ; MOV EDI , STRING2 ; CLD ; forward direction REP MOVSB

Page 78: Assembly

  

  

78

String Load Instructions

LODSB SOURCE ; copy a string ( byte ) LODSW SOURCE ; copy a string ( word ) LODSD SOURCE ; copy a string ( double word )

مقدارstring كه با )DS : ESI اشاره مي كند ) بهAL ،AX و ياEAX . كپي مي شود

اين دستور باrep . مورد استفاده قرار نمي گيرد

اين دستور به همراه دستور بعدي وقتي استفاده مي شود كه در هنگام كپي كردنstring نياز به پردازش وجود داشته باشد .

String Store Instructions STOSB DESTINATION ; store a string ( byte ) STOSW DESTINATION ; store a string ( word ) STOSD DESTINATION ; store a string ( double word )

مقدارAL ،AX و ياEAX را بهES : EDI . در حافظه كپي مي كند

اين دستور به همراه پيشوندrep لوك از حافظه را ، يك كاركتر خاص مقدار دهي اوليه مي نمايد . ، يك ب

1مقدار دهي اوليه يك بلوك حافظه با : 42ثال م-

.UDATA ARRAY1 RESW 100 .CODE

.STARTUP MOV AX , DS ; SETUP ES MOV ES , AX MOV ECX , 100 ; MOV EDI . ARRAY1 ; MOV AX , -1 ; CLD ; forward direction REP STOSW

تبديل رشته با حروف بزرگ به حروف كوچك : 43ثال م

MOV ECX , STRLEN MOV ESI , STRING1 ; MOV EDI , STRING2 ; CLD ; forward direction LOOP 1 : LODSB OR AL , 20H STOSB LOOP LOOP1

Page 79: Assembly

  

  

79

String Compare Instruction

COMPSB DESTINATION , SOURCE ; compare 2 string byte by byte اثرcompsb رويflag ها همانند اثرcmp رويflag . است

مي توان ازja ،jg ،jc . و ... براي مقايسه دو رشته استفاده نمود

44ثال م :

.DATA STRING 1 DB ‘ abcdfghi ‘ , 0 STRLEN EQU $ - STRING 1 STRING 2 DB ‘ abcdefgh’ , 0 .CODE

.STARTUP MOV AX , DS ; SETUP ES MOV ES , AX MOV ECX , STRLEN MOV ESI . STRING1 MOV EDI , STRING2 CLD ; forward direction

REPE CMPSB ; بودن مواجه مي شودبا نا مساوي مقايسه را تا زماني ادامه مي دهد كه مقايسه

JA STR1_ABOVE ; STRING1در ’g‘به ESIدر پايان اجراي اين دستور

;اشاره مي كند STRING2در ’F‘به EDIو

براي مقايسه دو رشته استفاده نمود ( حلقه ) . تا زماني كه دو رشته تفاوت دارند ادامه مي يابد ، در غير اين صورت REPNEيا REPNZمي توان از ( كه دو كاركتر يكسان مشاهده مي شود ) حلقه خاتمه مي يابد .

.DATA STRING 1 DB ‘ abcdfghi ‘ , 0 STRLEN EQU $ - STRING 1 STRING 2 DB ‘ abcdefgh’ , 0 .CODE

.STARTUP MOV AX , DS ; SETUP ES MOV ES , AX MOV ECX , STRLEN MOV ESI . STRING1 + STRLEN -1 MOV EDI , STRING2+ STRLEN -1 STD ; backward direction

REPNE CMPSB INC ESI INC EDI

Page 80: Assembly

  

  

80

String Scanning Instruction

SCASB DESTINATION ; scanning a string ( byte ) SCASW DESTINATION ; scanning a string ( word ) SCASD DESTINATION ; scanning a string ( double word )

براي جستجوي يك مقدار يا يك كاركتر درstring . مورد استفاده قرار مي گيرد مقدار بايد درAL ،AX و ياEAX . قرار داشته باشد ES : EDI به آدرسstring . اي اشاره مي كند كه بايد جستجو شود دستور روي تاثير اينflag ها همانند دستورcmp . است همراه اين دستور نيز معموال ازrepe / repz و ياrepnz / repne . استفاده مي شود

SCASB – Scan a byte string compare AL TO the byte at ES : EDI and set flags IF ( DF = 0 ) ; forward direction THEN EDI := EDI + 1 ELSE ; backward direction EDI := EDI – 1 END IF

45ثال م : .DATA STRING 1 DB ‘ abcdefgh ‘ , 0 STRLEN EQU $ - STRING 1

.CODE .STARTUP MOV AX , DS ; SETUP ES MOV ES , AX MOV ECX , STRLEN MOV EDI , STRING1 MOV AL , ‘e’

CLD ; forward direction REPNE SCANB DEC EDI

اين مثال فضاي هاي خالي : 46ثال مblanks مقدار را در نظر نمي گيرد ) .EDI نهايي به اولين كاراكتر غير ازblank اشاره

مي كند . .DATA STRING 1 DB ‘ abc ‘ , 0 STRLEN EQU $ - STRING 1

.CODE .STARTUP MOV AX , DS ; SETUP ES MOV ES , AX MOV ECX , STRLEN MOV EDI , STRING1 MOV AL , ‘ ’ CLD ; forward direction

REPE SCANB DEC EDI

Page 81: Assembly

  

  

81

در اين مثال : 47 ثالمprocedure ، آدرس رشته اي را به عنوان پارامتر از پشته در يافت مي كند . اگر رشته وجود نداشته باشد

مي شود . در اين مثال CF ،clearقرار داده مي شود و مقدار EAXمي شود و در غير اين صورت طول رشته در CF ،setمقدار همه رجيستر ها حفظ مي شوند .

ابتدا قبل از مثال به اين نكته توجه كنيد .

ذخيره شود . ES : EDIيا DS : ESIزير در يكي ldsو lesآدرس رشته مي تواند توسط دستورات

LES & LDS Instructions

LDS REGISTER , SOURCE LES REGISTER , SOURCE

بيتي اين دستورات روند زير را طي مي كنند : 48بيت باشد و عملوند 32هر گاه رجيستر ما

LDS o REGISTER := (SOURCE) o DS := ( SOURCE + 4 )

LES o REGISTER := (SOURCE) o ES := ( SOURCE + 4 )

اين دستورات تاثيري بر رويflag . ها ندارند

معموال دستورLDS برايload رشته در رجيستر كردنESI به عنوان مبداء وLES برايload كردن شوند .به عنوان مقصد استفاده مي EDIرشته در رجيستر

دستوراتLSS ،LGS وLFS نيز برايload كردن بر روي رجيستر ، سگمنت هاي ديگر درنظر گرفته شده اند .

.DATA STR_MAX EQU 128 %DEFINE STRING 1 [ EBP + 8 ] %DEFINE STRING 2 [ EBP + 16 ]

.CODE STR_LEN : ENTER ( 0 , 0 ) PUSH ECX PUSH EDI PUSH ES LES EDI , STRING 1 ; copy string1 pointer to ES : EDI ‘ use EDI because SCASB need destination operand MOV ECX , STR_MAX ; need to terminate loop if EDI is not pointing to a string CLD ; forward direction MOV AL , 0 ; NULL character REPNE SCASB JCXZ SL_NO_STRING ; if ECX = 0 , not a string DEC EDI ; back up to point to NULL MOV EAX , EDI SUB EAX . [ EBP + 8 ] ; string length in EAX CLS ; no error CF = 0 JMP SHORT SL_DONE

Page 82: Assembly

  

  

82

SL_NO_STRING : STC ; error CF = 1 no string SL_DONE : POP ES POP EDI POP ECX LEAVE RET 8 (WHY WE USE IT 8 ? because the start of STRING1 IS [EBP + 8 ] so 8 byte is full )

Page 83: Assembly

  

 

هاي BCD يمال

ارقام منفي

ه اگر خواهد

اما در كاربردDقام را در مد

ASC و يا دسي

ار نشان دادنو به ازاي م 00

hآن است كهunpac يكي خو

مالحظه نيستيما پردازش ارق

II ت را در مد

A U P

ASCII داده مي شود .

12

UNPA د .

12راي عالمت دا

0Hبودن عدد

igh_orderم

ck BCDايش

ي ببريد )

Packe

12

العكس قابل ممستقيماييم و

ستقيما محاسبات

ASCII UNPACKED PACKED BCD

Representaك بايت نمايش234 31

ACKED BCD ذخيره مي شود234 01ته مي شود . بره ازاي مثبت ب

u در چهار رقمش ) دهيم با نما اين موضوع پي

ed BCD Rep شود .

234 12

به باينري و باواگذار مي نم ر

ديگري كه مس شماره است .

BCD D

ation a آن و در يك

1H 32H 33H

Representaل در يك بايت

1H 02H 03Hت در نظر گرفته مي شود كه به

unpacked BC

mask پوشش )كنيد تا بهيسه

resentationت ذخيره مي ش2H 34H

 83

ASCII :

ASCIIيل از د

سربار پروسسور. دليل دهيم

ر ارقام در يك

م

asciiت معادل

H 34H

ation هر رقم دسيمالH 04H رت بي عالمتدر نظر گرفتهخود مي گيرد.

ascii و ياCD

high_or راk

را با هم مقاي 1

n مال در يك بايت

و BCDوش

، سربار دو تبدسرا به تبديل

AS انجام ميدود بودن مقدار

مايش ارقام

هر رقم به صورت

عادل باينري ه

ط ارقام به صو براي عالمت د

را به خ 80Hرiقم به صورت

derچهار رقم

234ش متفاوت

هر دو رقم دسيم

ارقام با دو ر

برد هاي سادهسربار تر اين

SCIIو يا مال )

مي دهيم نامحد

وش هاي نم

، ه روش اين

ن روش ، مع اي

اين بحث فقطك بايت مجزا

دن عدد ، مقداراوت نمايش رق

چ ascii روشنمايش 2( د .

ه اين روش ،

نمايش ا –

در كاربپيچيده( ديسمانجام م

انواع ر

در

در

دريكبود

تفادرشد

در

12-1 –

Page 84: Assembly

  

  

84

: ASCII پردازش ارقام در روش ارائه – 12-2

Processing in ASCII Representation

AAA ( ASCII adjust after addition ) AAS ( ASCII adjust after subtraction ) AAM ( ASCII adjust after multiplication ) AAD ( ASCII adjust before division )

ASCII Addition AAA ( ASCII adjust after addition )

قرار دارد. ( به صورت اسكي ) ALبدون عملوند مي باشد و فرض مي كند كه عملوند در AAA) دستور 1 به صورت زير است : AAA) نحوه عملكرد 2

اضافه كن. AHرا به 1و مقدار ALرا به 6باشد ، مقدار 1برابر AFباشد و يا مقدار 9بزرگتر از AL) اگر چهار بيت كم ارزش 2-1 خواهد شد . صفر AL بيت پر ارزش 4) در همه حالت ها 2-2

را با AXدر بيايد ، بايد ASCIIاست و اگر بخواهيد به صورت UNPACKED BCDبه صورت AXدر AAS) خروجي دستور 3 3030H ،OR .نماييد

49ثال م : ASCII

4 34 H + 5 35 H

9 69 H 4 بيت پر ارزش صفر مي شود 09 H 50ثال م : IIASC

9 39 H + 5 35 H

14 6E H AH = 00H AL = 6EH AAA AH + 1 , AL + 6 AH = 01 AL = 04 OR AX,3030H 3134H

ASCII Subtraction AAS ( ASCII adjust after subtraction )

قرار دارد. ( به صورت اسكي ) ALبدون عملوند مي باشد و فرض مي كند كه عملوند در AAS) دستور 1 به صورت زير است : AAS) نحوه عملكرد 2

كن. كم AHرا از 1و مقدار ALرا از 6باشد ، مقدار 1برابر AFباشد و يا مقدار 9بزرگتر از AL) اگر چهار بيت كم ارزش 2-1 2-2 (CF وAF راset . مي كند خواهد شد . صفر AL بيت پر ارزش 4) در همه حالت ها 2-3

را با AXدر بيايد ، بايد ASCIIاست و اگر بخواهيد به صورت UNPACKED BCDبه صورت AXدر AAA) خروجي دستور 3 3030H ،OR .نماييد

51ثال م :

9 39 H SUB AH , AH ; CLEAR AH - 3 33 H MOV AL , ‘9’ ; AL = 39 H

6 06 H SUB AL , ‘3’ ; AL = 39H – 33H =06H AAS ; AX = 0006 OR AL , 30H ; AL = 36H

Page 85: Assembly

  

  

85

52ثال م :

3 39 H SUB AH , AH ; CLEAR AH - 9 33 H MOV AL , ‘3’ ; AL = 33 H

4 06 H SUB AL , ‘9’ ; AL = 33H – 39H =FAH AAS ; AX = FF04H OR AL , 30H ; AL = 34H

مقدار درAL قرار مي گيرد وset شدنCF نشان دهنده رخدادborrow . است

ASCII Multiplication AAM ( ASCII adjust after multiplication )

. ASCIIاست و نه UNPACKED BCDبر خالف جمع و تفريق ، ورودي در اين دستور از نوع ) 1 يرد.قرار مي گ ALو باقيمانده در AHدسيمال تقسيم مي شود . خارج قسمت در 10بر ALمقدار ) 2 را با AXدر بيايد ، بايد ASCIIاست و اگر بخواهيد به صورت UNPACKED BCDبه صورت AXدر AAA) خروجي دستور 3

3030H ،OR .نماييد 53ثال م :

3 39 H MOV AL , 3 ; multiplier in unpacked BCD × 9 33 H MOV BL , 9 ; multiplicand in unpacked BCD

27 06 H MUL BL ; result 001BH in AX AAM ; AX = 0207H OR AX , 3030H ; AX = 3237H

بيت پرارزش آن را 4اگر دو مقدار ورودي در كد اسكي باشند ، بايد : 54ثال مmask . كنيم

MOV AL , ‘3’ ; multiplier in unpacked ASCII MOV BL , ‘9’ ; multiplicand in unpacked ASCII AND AL , 0FH ; multiplier in unpacked BCD AND BL , 0FH ; multiplicand in unpacked BCD

MUL BL ; result 001BH in AX AAM ; AX = 0207H OR AX , 3030H ; AX = 3237H

ASCII Division AAD ( ASCII adjust before division )

. ASCIIاست و نه UNPACKED BCD) بر خالف جمع و تفريق ، ورودي در اين دستور از نوع 1 مي كند . AX ،adjustدر رجيستر مقدار صورت كسر را قبل از عمل تقسيم) 2 را صفر مي نمايد . AHاضافه مي كند و همچنين مقدار ALضرب مي كند و آن را به 10را در AHمقدار ) 3

قرار مي گيرد . AHو مقدار باقيمانده در AL) بعد از عمل تقسيم مقدار خارج قسمت در 4 AX = 0207H AH = 02H ×10D AH = 20D AL = 07H +AH AL = 27D = 1BH AH = 00H AX = 001BH

MOV AX , 0207H ; dividend in unpacked ASCII MOV BL , 05H ; divisor in unpacked ASCII

AAD ; AX = 001BH DIV BL ; AX = 0205H AL = 02 (reminder) AX = 05 (quotient)

Page 86: Assembly

  

  

86

جمع دو عدد دسيمال چند رقمي در روشASCII

. در اين روش در هر زمان يك رقم جمع مي شود كه از رقم سمت راست شروع مي شود مقدارCarry ر مي گيرد .در هر جمع ، در جمع بعدي مورد استفاده قرا

.DATA NUMBER1 DB ‘1234567890’ NUMBER2 DB ‘1098765432’ .CODE .STARTUP ; ESI is used as index into NUMBER1 , NUMBER2 , SUM MOV ESI , 9 ; ESI به رقم سمت راست اشاره مي كند MOV ECX , 10 ; تعداد رقم ها CLC ; clear carry ( we use ADC not ADD ) ADD_LOOP : MOV AL , [ NUMBER1 + ESI ] ADC AL , [ NUMBER1 + ESI ] AAA PUSH F ; save flags because or instruction changes CF that we need in the next iteration OR AL , 30H POPF MOV [ SUM + ESI ] , AL DEC ESI LOOP ADD_LOOP ; print sum .EXIT

: PACKED BCDپردازش ارقام در روش ارائه – 12-3

Processing in PACKED BCD Representation

DAA ( Decimal Adjust After Addition ) DAS ( Decimal Adjust After Subtraction )

ضرب و تقسيم در اين مد وجود ندارد . براي انجام اين عمليات ارقام را به مدUNPACKED BCD ببريد ، عمليات ضرب و تقسيم را انجام دهيد و برگردانيد . PACKED BCDسپس به مد

BCD Addition

DAA ( Decimal Adjust After Addition )

مي كند . setرا AFاضافه مي كند و ALرا به 6باشد ، مقدار 1برابر AFبزرگتر باشد و يا مقدار 9از ALرقم كم ارزش در 4اگر ) 1 را CFاضافه مي كند و سپس ALرا به 60Hباشد ، مقدار 1 برابر با CFباشد و يا مقدار 9بزرگتر از ALاگر چهار بيت پر ارزش ) 2

SET . مي كند MOV AL , 71H

ADD AL , 43H ; AL = B4H DAA ; ADD AL , 60 AL = 14H & CF = 1

Page 87: Assembly

  

  

87

BCD Subtraction DAS ( Decimal Adjust After Subtraction )

مي كند . setرا AFمي كند و كم AL ازرا 6باشد ، مقدار 1برابر AFبزرگتر باشد و يا مقدار 9از ALرقم كم ارزش در 4 ) اگر 1 را CFمي كند و سپس كم AL ازرا 60Hباشد ، مقدار 1برابر با CFباشد و يا مقدار 9بزرگتر از AL) اگر چهار بيت پر ارزش 2

SET . مي كند MOV AL , 71H

SUB AL , 43H ; AL = 2EH DAS ; SUB AL , 06 AL = 28H & AF = 1

%DEFINE SUM_LENGTH 10 .DATA NUMBER1 DB 12H , 32H , 56H , 78H , 90H NUMBER2 DB 10H , 98H , 76H , 54H , 32H .UDATA BCDSUM RESB 5 .CODE MOV ESI , 4 ; MOV ECX , 5 ; loop iteration count CLC ; clear carry ( we use ADC not ADD ) ADD_LOOP : MOV AL , [ NUMBER1 + ESI ] ADC AL , [ NUMBER1 + ESI ] DAA ; ASCII Adjust MOV [ BCDSUM + ESI ] , AL DEC ESI LOOP ADD_LOOP CALL ASCII_CONVERT ASCII_CONVERT: PUSHAD ; save registers ; ESI is used as index into ASCIISUM MOV ESI , SUM_LENGTH-1 ; EDI is used as index into BCDSUM MOV EDI , 4 MOV ECX , 5 CNV_LOOP: MOV AL , [ BCDSUM+EDI ] ; AL = BCD digit MOV AH , AL ; convert right digit to ASCII & store in ASCIISUM ADD AL , 0FH OR AL , 30H MOV [ ASCIISUM + ESI ] , AL DEC ESI MOV AL , AH ; convert left digit to ASCII & store in ASCIISUM SHR AL , 4 OR AL , 30H MOV [ASCIISUM+ESI] , AL DEC ESI DEC EDI LOOP CNV_LOOP POPAD

Page 88: Assembly

  

 

ينري

 88

ASC و يا باي IIت در حالت سه محاسبات

مقايس

Page 89: Assembly

  

 

.

جلب براي

د در يستم

.شود

صدا زدن است.

ه پروسسور را جه پروسسور را ب

نوشته مي شوال بخشي از سي

د حافظه مي ش

J

P

I

C افزاري قابل ص

I;

ت افزاري توجهInterru توجه

كردن برنامه ن

ISR ( معموال

ه مي شود وارد .ه مي شود

Softw

S U

ت اجرا

JUMP ( گشتPROCEDURE

NTERRUPT

CALL صورت سخت

NT صفحه كليد

Interrup سختuptد با ايجاد

پردازش شود. جهت بخشInterrupt S

Pr خواندوقتيP با نام صدا زده

ware Interru

SYESTEM-DUSER-DEFIN

ي برنامه جهت ( غير قابل برگE ( بل برگشتT ( ابل برگشت

مي شود

PROCNAMEفزاري و هم بهINTNUMBEمانند خواندن از

ptيق ايجاد طر

، صفحه كليددفشار داده شده برنامه نويس

Service Rou

rocedureكه

Procedureه

upts ق برنامهDIFINED NED

 89

Protecte :

دستور بعدي

( قاب ( قا

Pr

زاري صدا زدهE صورت نرم افزER ت نرم افزاري م پروسسور از طفشرده مي شودي كند تا كليد فست كه توسط

Inte ،tine )

ست ، در حالي كد ، در حالي كه

و خروجي از طريق

ed Mode Int

غيير آدرس د

rocedureو

صورت نرم افز

Interru هم به

به صورت زدنزار هاي غير ازوقتي كليدي فمرتبط جلب مي

كاري اس عموالerruptوط به

ه مقيم اسهموارصدا زده مي شود

سي به ورودي و

terrupt Proc

وش هاي تغ

Interruptسه

Procedur به

upt حالي كه

صدا

ال ) سخت افزي كنند. مثال و

م ISRراي كدProcedur مع

لي كه كد مربو مل است .

IS در حافظه هIS با شماره صد

براي دسترس

– cessing

انواع ر

مقايس re

در

مثامياجر

re

حاعا

SR

SR

13-1

Page 90: Assembly

  

  

90

Hardware Interrupts براي دسترسي سخت افزار به پروسسور

Maskable بعد از اجرا ، بعد از اجراي دستور خطي پروسسور

Nonmaskable ( Memory Panty Error ) اجراي بدون تاخير

Exceptions Fault

Divide to zero Segment not present بعد از اجرا ، پروسسور به وضعيت قبل از اجراي دستور باز مي گردد

Trap Overflow USER-DEFINED Interrupts از اجراي دستور باز مي گردد بعدبعد از اجرا ، پروسسور به وضعيت

Abort Severe Errors خطا هاي سخت افزاري

پردازش نحوهInterrupt

256 نوعInterrupt وجود دارد . هرInterrupt با يك عددكهInterrupt vector ، ناميده مي شود شناخته مي شود .

هرInterrupt vector به بخشي مشخص از حافظه نگاشته مي شود كهISR .آن در آن مكان قرار دارد

وقتيInterrupt . اي رخ مي دهد ، عمليات زير اتفاق مي افتد

ده .قرار ب stackرا در flagرجيستر .1

2. IF ( Interrupt Flag ) ،TF ( Trap Flag ) راclear كن تاInterrupt هاي بعدي غير فعال شود .

3.CS وIP را درstack قرار بده.

مقدار دهي مي شود . ( سگمنت مربوط به وقفه ها ) ISRبا مكان حافظه CSمقدار .4

مربوط باردهي شود . ISRبا مكان اجراي IPمقدار .5

كن . popرا Flag Registerو سپس CSو سپس IPابتدا ISRبعد از اجراي .6

Page 91: Assembly

  

 

ر هر

س هاي وقفه در

Softw

D

Bضي از سرويس

ند .

ware Interru

DOS Service

BIOS Servicي نيستند . بعض

استفاده مي كن

upts

es 21H

ces 16H تقل و انحصاري

BIOSي وقفه

 91

re :

اصلي I/Oي( 80 Differ

BIO لزوما مست

از سرويس هاي

eal Mode Int

به دستگاه هايrent Service

OSو DOSقفه

ا DOSدر واقع

terrupt Proc

دف : دسترسيes )

رويس هاي وقند . دو وجود دار

– cessing

هد

سردو

14-1

Page 92: Assembly

  

  

92

سرويس هايKeyboard مربوط بهDOS

INT 21H

FUNCTION 01H – KEYBOARD Input with echo Input : AH = 01H Returns: AL = ACSII code of the key

.خواندن كاركتر از بافر صفحه كليد . اگر بافر خالي باشد ، منتظر مي ماند تا كاركتري وارد شودباشد CTRL+BREAKي شود . اگر كاركتر كاركتر وارد شده در صفحه نمايش نشان داده م

INT 23 اجرا مي شود كه برنامه راabort . مي كند

FUNCTION 06H – Direct Console I/O Two sub functions :

Keyboard input Input : AH = 06H

DL = FFH Returns: ZF = 0 if a character is available AND AL = character

ZF = 1 if no character is available منتظر كاركتر نمي ماند

Character Display Input : AH = 06H

DL = Character to be displayed Returns: Nothing

FUNCTION 07H – KEYBOARD Input without echo or CTRL+BREAK Input : AH = 07H Returns: AL = ACSII code of the key

FUNCTION 08H – KEYBOARD Input without echo Input : AH = 08H Returns: AL = ACSII code of the key

Page 93: Assembly

  

 

و يا بافر به انداززه

F

En وارد شود و

F

F

.

FUNCTION

Input

Retu

nter كه كليد

FUNCTION Input Retu

ك مي شود .

FUNCTION Input

Retu

نجام مي شود

0AH – Bufft : AH DS

شد ) urns: دهد

شوند تا زماني

0BH – Chect : AH urns: AL AL =

CTRL + B چك

0CH – Cleat : AH AL =

urns: Depا ALنين عمل

 93

fer Keyboar= 0AH : DX = Poin

ل سايز بافر باشدرودي قرار مي

هم خوانده مي ن پر شود .

ck Keyboard= 0BH = 00H – if = FFH – if

BREAKرودي

ar Keyboard= 0CH = 01H , 06Hpend on AL ي شود ، همچن

rd Input

nter to the i بافر بايد شاملده را در بافر ور

ها پشت سر همتر از طول آن

d Buffer

the keyboathe keyboar

function و ،

d Buffer

H , 07H , 0contents

پاك مي ALت

input buffer ( اولين بايتشته خوانده شد

كاركتريكي كم

ard buffer isrd buffer is

در اين

08H , 0AH

محتويات

r

رش

s empty. s not empty..

Page 94: Assembly

  

 

00

ي

0Hيرد ، معادل

معادل كد اسكلي

R

IF E E

Exten

بافر قرار مي گي

قرار مي گيرد م

Read the ne

F ( AL ≠ 0 AL =

ELSE { EXT Rea AL =

ENDIF

ded Keyboa

Func Curs Home

ن بايتي كه در ب

ي كه در بافر ق

xt Characte ده شود .

) THEN = ASCII CODTENDED KEd the scan = SCANCOD

ard Keys

ction Keys sor Arrows e , End , …

د

ex نباشد ، اولي ست .

شد ، اولين بايتي .

er code intoيد بايد صدا زد

DE Y } code of the

DE ( Extend

 94

يد وارد مي شوxtended نوع

SCANCOD اسباش ASCII نوعSC كليد است

AL using fufun خواندن كلي

e extended kded Key Cha

ندارند

ي رو صفحه كلييد وارد شده ازDE دوم معادل

يد وارد شده ازCANCODEوم

DOSكليد در

unction 08Hnctionدو بار

key into ALaracter )

عادل كد اسكي

ماني كه كليدياگر كليد.1

و بايتاگر كليد.2

بايت دووسه خواندن ك

H

extendedيد

L using 07H

مع

زم

پرو

ي خواندن كلي

Function

برا

Page 95: Assembly

  

 

وارد مقدار

EX بودن كليدو م AL=0دار

I

F

XTENDEDت با N باشد ، مقد

F

F

NT 16H

FUNCTION Input Retu

.

ت ، ممكن استULLارد شده

FUNCTION Input Retu

FUNCTION Input Retu

00H – Reat : AH urns: if A AL = AH if A AH ن كليد مي ماند

است NULLيل اگر كليد وا

01H – Chect : AH urns: ZF ZF Ret Doe

02H – Chet : AH urns: AL =

 95

BIOSط به

d a charact= 00H

AL ≠ 0 then = ASCII COD= SCANCODAL = 0 then= SCANCODنتظر وارد شدن

معادل كد اسكيراي رفع مشكل

شود .

ck Keyboard= 01H = 1 ; if the= 0 ; if theurns ASCII

es not remov

ck Keyboard= 02H = Status of

Keybo مربوط

ter from Key

DE of the kDE of the kn DE of the eر خالي باشد من

ل

م 00Hيي كهشتباه شود ، بر

A قرار داده مي

d Buffer

e keyboard bere is at leain AL and Sve them fro

d Status

f Shift and t

oardس هاي

yboard

key entered ey entered

xtended key اگر بافر مشكل

از آنجايشده اشAH=3

buffer is emst one char

SCANCODE om Keyboard

toggle Keys

سرويس

y entered

mpty racter availain AH d buffer

s

able

Page 96: Assembly

  

  

96

سرويس هايMonitor مربوط بهDOS

INT 21H

FUNCTION 02H – Display a character on the screen Input : AH = 02H

DL = ASCII code of the character to be displayed Returns: Nothing

كاركتر هاي خاص مانندbackspace معادل (08H) Carriage Return معادل (0DH)

Line Feed معادل(0AH) . و ... پردازش مي شوند CTRL+BREAK . پس از نمايش كاركتر اجرا خواهد شد

FUNCTION 06H – Direct Console I/O . قبال بحث شده است

FUNCTION 09H – Display a string of characters

Input : AH = 09H DS : DX = pointer to a character string to be displayed the string must be terminated by $

Returns: Nothing

Direct Control of I/O Devices

3 روش دسترسي بهI/O devises

DOS ISR BIOS ISR Direct Access

o NO DOS or BIOS support o NON Standard Access

64پنتيوم فضايK خاص براي فضاي آدرسI/O . در نظر گرفته است

I/O Port 8 – BIT بيتي ) 8( انتقال

16 – BIT بيتي ) 16( انتقال ) 2آدرس زوج ( مضربي از بايت 2انتقال همزمان

32 – BIT بيتي ) 32( انتقال 4آدرس زوج ( مضربي از (

Page 97: Assembly

  

  

97

Accessing I/O Ports

Register I/O Instruction انتقال داده از رجيستر به ورودي و خروجي Block I/O Instruction بلوكي از حافظه به ورودي و خروجي انتقال

Register I/O Instructions

IN ACCUMULATOR , PORT ; Direct Addressing Format ( 0 تا FFH )

IN ACCUMULATOR , DX ; در رجيستر قرار مي گيرد پورت آدرس

ACCUMULATOR = AL , AX OR EAX

OUT PORT , ACCUMULATOR ; Direct Addressing Format ( 0 تا FFH )

OUT DX , ACCUMULATOR ; Indirect Addressing Format ACCUMULATOR = AL , AX OR EAX

BLOCK I/O Instructions INS ; PORT ADDRESS IN DX ; MEMORY ADDRESS IN ES : DI

OUTS ; PORT ADDRESS IN DX ; MEMORY ADDRESS IN DS : SI

INSB ; BYTE TRANSFER OUT SB ;

INSW ; WORD TRANSFER OUT SW ;

INSD ; DOUBLEWORD TRANSFER OUT SD ;

فصل مربوط بهSTRING . مطالعه شود . مطالب بيشتر در كتاب مطالعه شود

Page 98: Assembly

  

  

98

بعضي از وقفه هاي از قبل تعريف شدهDEDICATED INTERRUPTS

PurposeInterrupt Type Divide Error0 Single Step1

Nonmaskable Interrupt2 Break Point3

Overflow4

Divide Error ( INT 0 ) را توليد 0از سايز مقصد در نظر گرفته شده باشد ، پروسسور وقفه بزرگتر idivيا divباقيمانده دستور وقتي

مي كند . MOV AX , 50 MOV AX , FFFF SUB CL , CL MOV BL , 2 DIV CL DIV BL ; 65532 / 2 = 32767

SINGLE - STEP ( INT 1 )

براي مشاهده رفتار برنامه با احراي هر دستور است . Debuggingابزار توليد مي كند . خروجي همه 1اجراي هر دستور وقفه باشد ، پروسسور بعد از TF=1وقتي ها نمايش داده مي شود . رجيستر مي شود . TF=0پايان اجراي اين وقفه براي

سترسي نيست . در فصل هاي آينده توضيح داده خواهد شد .به صورت مستقيم قابل د TFمقدار

Break Point ( INT 3 ) ، برنامه كاربر تا اجراي اين دستور ادامه مي يابد و بعد از اين در نقطه اي از برنامه INT 3گذاشتن با

تعدادي از دستورات برنامه را مشاهده نتيجه محاسبات دستور ، اجراي برنامه متوقف مي شود كه كاربر و بعد ادامه مي دهد . مي كند

، براي اجراي يك به يك 1براي آزمايش يا تست برنامه هاي اسمبلي ، مي توان از وقفه شماره :نكته مي توان براي اجراي تعدادي دستور و بررسي نتايج بهره برد . 3و از وقفه شماره دستورات و ديدن نتايج

Overflow ( INT 4 )

سرويس اين overflowداد در برنامه قرار داده شود ، در صورت رخ INTOدستور ايجاد وقفه سرريز گر ا اجرا نشده و دستور بعدي برنامه اجرا (INT 4)جرا مي شود ، در غير اين صورت سرويس وقفه وقفه ا

مي شود .

MOV AL , DATA1 MOV BL , DATA2 ADD AL , BL INTO MOV SUM , AL

Page 99: Assembly

  

  

99