همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. بررسی مدهای آدرس دهی را در این بخش از آموزش خواهیم داشت و با سه حالت اصلی آدرس دهی آشنا خواهیم شد. با ادامه ی آموزش ها با ما همراه باشید.
بیش تر دستورالعمل های زبان اسمبلی نیاز به پردازش عملگرها دارد. یک آدرس operand یا عملوند موقعیت مکانی را که داده های پردازش شده در آن ذخیره می شود ، فراهم می کند. بعضی از دستورالعمل ها نیازی به عملوند ندارند ، در حالی که برخی دستورالعمل های دیگر ممکن است به یک ، دو یا سه عملوند نیاز داشته باشند.
هنگامی که یک دستورالعمل به دو عملوند نیاز دارد ، عملوند اول به طور کلی مقصد است که شامل داده هایی در یک رجیستر یا محل حافظه و عملوند دوم منبع است. منبع شامل داده هایی است که باید تحویل داده شود (آدرس دهی فوری) یا آدرس (در ثبات یا حافظه) داده هاست. به طور کلی ، داده های منبع پس از عملیات بدون تغییر باقی می مانند.
سه حالت اصلی آدرس دهی شامل موارد زیر می باشد.
در این حالت آدرس دهی ، یک رجیستر حاوی عملوند است. بسته به دستورالعمل ، رجیستر می تواند اولین عملوند ، دومین عملوند یا هر دو باشد.
مثلا،
1 2 3 | MOV DX, TAX_RATE ; Register in first operand MOV COUNT, CX ; Register in second operand MOV EAX, EBX ; Both the operands are in registers |
از آن جا که پردازش داده ها بین ثبات ها شامل حافظه نیست ، سریع ترین پردازش داده ها را فراهم می کند.
یک عملوند فوری یک مقدار ثابت یا یک عبارت دارد. هنگامی که یک دستورالعمل با دو عملوند، از آدرس دهی فوری استفاده می کند ، اولین عملوند ممکن است یک رجیستری یا یک مکان حافظه باشد و عملوند دوم یک ثابت فوری است. اولین عملوند طول داده را مشخص می کند.
برای مثال،
1 2 3 4 | BYTE_VALUE DB 150 ; A byte value is defined WORD_VALUE DW 300 ; A word value is defined ADD BYTE_VALUE, 65 ; An immediate operand 65 is added MOV AX, 45H ; Immediate constant 45H is transferred to AX |
هنگامی که عملوندها در حالت آدرس دهی حافظه مشخص می شوند ، دسترسی مستقیم به حافظه اصلی ، معمولاً به data segment ، لازم است. این روش آدرس دهی، به پردازش کندتر داده منجر می شود. برای قرار دادن مکان دقیق داده ها در حافظه ، به آدرس segment start نیاز داریم که به طور معمول در ثبات DS و یک مقدار offset وجود دارد. به این مقدار افست آدرس موثر گفته می شود.
در حالت آدرس دهی مستقیم ، مقدار افست مستقیماً به عنوان بخشی از دستورالعمل مشخص می شود که معمولاً با نام متغیر مشخص می شود. اسمبلر مقدار افست را محاسبه می کند و یک جدول symbol را نگه می دارد ، که مقادیر جبران کلیه متغیرهای مورد استفاده در برنامه را ذخیره می کند.
در آدرس دهی مستقیم حافظه ، یکی از عملوندها به یک مکان حافظه و عملوند دیگری به یک ثبات اشاره می کند.
برای مثال،
1 2 | ADD BYTE_VALUE, DL ; Adds the register in the memory location MOV BX, WORD_VALUE ; Operand from the memory is added to register |
در این حالت آدرس دهی از عملگرهای حسابی برای مدیریت آدرس استفاده می شود. به عنوان مثال ، به تعاریف زیر توجه کنید که جداول داده (tables of data) را تعریف می کنند.
1 2 | BYTE_TABLE DB 14, 15, 22, 45 ; Tables of bytes WORD_TABLE DW 134, 345, 564, 123 ; Tables of words |
عملیات زیر به داده ها از جداول موجود در حافظه به رجیستری ها دسترسی پیدا می کند.
1 2 3 4 | MOV CL, BYTE_TABLE[2] ; Gets the 3rd element of the BYTE_TABLE MOV CL, BYTE_TABLE + 2 ; Gets the 3rd element of the BYTE_TABLE MOV CX, WORD_TABLE[3] ; Gets the 4th element of the WORD_TABLE MOV CX, WORD_TABLE + 3 ; Gets the 4th element of the WORD_TABLE |
این حالت آدرس دهی از قابلیت رایانه از آدرس دهی Segment:Offset استفاده می کند. به طور کلی ، ثبات های پایه EBX ، EBP (یا BX ، BP) و رجیسترهای ایندکس (DI ، SI) ، که در براکت های مربعی برای رفرنس های حافظه کدگذاری شده اند ، برای این منظور استفاده می شوند.
آدرس دهی غیر مستقیم به طور کلی برای متغیرهای حاوی چندین عنصر مانند ، آرایه ها استفاده می شود.
قطعه کد زیر نحوه دستیابی به عناصر مختلف متغیر را نشان می دهد.
1 2 3 4 5 | MY_TABLE TIMES 10 DW 0 ; Allocates 10 words (2 bytes) each initialized to 0 MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX MOV [EBX], 110 ; MY_TABLE[0] = 110 ADD EBX, 2 ; EBX = EBX +2 MOV [EBX], 123 ; MY_TABLE[1] = 123 |
با مبحث بررسی مدهای آدرس دهی همراه هستیم.
ما قبلاً از دستورالعمل MOV استفاده کرده ایم که برای انتقال داده ها از یک فضای ذخیره سازی به دیگری استفاده می شود. دستورالعمل MOV دو عملوند دارد.
سینتکس
سینتکس دستورالعمل MOV به شکل زیر است.
1 | MOV destination, source |
دستورالعمل MOV ممکن است یکی از پنج شکل زیر را داشته باشد.
1 2 3 4 5 | MOV register, register MOV register, immediate MOV memory, immediate MOV register, memory MOV memory, register |
لطفاً توجه داشته باشید که:
1 2 | MOV EBX, [MY_TABLE] ; Effective Address of MY_TABLE in EBX MOV [EBX], 110 ; MY_TABLE[0] = 110 |
در این جا مشخص نیست که آیا شما می خواهید معادل بایت یا معادل word از عدد ۱۱۰ را جابه جا کنید. در چنین مواردی ، استفاده از مشخصات type عاقلانه است.
جدول زیر برخی از مشخصات type متداول را نشان می دهد.
Type Specifier | Bytes addressed |
---|---|
BYTE | ۱ |
WORD | ۲ |
DWORD | ۴ |
QWORD | ۸ |
TBYTE | ۱۰ |
برنامه زیر برخی از مفاهیم مورد بحث در بالا را نشان می دهد. نامی را در بخش داده های حافظه “Zara Ali” ذخیره می کند ، سپس مقدار آن را به طور برنامه ای به نام دیگری “Nuha Ali” تغییر می دهد و هر دو نام را نشان می دهد.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | section .text global_start ;must be declared for linker (ld) _start: ;tell linker entry point ;writing the name 'Zara Ali' mov edx,9 ;message length mov ecx, name ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov [name], dword 'Nuha' ; Changed the name to Nuha Ali ;writing the name 'Nuha Ali' mov edx,8 ;message length mov ecx,name ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data name db 'Zara Ali ' |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 | Zara Ali Nuha Ali |
بررسی مدهای آدرس دهی را در این جا به پایان می رسانیم.
متشکریم که با مباحث آموزش زبان اسمبلی (Assembly) با ما همراه هستید. بررسی مدهای آدرس دهی را در این بخش از آموزش زبان اسمبلی (Assembly) دنبال نمودیم و با انواع حالت های آدرس دهی آشنا شدیم. در جلسه ی بعد با بررسی متغیرها (Variables) در خدمتتون خواهیم بود. با وب سایت آموزشی پی وی لرن همراه باشید.