آموزش اسمبلی - Assembly

وضعیت
موضوع بسته شده است.

saalek110

Well-Known Member
in_the_name_of_god.jpg

با سلام.
تاپیکی در این تالار داریم با نام:

پیوند و اجرای اسمبلی

در ادامه این تاپیک پستهای مفید آن را نقل می کنم.
 

saalek110

Well-Known Member
من با tasm راحتم .
باید اول فايل اسمبلي را با پسوند asm ساخت. بعد باید برویم به محيط پرومپت داس. بعد می نویسیم tasm example.asm بعد link example.obj .
البته در پرومپت داس بايد وارد پوشه اي بشويد كه سورس و tasm و link كنار هم موجود است.
من الان فايل زير را با پسوند asm ذخيره كردم و با روش بالا كامپايل كردم. بي مشكل بود.
کد:
.model small

.stack
.code

test proc

mov ah,2h
mov dl,41h
int 21h

mov ah,4ch
int 21h

test endp

        end test
http://saalek110.250free.com/rars/Tasm.rar
http://saalek110.250free.com/rars/Link.rar[/SIZE]
سال 98: دو لینک بالا سوخته. دو فایل بالا را ضمیمه پست می کنم:
tasm.rar
Link.rar
از انتهای پست دانلود کنید.
ولی در ویندوز 64 بیت کار نکرد. احتمالا در ویندوز 32 بیت کار می کند. روی می کامپیوتر خود کلیک راست کنید و پراپرتی بگیرید تا ببینید ویندوز 32 بیت است یا 64 بیت.
----------------------------
سال 98 تلاش کردم پستهای تاپیک را ترمیم کنم. گزارشش در یک پست صفحه 6 هست:
آموزش اسمبلی - Assembly
==================================

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

پوشه ای که دانلود می کنید شامل 4 فایل است. که بگذارید کنار هم باشند تا نرم افزار بتواند اجرا شود.

a8.gif


حجم دانلود : 370 کیلو.

تصویر برنامه:
asm_to_exe.jpg
فایل sample.asm موقع اجرای برنامه به عنوان یک نمونه برنامه داخل برنامه باز میشه برای تست اولیه شما.
با زدن دکمه بزرگ ابتدا از کدهای داخل برنامه فایل test.asm ساخته میشه و بعد ازش test.obj و بعد test.exe و بعد هم همان test.exe اجرا میشه و شما می توانید نتیجه اجرا را ببینید.
با وجودی که بین مراحل من مکث هایی گذاشتم. ممکنه یک مرحله نرسه محصول مرحله بعد را تولید کند. دکمه را دو بار بزنید.
======================
راهنمایی اسمبلی:
فرض کنید نرم افزار بالا نباشد و ما این 3 فایل را داریم:

a6.gif


یعنی سورس اسمبلی و دو تا تبدیل گر خود را.

باید از start در ویندوز xp به All Programs و سپس Accessories رفته و Command Prompt را باز کنید. بعد به پوشه مورد نظر بروید. برای من:
F:\lab

a7.gif

و هدف من از ساختن این نرم افزار این بود که این باز کردن Command Prompt و آن تایپ ها داخل محیط داسی را نکنیم و سریع فایل exe ساخته بشه.

برنامه من همین برنامه بود:
کد:
.model small

.stack
.code

test proc

mov ah,2h
mov dl,41h
int 21h

mov ah,4ch
int 21h

test endp

        end test

در هارد اگر روی exe ساخته شده از کد بالا کلیک کنیم زود بسته میشه.
پس من دو خط کد اضافه می کنم تا برنامه بعد اجرا منتظر گرفتن کلیدی باشد و زود بسته نشود:
کد:
.model small

.stack
.code

test proc

mov ah,2h
mov dl,41h
int 21h
[COLOR="Blue"]
;--------wait for a key
MOV AH,00H
INT 16H
[/COLOR]
mov ah,4ch
int 21h

test endp

        end test

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

پیوست ها

  • Tasm.rar
    73.2 کیلوبایت · بازدیدها: 2
  • Link.rar
    23.7 کیلوبایت · بازدیدها: 0
آخرین ویرایش:

saalek110

Well-Known Member
فايلهای tasm و link اگر رویشان کلیک کنیم زود بسته می شوند. برای کار با آنها از داخل داس پرومپت عمل می کنیم.


از منوي استارت به پروگرم برو. در ويندوز 98 همان جاست در ايكس پي شايد بايد بروي يك قدم جلو تا برسي به ام اس داس پرومپت.
يا نامي شبيه آن.

در xp به این ترییب : start بعد All Programs بعد Accessories بعد Command Prompt .

یا : start بعد Run بعد نوشتن cmd و OK .
 

saalek110

Well-Known Member
همه كار را ما در يك اديتور انجام مي دهيم.
من همين الان تلاش كردم با نت پد فايل با پسوندasm بسازم ولي نشد. همه با پسوند txt ذخيره شد. شايد بشه ولي من نتوانستم. روي فايل كليك راست كنيد و پراپرتي بگيريد تا ببينيد پسوندش چيه. به نظرم از يك اديتور استفاده كنيد.
جالبه الان با توربو سي 3 توانستم فايل را با پسوند asm بسازم.

بعد كه فايل با پسوند asm ساختيد با tasm و link كامپايل كنيد. ديگه باز كردن در اين برنامه ها معني نداره. فقط اينها تبديل كننده اند و كارها همه در اديتور انجام ميشه.
ادیتور مثل ++Notepad:
Notepad++ 7.7.1 + Portable ویرایشگر قدرتمند و ساده متن
اگر لینک بالا کار نکرد. خودتان نام برنامه را سرچ کنید.

---------------------------------------------
در ديباگ ویندوز ميشه كار كرد. Debug .
در ويندوز 98 با زدن استارت و انتخاب گزينه run از همان منوي بالارونده استارت و نوشتن debug و زدن اينتر ميشه به اون رسيد. يا در پرومپت داس كه در پستهاي قبلي گفتم چه طوري بهش برسيد ميشه در هر پوشه اي كه هستيم بنويسيم bebug و اينتر كنيم و وارد محيط ديباگ بشيم كه با نمايش يك منهاي چشمك زن معلوم ميشه داخلش هستيم و با نوشتن حرف q و زدن اينتر ازش خارج مي شويم


در محيط ديباگ فراموش نكنيد كه فقط دستورات خالص اسمبلي مي خواهد نه راهنماهايي كه براي كامپايلره. كامپايلري فرض كنيد اينجا وجود نداره. البته ديباگ هم نوعي كامپايلره ولي اون راهنماها را نمي خواهد. دستورات اسمبلي فقط بنويسيد. مثل mov ah,02 و int 21 و غيره.


اگر در اديتور يك سري كد بنويسيد و با tasm كامپايل كنيد و بعد برويد با ديباگ ببينيد مي بينيد كه كاري كه شده اينه كه فقط راهنماها حذف شده و كد خالص اسمبلي برجامونده. البته تنظيم قطعه ها segment توسط راهنماها انجام ميشه ولي كدي كه در ديباگ مي بينيد فقط همون كدهاي خالص اسمبلي است. منظورم از كد خالص اسمبلي همان مثلا mov ah,02 و int 21 و غيره است.
ولي فرض كن شما بخواهيد يك خط وسط خطها اضافه كني. مجبوري همه را از اول بنويسي. چون نميشه اينتر كرد و وسطش نوشت . با اضافه كردن يك خط شماره خط ها همه عوض ميشه و بايد برنامه از اول بازسازي بشه.كپي پيست نداريد در اين حالت . و فقط بايد فايل com بسازيد.
البته من خودم علاقه دارم در ديباگ كار كنم چون كار ملموسه ولي اين شماره خطها نمي گذارد وقتي برنامه بزرگ بشه.
در اديتور همه اين كارها را مي شود كرد. ولي كدهايي كه در اديتور مي نويسيم و كدهايي كه در ديباگ مي نويسيم يكي است.
فقط يك سري راهنما مي گذاريم اول و آخر كدها براي راهنمايي كامپايلر. اون قالب را اگر خواستيد براتون مي فرستم. همه جا هم پيدا ميشه.
يك راه ديگه اينه كه يك asm وسط برنامه سي بنويسيد و شروع كنيد به نوشتن اسمبلي.سينتكس را در هاردم دارم خواستيد بگيد بفرستم. شايد اين راه ساده تر باشه.
راههاي مختلفي هست.
يكسري اموليتور هم هست كه شبيه سازي مي كند رجيسترها و پشته را كه مثل ديباگ مي كنه محيط را و از نظر بعد آموزشي خيلي خوبه. ولي برخلاف ديباگ ويندوزي است محيط. و دلچسب تره كار. اگر خواستيد بگيد كمك كنم براي پيدا كردنشان. الان لينكي ندارم.
برنامه هايي كه گفتيد هم دارم ولي باهاشون كار نكرده ام. اگر خواستيد بگوييد باهاشون ور بروم شايد به جايي برسم. چون نياز نبوده هايشان كرده ام.
خلاصه راههاي مختلفي وجود داره براي كار . انتخاب كنيد تا من هم همراه شما بيام جلو.
كتاب مزيدي راهم تعريفش را زياد شنيده ام. اگر شد توضيحاتش را نقل كنيد تا اگر توانستم توضيح بدهم.
موفق باشيد.
 
آخرین ویرایش:

saalek110

Well-Known Member
جناب Old User در پست 20 یک سری سورس اسمبلی گذاشتند که اگر دوست داشتید دانلود کنید.

----------------------------------------------
من(سالک) قبلا يك آموزش اسمبلي در يك سايتي داشتم كه کار در محیط دیباگ است.
در این وبلاگ:
http://7soft.blogsky.com/?PostID=53
نقل شده.
باز من نقل می کنم.
توجه کنید کار در دیباگ فرق داره با نوشتن کدها در ادیتور و با tasm و link تبدیل کردن.
من یک فایل از این آدرس :
http://debug.persiangig.com/debug.ppt
دانلود کردم که کار با دیباگ است.

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

پسوند فایل اصلی ppt است.

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

saalek110

Well-Known Member
چاپ
DOS دستورالعملی دارد به نام
INT

ابتدا AX را 200 کنید و DX را 41 ما با
INT 21
کار خواهیم کرد. که کد آن
CD21

است. این دو کد را در 100 و 101 قرار دهید. (با همان دستور E 100 INTER) در 102 و 103 هم
CD20
یعنی

INT 20

را قرار می دهیم.
حال برای اجرا بجای T از G استفاده می کنیم چون اینت 21 یک زیربرنامه از DOS را اجرا می کند و با T به آن زیر برنامه نمی تواند برود. قبل زدن G بایستی مطمئن شوید که IP 100 باشد. که البته اگر اجرا را نزده باشید و DEBUG جدید باز شده باشد همان 100 است. بعد اجرا با ((G)) برخلاف ((T)) ، ((IP به حالت اول برمی گردد. یعنی خودش 100 می شود. دستور INT 20 باعث اختتام برنامه در آن قسمت است وگرنه پردازش گر روی ((Ram)) همین طور جلو می رود و کدهایی را اجرا می کند که باعث خطا می شود. بعد آنکه
AX=0200

DX=0041
& 100 , 101 , 102 , 103 = CD 21 CD 20

IP=100

========

G INTER

A

PROGRAM TERMINATE NORMALLY
در اینجا بدون تنظیم مجدد IP می توانید کار را تکرار کنید. یعنی:
G INTER

A

PROGRAM TERMINATE NORMALLY
 

saalek110

Well-Known Member
ادامه چاپ
چاپ حرف (( A )) و اتمام برنامه.
----------------------------------
توضیح برنامه به این شکل است که وقتی AH برابر 2
باشد ، INT21 به سراغ DL ( یعنی 41 که بایت پایین DX است) می رود. 41 رمز حرف A است. و به ترتیب B و C و D تا برسیم به X .
=========================
دستور لیست: (برای دیدن دستورات به شکل پشت سر هم به جای دستور R اینتر که فقط یک دستور را نشان می داد(

U 100 INTER

18A0:0100 CD21 INT 21
18A0:0102 CD20 INT 20

18A0:0104 5E POP SI
.............

.............

.............
روشی سریعتر از دستور E برای وارد کردن دستورات:
A 100 INTER

18A0:0100 -
که مستقیما می نویسیم INTN 21 و بعد اینتر کردن می نویسیم INT 20 و اگر بدون نوشتن اینتر کنیم خارج می شویم.

===============================
MOV:

این دستور باعث انتقال اطلاعات از جایی به جایی است. بین ثبات ها(رجیسترها) یا از ((Ram)) به آنها و بالعکس و .... تمرین: با دستور A باعث انتقال DL به AH شوید.
A 100

18A0:0100 MOV AH,DL
این دستور در اینجا یک کپی از DL را در AH قرار می دهد. در اینجا نمی توانید از دستور G برای اجرا استفاده کنید چون این دستور بعد انجام عملیات خود ، دوباره رجیستر ها را به حالت اول برمی گرداند. پس IP را 100 کنید و از دستور T استفاده کنید تا تغیرات رجیسترها را ببینید. حالت دیگر این دستور چنین است:
MOV AH,02
یعنی به جای انتقال مستقیما عددی را در یک ثبات قرار می دهد. ------------------------------- تمرین: با دستور A فرمانهای زیر را وارد کنید:
A 100 INTER

MOV AH,02

MOV DL,2A

INT 21

INT 20

اعداد را که بعد (( A 100 INTER)) میاید را من دیگر نمی نویسم. می توانید با ((Uو 100 اینتر )) بازبینی و چک کنید که درست نوشته اید یا نه. قبل از اجرا IP را 100 کنید. بعد با ((G)) اجرا کنید. خواهید داشت:

G INTER

*

PROGRAM TERMINATE NORMALLY
یک ستاره چاپ شده. پس کد (( 2A )) مختص علامت ستاره است.

بخش بعدی ذخیره فایل خود روی هارد است
 

saalek110

Well-Known Member
ذخیره فایل روی هارد
ما در اینجا می خواهیم برنامه نوشته شده خود را روی Hard ذخیره کنیم.
فایل ما به صورت ((کام)) .com ذخیره می شود.
ابتدا نام گذاری فایل:


N Saalek.com ----- Inter

این دستور نام برنامه را مشخص می کند و هنوز روی دیسک ذخیره نشده است.
سپس باید حجم فایل را مشخص سازیم. که بر حسب بایت است.
برای پیدا کردن طول بایتهای فایل ببینید تا کدام شماره حافظه برنامه نوشته اید.
می توانید با دستور ((h)) که دو عدد ابتدا و انتها حافظه ها را به آن می دهید ، طول رشته خود را بیابید.
این دستور هم مجموع دو عدد را می دهد و هم تفاضل را . اولی مجموع است دومی تفاضل. که ما تفاضل را می خواهیم.


H 108 100 ----inter

0208 0008

-

0008


یعنی طول فایل ما . در برنامه ای که بالا نوشتیم و یک ستاره برای ما چاپ کرد ، ما 4 دستور داشتیم که هر دستور 2 بایت را اشغال کرده بود. 2 ضرب در 4 می شود 8.
ولی همه دستورات 2 بایتی نیست. یک بایتی هم داریم. 3 بایتی یا بیشتر هم داریم. پس از دستور تفریق استفاده کنید.
تجربه شخصی من می گوید که اگر بیش از مقدار ذخیره کنیم فرقی نمی کند. چون برنامه موقع اجرا وقتی به دستور خاتمه برسد ، خودش اجرا را خاتمه می دهد. که دستور خاتمه در برنامه چاپ ستاره همان Int 20 بود.
حال که عدد 8 را داریم آن را باید در Cx ذخیره کنیم. اگر عدد خیلی بزرگ بود که اینجا نیست ، بقیه اش را در Bx ذخیره می کنیم. به بیان دیگر بایت بالا در Bx و بایت پایین در Cx.
R Cx Inter.
چون بایت بالای طول برنامه را کامپیوتر از Bx پیدا می کند ، آن را صفر کنید .
حال از ابتدا مراحل نوشتن فایل و ذخیره را مرور می کنیم.
ولی یک کار را قبلش اگر انجام دهید بهتر است. با Search برنامه Debug را پیدا کنید. معمولا در پوشه ویندوز یک نسخه وجود دارد ولی اسم پوشه داخلی را با Search بیابید. بعد یک کپی از آن بگیرید و جایی که راحتتید قرار دهید. مثلا (( My Document)).
چون با این کار موقع ذخیره فایل شما کنار برنامه Debug قرار خواهد گرفت و بی نظمی ایجاد نمی شود. بعد تولید می توانید فایل خویش را هر جا ببرید و با کلیک روی آن اجرا می شود .



A 100 ----inter

Mov Ah,02

Mov Dl,2a

Int 21

Int 20

N Saalek.com ---inter
R Cx Inter
0008 Inter
R Bx Inter
0000 Inter
W Inter


با دستور W فایل روی Hard ثبت می شود.
 

saalek110

Well-Known Member
Loop
حلقه در اسمبلی
برنامه چاپ ستاره را مقداری تغییر می دهیم و یک حلقه می سازیم.


A 100
MOV CX,0A
MOV AH,02
MOV DL,2A
INT 21
LOOP 107
INT 20

در این برنامه ابتدا CX به 10 ( 0A در مبنای 16) تنظیم شده. بقیه برنامه شبیه همان برنامه چاپ ستاره است تا می رسیم به دستور ((LOOP)) که سازنده حلقه است. بر خلاف انتظار تا ابد نمی چرخد بلکه با هر چرخش یکی از CX کم می کند تا آنرا صفر کند آ،گاه حلقه متوقف می شود. پس از اجرا با G داریم:

**********
یعنی 10 بار حرف ستاره را چاپ می کند.
توجه کنید که LOOP به محل قرار گرفتن INT 21 اشاره می کند. چون INT 21 است که دستور چاپ را انجام می دهد. البته وقتی که AH و DL درست تنظیم باشند. که در اینجا تنظیم این دو ثابت باقی خواهد ماند.
 

saalek110

Well-Known Member
فلاگها در اسمبلی
فلاگ حمل

AX=FFFF BX=1000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=375b ES=375b SS=375b CS=375b IP=0100 NV UP DI PL NZ NA PO NC
375b:0100 01d8 ADD AX,BX

قسمت حروف انگلیسی دو حرفی فلاگها هستند. آخرین آنها را در نظر بگیرید. (( NC)) .
حال به ترتیب زیر عمل کنید:
AX را با دستور (( R AX)) مساوی:
FFFF قرار دهید. و BX را 1000حال با دستور A 100 حافظه 100 را

ADD AX,BX
قرار دهید.
IP را 100 کنید و بعد با دستور T این عمل جمع را انجام دهید.
با R نتیجه جمع را ببینید. می بینید که AX برابر
0FFF شده. ده بر یک کجا رفته؟ به فلاگ مورد نظر. و حالا دیگر NC نیست و CY شده.


AX=0FFF BX=1000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=375b ES=375b SS=375b CS=375b IP=0102 NV UP DI PL NZ NA PO CY
375b:0102 004F01 ADD [BX+01],CL

این فلاگ دو حالت دارد یا 1 است یا صفر.
--------------------------------------------------

حال AX و BX را صفر کنید و در حافظه 100 بنویسید:

ADC AX,BX

(( IP را 100 کنید و اجرا ( با T) کنید. خواهید دید که AX یک خواهد شد در صورتی که جمع دو عدد صفر یعنی AX و BX باید صفر شود. این به خاطر این است که ده بر یک که از قبل در فلاگ نقل مانده بود اضافه شده.
پس دستور ADC مثل (( ADD )) است فقط فرقش این است که ده بر یک را هم محاسبه می کند. و همچنین خواهید دید که دوباره فلاگ نقل خالی می شود.(( NC)) می شود.

این کار را به جای ADC با ADD انجام دهید. آیا فلاگ را صفر می کند؟ آیا آن را تاثیر می دهد؟

یعنی به AX اضافه می کند؟
اگر نه پس یعنی آن را نابود کرده؟
 

saalek110

Well-Known Member
فلاگها در اسمبلی
فلاگ صفر
Ax و Bx هر دو را 2222 قرار دهید و دستور زیر را در 100 قرار دهید.
Sub Ax,bx
این دستور تفریق انجام می دهد.

(( R )) را بزنید و اینتر کنید تا وضعیت فلاگها را ببینید.
Ip را 100 کرده و دستور T را اجرا کنید.
دوباره فلاگها را نگاه کنید. یکی از فلاگها حالا (( Zr )) شده.
فرقی نمی کند که قبلا چه بوده. هر چه بوده حالا Zr شده. Z اول کلمه Zero به معنی صفر است و نشان می دهد که نتیجه محاسبه صفر است.
 

saalek110

Well-Known Member
زیر برنامه در اسمبلی

Call - Ret


در حافظه 300 دستورات زیر را وارد کنید. :


Mov Ah,02
Mov Dl,2a
Int 21
Ret


در حافظه 100 وارد کنید :


Call 300
Int 20


برنامه را اجرا کنید.
باز ستاره چاپ می شود.
همان طور که مشخص است ما برنامه ای را از جایی فراخواندهیم.
دستور Call باعث فراخوانی یک زیر برنامه شده که در 300 قرار داشته. دستور (( Ret )) باعث بازگشت به دستور بعدی Call است. دستور بعد از Call هم برای پایان برنامه است.
یک نکته راجع به ذخیره این فایل: بایستی حجم را طوری بگیرید که زیر مجموعه را هم پوشش دهد. ( تا آخر Ret )
 

saalek110

Well-Known Member
Jump
دستور پرش
برنامه چاپ ستاره یعنی :


MOV AH,02
MOV DL,2A
INT 21
INT 20

را وارد کنید. ولی این بار نه در حافظه 100 بلکه در حافظه 200
با دستور :


A 200 INTER

حال در حافظه شماره 100 وارد کنید:


JMP 200


در اینجا برنامه آماده اجراست فقط ابتدا IP را 100 کنید و بعد با دستور G برنامه را اجرا کنید. نتیجه اجرا همان چاپ ستاره است. چون دستور پرش باعث رفتن به خط 200 شده و برنامه در آنجا اجرا می شود و با INT 20 خاتمه می یابد.
 

saalek110

Well-Known Member
شیفت و چرخش
Shift & Rotate

شیفت و چرخش

Ax را مساوی 5000 کنید. (این عدد در مبنای 16 است. بیتها در مبنای 2)


0101/0000/0000/0000

در حافظه 100 بنویسید:


Shr Ax,1

این دستور یعنی تمام بیتهای Ax را 1 خانه به سمت راست منتقل کن.
در این حالت راست ترین بیت بیرون می افتد و چپ ترین صفر می شود.
(( Ip را 100 کنید و با T این تک دستور را اجرا کنید. بعد اجرای دستور Ax می شود: 2800


0010/1000/0000/0000

=============================

اگر باز Ip را 100 کنید و T را بزنید ، Ax می شود:
1400 در مبنای 16 یا


0001/0100/0000/0000

و بعد:
0a00 می شود در مبنای 16 یا


0000/1010/0000/0000

و بعد 0500 مبنای 16 یا


0000/0101/0000/0000

========================
بعد 4 شیفت 5000 تبدیل شده به 0500
هر شیفت به راست در حقیقت تقسیم به 2 است. و 4 شیفت تقسیم به 16 محسوب می شود.
وقتی یک عدد مبنای 16 به 16 تقسیم شود ، همین حالتی رخ می دهد که الان دیدیم.
مثلا


Cd49

می شود


Ocd4

=======================
در کامپیوترهای جدیدتر به جای 4 بار شیفت می شود این کار را به یک باره انجام داد:


Mov Cl,04
Shr Ax,cl

در این برنامه ابتدا Cl را مساوی 4 قرار دادیم و بعد به اندازه Cl یعنی 4 واحد شیفت دادیم. مستقیما من 4 را جلوی Ax گذاشتم ، قبول نکرد.
این دو خط برنامه را شاید بعدا نیاز پیدا کنیم. این قسمت را زیاد توضیح دادم تا وقتی آنجا استفاده کردیم با بقیه دستورات پیچیده نشود.


شیفت به چپ هم داریم. (( Shl)) . در اینجا هم سمت چپی ها بیرون میروند و جای سمت راستی ها با صفر پر می شود.
===========================
2 دستور دیگر داریم شبیه این 2 که همین کار را انجام می دهند ولی آن که بیرون میافتد داخل یکی از فلاگها می رود و فلاگ هم از آنطرف دوباره وارد انتهای مخالف Register می شود. یعنی با کمک آن فلاگ یک چرخش انجام می شود. چرخش به راست داریم و چرخش به چپ.
امیدوارم از این بخش کاملا ماهیت بیت بیت بودن رجیسترها را درک کرده باشید زیرا خیلی دستورات با کل رجیسترها کار نمی کنند (مثل دستور جمع) بلکه با بیتهای منفرد آن کار می کنند.
مثلا یک دستور داریم که بیتهای خاصی از رجیستری را به ترتیب در فلاگها پر می کند.
 

saalek110

Well-Known Member
آدرس دهی حافظه
CS & IP

اول ببینید CS در کامپیوتر شما روی چند تنظیم است. . چون با کامپیوتر من حتما فرق دارد دیدن با R INTER حال وارد کنید:

در دستورات زیر هر جا CS دیدید عدد آن را که با وارد کنید.



A 100 INTER

cs:0100 MOV AH,02 INTER
cs:0102 INTER
-


بعد با دستور U آن را ردیابی کنید:


U 100
cs:0100 MOV AH,02
cs:0102 .........
cs:0104 .........
......................
......................

حال دستور کاملتر A و U را می بینیم:


A CS:0100 INTER

U CS:0100 INTER

یعنی وقتی CS را وارد نمی کنید . کامپیوتر CS پیش فرض را خودش قرار می دهد.
حال اگر بخواهید در قطعه دیگری به جز قطعه پیش فرض بنویسید یا ابتدا با R CS INTER آن را تنظیم کنید یا دستور کامل A را وارد کنید.
=============================
با گفتن این قسمت می خواستم کمی تمرین کنید و بدانید که در قطعه های دیگر هم می شود کد نوشت و بعد هم کامپیوتر را راهنمایی (مثلا با دستور پرش) کردکه به آنجا برود. البته فعلا ما از قطعه خارج نمی شویم.
=============================
یک تمرین دیگر:


A CS:0200 INTER
ADD AX,BX
-

U CS-1:0210 INTER
CS-1:0210 ADD AX,BX
.........
.........
.........

برای اینکه CS را 1 واحد کم کنید از دستور H کمک بگیرید.


H CS 1
CS+1 CS-1

در اینجا هم عدد CS را وارد کنید نه این دو حرف انگلیسی را.
در حقیقت اتفاقی که افتاده این است که ما کد را جایی ذخیره کردیم ولی با آدرس دیگر آن را یافتیم.
!!!!!!!!!!!!!!! چرا چنین است؟‍‍‍‍!!!!!!!
تکرارش هم ممکن است.


U CS-2:0220
CS-2:0220 ADD AX,BX


یک توضیح کمکی:
خانه حافظه 200 را اگر 16 تا جلو برویم می شود خانه 210. یادتان باشد که این اعداد در مبنای 16 است.


آیا حالا می توانید جواب سئوال را بدهید؟
!!!!!!!!!!!!!!! چرا چنین است؟‍‍‍‍!!!!!!!

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


علت این نوع آدرس دهی را یکی از دوستان در پایین فرموده اند.. ملاحظه بفرمایید.


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

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


آدرس کد از CS و IP استخراج می شود. یعنی CPU به این دو نگاه می کند تا بداند باید کجای حافظه برود و آن را اجرا کند.
به بیان دقیق تر بایستی بگوییم که CPU برای محاسبه آدرس ، ابتدا CS را در 16 ضرب می کند و آن را با IP جمع می کند و هر عددی حاصل شد ، به آنجا می رود و آن دستور را اجرا می کند
 

saalek110

Well-Known Member
نجشنبه 26 آبان ماه سال 1384
stack
پشته


پشته جایی است که CPU اطلاعاتی را آنجا انبار می کند و بعدا که نیاز شد از آن استفاده می کند.
ما برای استفاده از پشته دستورات خاصی داریم که به آنها حالا می پردازیم:


PUSH

POP
دستور PUSH باعث انتقال به پشته می شود و دستور POP باعث بازیابی می شود.مثلا:

PUSH AX

POP AX
اما چه نیازی به استفاده از پشته است؟
فرض کنید به AX برای عملیات خاصی نیاز داریم ولی نمی خواهیم محتویات فعلا اش از بین برود. بنابراین میاییم آن را PUSH می کنیم و بعد از AX هر استفاده ای خواستیم می کنیم و بعد اتمام کارمان دوباره AX را POP می کنیم .

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

پشته و قطعه :

((SP ))

STACK POINTER

یعنی (( اشاره گر پشته ))


مانند CS و IP در مورد پشته هم SS و SP کاربرد دارد.

SS:SP

نیازی نیست فعلا زیاد با جزئیات کار پشته آشنا شوید چون این کار اتوماتیک صورت می گیرد.
.
فقط باید بدانید که پشته همان طور که از اسمش پیداست. مثل تپه است. یعنی اگر چیزی را (( پوش )) کردید و بعد دومی را. اول بایستی دومی را بردارید تا به اولی برسید. حالت تلنبار شدن روی هم دا
کامپیوتر از انتهای قطعه 64 کیلویی شروع به نوشتن پشته می کند و به طرف پایین میاید. نباید در انتهای قطعه کدنویسی کنید چون پشته را مختل می کند.
و قبل از 100 هم کدنویسی نکنید چون اطلاعات مهمی در آنجاست.
از 100 به بالا تا نزدیکی پشته می توانید بروید.
این در مورد برنامه های COM است . ولی در مورد برنامه های EXE ما از قطعات مختلف استفاده می کنیم.
حتی حالا هم می شود از قطعات مختلف استفاده کرد ولی چون هدف آموزش است برای راحتی دستورات را در یک قطعه تمرین می کنیم

مرجع سایت گفتمان
 

saalek110

Well-Known Member
خوب این قسمت نقل قول تمام شد. در آن تاپیک در سایت گفتمان من بیشتر تاپیک را با Debug کار کرده بودم. و فقط آخرش با ادیتور و tasm و Link کار کردم.
اگر دوست دارید کار با دیباگ ویندوز را یاد بگیرید و نقل های بالا ناقص بود در اینترنت سرچ کنید.
 

saalek110

Well-Known Member
ما دراسمبلي مستقيما به cpu دستور مي دهيم.
يعني دستورات ما دستوراتي صريح است به cpu كه بايد چه كار كند.
مثلا انتقال محتويات يك حافظه به ديگري يا تاثير دادن محتواي دو حافظه با هم (مثلا جمع).

حالا اين حافظه ها كجا هستند؟
يكي همان ram است كه همه مي شناسند.
ديگري رجيسترهاي cpu است.

رجيسترهاي cpu چيست؟
اين ها حافظه هايي داخل خود cpu هستند كه به نوعي دروازه هاي cpu محسوب مي شوند.
يا ميشه بندرگاههاي cpu ناميد كه اينپورت و اكسپورت خود را از آنها تحويل مي گيرد و تحويل مي دهد.

البته حافظه هاي كامپيوتر فقط ram و رجيستر ها نيستند . مثلا پورت ها هم داراي حافظه هايي هستند.

در داخل ram بهتر است از پشته نام ببريم.
بهتره بگوييم كه cpu رويكردش به ram اين طور نيست كه همه آن را يكپارچه ببيند. بلكه آن را قطعه قطعه مي بيند.

در فايلهاي com همه قسمتهاي برنامه در يك قطعه 64 كيلويي قرار دارد. و برنامه هاي com تمام كارهاي خود را در اين قطعه واحد انجام مي دهند. مي دانيد كه برنامه عبارت است از مقداري دستورات اسمبلي(البته در مورد اين فايل com ) . و cpu دستورات را داخل همين قطعه فايل com اجرا مي كند. مثلا وقتي برنامه مي گويد كه چيزي را در پشته قرار بده ، چون پشته فايل com در انتهاي قطعه قرار دارد آنرا آنجا قرار مي دهد. البته فايلها مي توانند به جاهاي ديگر ram هم دست اندازي كنند ولي منظور اين است كه اگر دستور برنامه به طور صريح اعلام نكند به طور ديفالت در همان قطعه كارها انجام مي شود.

در مورد فايلهاي exe ، بسته به نوع آن كه tiny و small و large و huge است قطعه هاي برنامه از قطعات بيشتري استفاده مي كنند.
قطعات مورد نياز يكي همان پشته بود .
يكي قطعه داده.
يكي همان قطعه كد كه دستورات آنجا قرار مي گيرند.

پشته نوعي مخزن است تا چيزهايي را موقتا آنجا نگهداري كنيم. استفاده هاي متنوعي ميشه كرد از پشته و يكي از استفاده هاي اون اينه كه چون تعداد رجيسترهاي cpu كم هستند ميشه چيزي را آنجا گذاشت تا بعدا برداريم. نوعي صندوق امانات است اينجا پشته.
قطعه داده هم مثلا براي نگهداري يك رشته استفاده ميشه. مثلا متغيري به نام name را ميشه از نام خانوادگي پر كرد و در آنجا قرار داد.

با اين مقدمه ميشه دستورات اسمبلي را به دسته هايي تقسيم كرد.
عده اي يك رجيستر را به رجيستر ديگر منتقل مي كنند يا دو رجيستر را بر هم تاثير مي دهند.
عده اي محتواي رجيسرها را به ram و برعكس منتقل مي كنند. مثلا دستور push ax باعث ميشه رجيستر ax برود به پشته . و پشته هم كه داخل ram بود.
دستورات ديگري داريم كه وقفه هاي dos را اجرا مي كنند. اينها را ميشه توابع آماده كاربرد ناميد. وقفه هاي داس و بيوس در قسمتهاي اوليه ram قرار دارند. ميشه براحتي آنها را با نوشتن دستوراتي دست كاري كرد ولي اين كار بايد با داشتن دانش آن انجام شود چون ممكن است باعث اختلال كلي سيستم كامپيوتر شود.

خلاصه بحث:
دستورات اسمبلي مستقيما بر تغيير حافظه ها دستور مي دهند.

يك نكته: وقتي ما براي masm و tasm برنامه مي نويسيم و با آنها برنامه را كامپايل مي كنيم ، فقط راهنماها را كامپايلر براي خودش برداشته و استفاده مي كند و كدهاي اسمبلي ما بي هيچ تغييري به فايل تبديل مي شود. يعني نبايد فكر كنيد كه كدهاي ما دچار تغيير مي شوند. بلكه همان دستورات ما دقيقا دستور به دستور بر cpu توسط برنامه exe ما اعمال مي شوند. حالا راهنماها به كامپايلر چه مي گويند؟ يكي اينكه برنامه ما از چه مدلي است . مثلا small است. كامپايلر با ديدن اين دستور قطعه ها را تنظيم مي كند. و كارهاي ديگر.
شما مي توانيد با ديباگ ويندوز يا برنامه هايي مثل توربو ديباگر برنامه ساخته شده exe خود را ببينيد و با اين كار خواهيد ديد كه دقيقا كدهاي شما بي تغيير داخل برنامه موجود است.
ولي در زباني مثل C هر دستور به دستوراتي از نوع اسمبلي تبديل مي شود
 
وضعیت
موضوع بسته شده است.

جدیدترین ارسال ها

بالا