همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. دستورالعمل های محاسباتی در زبان اسمبلی (Assembly) را با بررسی دستورالعمل DIV / IDIV در این بخش نیز ادامه می دهیم.
عملیات تقسیم دو بخش ایجاد می کند – یک مقدار مثبت و باقیمانده. در مورد ضرب ، سرریز اتفاق نمی افتد زیرا از ثبات های double-length برای نگه داری نتیجه استفاده می شود. اما در مورد تقسیم ، ممکن است سرریز اتفاق بیفتد. در صورت بروز سرریز ، پردازنده ایجاد وقفه می کند.
دستورالعمل (DIV (Divide برای داده های بدون علامت استفاده می شود و از (IDIV (Integer Divide برای داده های علامت دار استفاده می شود.
قالب برای انجام دستورالعمل DIV / IDIV به شکل زیر است.
1 | DIV/IDIV divisor |
مقسوم در accumulator است. هر دو دستورالعمل می توانند با عملگرهای ۸ بیتی ، ۱۶ بیتی یا ۳۲ بیتی کار کنند. این عملیات روی هر شش وضعیت flag ها تأثیر می گذارد. در بخش زیر سه مورد تقسیم با اندازه متفاوت عملوند توضیح داده شده است.
ردیف | سناریوها |
---|---|
۱ | وقتی عملوند ۱ بایت (۸ بيتی) است. فرض شده است که مقسوم در ثبات (۱۶ بیتی) AX است. ثبات AX بر عملوند تقسيم می شود. پس از تقسیم ، خارج قسمت به ثبت AL می رود و باقیمانده به ثبات AH می روند. |
۲ | وقتی عملوند ۱ کلمه است. فرض بر این است که مقسوم ۳۲ بیت طول دارد و در ثبات های DX: AX وجود دارد. ۱۶ مرتبه بالا مرتب در DX و ۱۶ بیت با مرتبه پایین در AX قرار دارند. پس از تقسیم ، مقسوم ۱۶ بیتی به ثبات AX می رود و باقیمانده ۱۶ بیتی به رجیستری DX می رود. |
۳ | هنگامی که عملووند دو کلمه باشد. فرض شده است که مقسوم ۶۴ بیت طول دارد و در ثبات های EDX: EAX. ۳۲ بیت مرتبه بالا در EDX و ۳۲ بیت با مرتبه پایین در EAX قرار دارد. پس از تقسیم ، مقسوم ۳۲ بیتی به رجیستری EAX می رود و باقیمانده ۳۲ بیتی به رجیستری EDX می رود. |
دستورالعمل های محاسباتی در زبان اسمبلی را با مثالی ادامه می دهیم.
مثال زیر ۸ را بر ۲ تقسیم می کند. مقسوم ۸ در رجیستری ۱۶ بیتی AX ذخیره می شود و ۲ در ثبات ۸ بیتی BL ذخیره می شود.
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 26 27 28 29 30 31 32 33 34 | Live Demo section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov ax,'8' sub ax, '0' mov bl, '2' sub bl, '0' div bl add ax, '0' mov [res], ax mov ecx,msg mov edx, len mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov ecx,res mov edx, 1 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 msg db "The result is:", 0xA,0xD len equ $- msg segment .bss res resb 1 |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 | The result is: 4 |
دستورالعمل های محاسباتی در زبان اسمبلی را با بررسی دستورالعمل DIV / IDIV ادامه دادیم. در جلسه ی آینده مبحث دستورالعمل های منطقی را خواهیم داشت. با آموزش زبان اسمبلی (Assembly) همراه باشید.