همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. اعداد در زبان اسمبلی (Assembly) را مورد بررسی قرار خواهیم داد.
داده های عددی به طور کلی در سیستم دودویی نمایش داده می شوند. دستورالعمل های حسابی روی داده های باینری عمل می کنند. وقتی اعداد روی صفحه نمایش داده می شوند یا از صفحه کلید وارد می شوند ، به شکل ASCII هستند.
قبلا، داده های ورودی در فرم ASCII را برای محاسبات حسابی به باینری تبدیل کرده ایم و نتیجه را نیز به دودویی تبدیل کرده ایم. کد زیر این را نشان می دهد.
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 | section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov eax,'3' sub eax, '0' mov ebx, '4' sub ebx, '0' add eax, ebx add eax, '0' mov [sum], eax 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,sum 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 sum is:", 0xA,0xD len equ $ - msg segment .bss sum resb 1 |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 | The sum is: 7 |
با این وجود ، این تبدیل ها دارای سربار هستند و برنامه نویسی زبان اسمبلی اجازه می دهد تا اعداد را به شیوه ای کارآمدتر ، به شکل دودویی پردازش کنید. اعداد دهدهی را می توان به دو شکل نشان داد.
در نمایش ASCII ، اعداد دهدهی به عنوان رشته ای از کاراکترهای ASCII ذخیره می شوند. به عنوان مثال ، مقدار دهدهی ۱۲۳۴ به صورت زیر ذخیره می شود.
1 | 31 32 33 34H |
که ۳۱H مقدار ASCII برای ۱ است ، ۳۲H مقدار ASCII برای ۲ است و غیره. چهار دستورالعمل برای پردازش اعداد در نمایش ASCII وجود دارد.
مثال زیر از دستورالعمل AAS برای نشان دادن مفهوم استفاده می کند.
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 | Live Demo section .text global _start ;must be declared for using gcc _start: ;tell linker entry point sub ah, ah mov al, '9' sub al, '3' aas or al, 30h mov [res], ax mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov edx,1 ;message length mov ecx,res ;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 msg db 'The Result is:',0xa len equ $ - msg section .bss res resb 1 |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 | The Result is: 6 |
دو نوع نمایش BCD وجود دارد.
در نمایش BCD بسته بندی نشده ، هر بایت معادل دودویی یک رقم دسیمال را ذخیره می کند. به عنوان مثال ، اعداد ۱۲۳۴ به صورت زیر ذخیره می شود.
1 | 01 02 03 04H |
برای پردازش این اعداد دو دستورالعمل وجود دارد.
چهار دستورالعمل تنظیم اسکی ، AAA ، AAS ، AAM و AAD نیز با نمایش BCD بسته بندی نشده (Unpacked BCD) قابل استفاده هستند. در نمایش BCD بسته بندی شده ، هر رقم با استفاده از چهار بیت ذخیره می شود. دو رقم دهدهی در یک بایت بسته بندی می شوند. به عنوان مثال ، اعداد ۱۲۳۴ به صورت زیر ذخیره می شود.
1 | 12 34H |
برای پردازش این اعداد دو دستورالعمل وجود دارد.
در نمایش BCD بسته بندی شده هیچ پشتیبانی برای ضرب و تقسیم وجود ندارد.
در مثال زیر از مفاهیم فوق استفاده شده است.
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 35 36 37 38 39 40 41 42 | Live Demo section .text global _start ;must be declared for using gcc _start: ;tell linker entry point mov esi, 4 ;pointing to the rightmost digit mov ecx, 5 ;num of digits clc add_loop: mov al, [num1 + esi] adc al, [num2 + esi] aaa pushf or al, 30h popf mov [sum + esi], al dec esi loop add_loop mov edx,len ;message length mov ecx,msg ;message to write mov ebx,1 ;file descriptor (stdout) mov eax,4 ;system call number (sys_write) int 0x80 ;call kernel mov edx,5 ;message length mov ecx,sum ;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 msg db 'The Sum is:',0xa len equ $ - msg num1 db '12345' num2 db '23456' sum db ' |
هنگامی که کد فوق کامپایل و اجرا شد ، نتیجه زیر را ایجاد می کند.
1 2 | The Sum is: 35801 |
اعداد در زبان اسمبلی (Assembly) را در این بخش از آموزش زبان اسمبلی (Assembly) مورد بررسی قرار دادیم. در بخش بعدی به بررسی Strings یا رشته ها می پردازیم.