همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. دستورالعمل های منطقی زبان اسمبلی (Assembly) را در این بخش از آموزش خواهیم داشت.
مجموعه دستورالعمل پردازشگر، دستورالعمل AND ، OR ، XOR ، TEST و NOT منطقی Boolean را ارائه می دهد ، که بیت ها را مطابق نیاز برنامه تست ، تنظیم می کند.
قالب این دستورالعمل ها به شکل زیر است.
ردیف | دستورالعمل | فرمت |
---|---|---|
۱ | AND | AND operand1, operand2 |
۲ | OR | OR operand1, operand2 |
۳ | XOR | XOR operand1, operand2 |
۴ | TEST | TEST operand1, operand2 |
۵ | NOT | NOT operand1 |
در همه موارد اولین عملوند می تواند در ثبات یا حافظه باشد. عملوند دوم می تواند در ثبات / حافظه یا مقدار فوری (ثابت) باشد. با این حال ، عملکرد memory-to-memory امکان پذیر نیست. این دستورالعمل ها بیت های عملوند را مقایسه یا مطابقت می دهند و فلگ های CF ، OF ، PF ، SF و ZF را تنظیم می کنند.
دستورالعمل AND برای پشتیبانی از عبارات منطقی با انجام عملکرد بیتی و AND استفاده می شود. اگر بیت های مچینگ از هر دو عملوند ۱ باشند ، عملکرد AND بیتی ۱ را برمی گرداند ، در غیر این صورت مقدار ۰ برمی گردد. به عنوان مثال:
1 2 3 4 | Operand1: 0101 Operand2: 0011 ---------------------------- After AND -> Operand1: 0001 |
از روش AND می توان برای صفر کردن یک یا چند بیت استفاده کرد. به عنوان مثال ، ثبات BL حاوی ۱۰۱۰ ۰۰۱۱ است. اگر لازم است بیت های مرتبه بالا را به صفر کنید، AND آن را با ۰FH قرار می دهید.
1 | AND BL, 0FH ; This sets BL to 0000 1010 |
بیایید مثال دیگری بزنیم. اگر می خواهید بررسی کنید که آیا عدد مشخص شده زوج است و یا فرد. اگر این ۱ باشد ، عدد فرد است ، وگر نه عدد زوج است.
با فرض این که عدد در ثبات AL است ، می توانیم بنویسیم:
1 2 | AND AL, 01H ; ANDing with 0000 0001 JZ EVEN_NUMBER |
برنامه زیر این را نشان می دهد.
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 | section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov ax, 8h ;getting 8 in the ax and ax, 1 ;and ax with 1 jz evnn mov eax, 4 ;system call number (sys_write) mov ebx, 1 ;file descriptor (stdout) mov ecx, odd_msg ;message to write mov edx, len2 ;length of message int 0x80 ;call kernel jmp outprog evnn: mov ah, 09h mov eax, 4 ;system call number (sys_write) mov ebx, 1 ;file descriptor (stdout) mov ecx, even_msg ;message to write mov edx, len1 ;length of message int 0x80 ;call kernel outprog: mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .data even_msg db 'Even Number!' ;message showing even number len1 equ $ - even_msg odd_msg db 'Odd Number!' ;message showing odd number len2 equ $ - odd_msg |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 | Even Number! |
مقدار را در ثبات ax با یک رقم فرد تغییر دهید ، مانند:
1 | mov ax, 9h ; getting 9 in the ax |
برنامه نمایش خواهد داد:
1 | Odd Number! |
به طور مشابه برای پاک کردن کل ثبات می توانید آن را با ۰۰H بگذارید.
دستورالعمل OR برای پشتیبانی از عبارات منطقی، با انجام عمل OR بیتی استفاده می شود. اگر بیت های مچینگ از هر یک یا هر دو عملوند یکی باشد ، عملگر OR بیتی ۱ را برمی گرداند. اگر هر دو بیت صفر باشد ۰ برمی گردد.
مثلا،
1 2 3 4 | Operand1: 0101 Operand2: 0011 ---------------------------- After OR -> Operand1: 0111 |
از عملکرد OR می توان برای تنظیم یک یا چند بیت استفاده کرد. به عنوان مثال ، فرض كنید كه ثبات AL حاوی ۱۰۱۰ ۰۰۱۱ باشد ، شما باید چهار بیت مرتبه پایین را تنظیم كنید ، می توانید OR آن را با مقدار ۱۱۱۱ ۰۰۰۰ ، یعنی FH تنظیم كنید.
1 | OR BL, 0FH ; This sets BL to 0011 1111 |
مثال زیر دستورالعمل OR را نشان می دهد. بگذارید مقدار ۵ و ۳ را به ترتیب در ثبات های AL و BL ذخیره کنیم ، سپس دستورالعمل ،
1 | OR AL, BL |
باید ۷ را در ثبات AL ذخیره کنید.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov al, 5 ;getting 5 in the al mov bl, 3 ;getting 3 in the bl or al, bl ;or al and bl registers, result should be 7 add al, byte '0' ;converting decimal to ascii mov [result], al mov eax, 4 mov ebx, 1 mov ecx, result mov edx, 1 int 0x80 outprog: mov eax,1 ;system call number (sys_exit) int 0x80 ;call kernel section .bss result resb 1 |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 | 7 |
دستورالعمل XOR عملیات XOR بیتی را اجرا می کند. عملیات XOR مقدار بیت حاصل را به ۱ تنظیم می کند ، اگر و فقط اگر بیت های مربوط به عملوند متفاوت باشند. اگر بیت های مربوط به عملوندها یکسان باشند (هر دو ۰ یا هر دو ۱) ، بیت حاصل ۰ می شود.
مثلا،
1 2 3 4 | Operand1: 0101 Operand2: 0011 ---------------------------- After XOR -> Operand1: 0110 |
XOR کردن یک عملوند به خودی خود عملوند را به ۰ تغییر می دهد. این برای پاک کردن یک رجیستر استفاده می شود.
1 | XOR EAX, EAX |
دستورالعمل TEST همانند عملیات AND کار می کند ، اما برخلاف دستورالعمل AND ، اولین عملکرد را تغییر نمی دهد. بنابراین ، اگر باید بررسی کنیم که یک عدد در یک رجیستری فرد و یا زوج است ، می توانیم این کار را با استفاده از دستورالعمل TEST بدون تغییر عدد اصلی انجام دهیم.
1 2 | TEST AL, 01H JZ EVEN_NUMBER |
دستورالعمل NOT عملیات NOT بيتي را انجام مي دهد. عملیات NOT ، بیت ها را در یک عملوند معکوس می کند. این عملوند می تواند در یک رجیستر یا در حافظه باشد.
مثلا،
1 2 | Operand1: 0101 0011 After NOT -> Operand1: 1010 1100 |
مبحث بررسی دستورالعمل های منطقی زبان اسمبلی (Assembly) را در این جا به پایان می رسانیم.
دستورالعمل های منطقی زبان اسمبلی (Assembly) را با بررسی دستورالعمل های مختلف مورد بررسی قرار دادیم. در بخش بعدی به بررسی Condition ها می پردازیم. با آموزش زبان اسمبلی (Assembly) همراه باشید.