همراهان عزیز وب سایت آموزشی پی وی لرن وقتتون بخیر و شادی، با آموزش زبان برنامه نویسی اسمبلی (Assembly) در خدمتتون خواهیم بود. رشته ها در زبان اسمبلی (Assembly) را در این بخش مورد بررسی قرا خواهیم داد.
طول رشته های متغیر می توانند به اندازه لازم کاراکتر داشته باشند. به طور کلی ، طول رشته را با دو روش مشخص می کنیم.
ما می توانیم طول رشته را با استفاده از نماد $ که نشان دهنده مقدار فعلی کانتر مکان است ، صریحاً ذخیره کنیم. در مثال زیر آورده شده است.
1 2 | msg db 'Hello, world!',0xa ;our dear string len equ $ - msg ;length of our dear string |
اشاره به بایت پس از آخرین کاراکتر متغیر رشته msg. بنابراین ، msg-$ طول رشته را می دهد. ما همچنین می توانیم $ بنویسیم.
1 2 | msg db 'Hello, world!',0xa ;our dear string len equ 13 ;length of our dear string |
از طرف دیگر ، می توانید رشته ها را با یک کاراکتر trailing sentinel ذخیره کنید تا به جای این که طول رشته را صریح ذخیره کنید ، یک رشته را محدود کنید. کاراکتر sentinel باید یک کاراکتر ویژه باشد که در یک رشته ظاهر نمی شود.
به عنوان مثال
1 | message DB 'I am loving it!', 0 |
هر دستورالعمل رشته ممکن است به یک عملوند منبع ، یک عملوند مقصد یا هر دو نیاز داشته باشد. برای سگمنت های ۳۲ بیتی ، دستورالعمل های رشته ای به ترتیب از رجیسترهای ESI و EDI استفاده می کنند برای اشاره به عملوند منبع و مقصد.
با این حال ، برای سگمنت های ۱۶ بیتی ، از رجیسترهای SI و DI به ترتیب برای اشاره به منبع و مقصد استفاده می شود.
پنج دستورالعمل اساسی برای پردازش رشته ها وجود دارد. آن ها شامل موارد زیر هستند.
MOVS – این دستورالعمل ۱ بایت ، Word یا Doubleword از داده را از مکان حافظه به مکان دیگری منتقل می کند.
LODS – این دستورالعمل از حافظه بارگیری می شود. اگر این عملوند یک بایت باشد ، در رجیستر AL بارگیری می شود ، اگر عملوند یک کلمه باشد ، در یک رجیستر AX بارگذاری می شود و یک Doubleword باشد در ثبات EAX بارگذاری می شود.
STOS – این دستورالعمل داده ها را از ثبات (AL ، AX یا EAX) به حافظه ذخیره می کند.
CMPS – این دستورالعمل دو مورد داده را در حافظه مقایسه می کند. داده ها می توانند از نظر اندازه ، کلمه یا doubleword و یا بایت باشند.
SCAS – این دستورالعمل محتویات یک ثبات (AL ، AX یا EAX) را با محتوای یک مورد در حافظه مقایسه می کند.
هر یک از دستورالعمل فوق دارای ورژن بایت ، کلمه و doubleword است و دستورالعمل های رشته را می توان با استفاده از پیشوند تکرار (repetition)، تکرار کرد.
این دستورالعمل ها از جفت ثبات های ES:DI و DS:SI استفاده می كنند ، كه ثبات های DI و SI حاوی آدرس های افست معتبر هستند كه به بایت های ذخیره شده در حافظه اشاره دارد. SI معمولاً با DS (سگمنت داده) همراه است و DI همیشه با ES (سگمنت extra) همراه است.
ثبات های DS: SI (یا ESI) و ES: DI (یا EDI) به ترتیب به عملوندهای منبع و مقصد اشاره دارند. فرض بر این است که عملوند منبع در DS: SI (یا ESI) و عملوند مقصد در ES: DI (یا EDI) در حافظه باشد.
برای آدرس های ۱۶ بیتی ، از رجیسترهای SI و DI استفاده می شود و برای آدرس های ۳۲ بیتی ، از رجیسترهای ESI و EDI استفاده می شود.
در جدول زیر ورژن های مختلفی از دستورالعمل های رشته و فضای فرض شده از عملوندها ارائه شده است.
Basic Instruction | Operands at | Byte Operation | Word Operation | Double word Operation |
---|---|---|---|---|
MOVS | ES:DI, DS:SI | MOVSB | MOVSW | MOVSD |
LODS | AX, DS:SI | LODSB | LODSW | LODSD |
STOS | ES:DI, AX | STOSB | STOSW | STOSD |
CMPS | DS:SI, ES: DI | CMPSB | CMPSW | CMPSD |
SCAS | ES:DI, AX | SCASB | SCASW | SCASD |
پیشوند REP ، هنگامی که قبل از دستورالعمل رشته ای تنظیم شده است ، به عنوان مثال – REP MOVSB ، باعث تکرار دستورالعمل بر اساس کانتر قرار داده شده در ثبات CX می شود. REP دستورالعمل را اجرا می کند ، CX را با ۱ کاهش می دهد و بررسی می کند که آیا CX صفر است. پردازش دستورالعمل را تا CX صفر است تکرار می کند.
(Direction Flag (DF جهت عملیات را تعیین می کند.
از (CLD (Clear Direction Flag, DF = 0 استفاده کنید تا عملیات از چپ به راست انجام شود.
از (STD (Set Direction Flag, DF = 1 استفاده کنید تا عملیات از راست به چپ انجام شود.
پیشوند REP دارای تغییرات زیر است:
REP: این تکرار غیر شرطی است. این عمل را تا صفر CX است تکرار می کند.
REPE یا REPZ: تکرار شرطی است. عمل را تکرار می کند در حالی که فلگ صفر equal/zero را نشان می دهد. آن متوقف می شود وقتی که ZF نشان دهنده equal/zero نیست یا زمانی که CX صفر باشد.
REPNE یا REPNZ: این نیز تکرار شرطی است. این عملیات را تکرار می کند در حالی که فلگ صفر نشان دهنده equal/zero نیست. هنگامی که ZF نشان از equal/zero یا CX به صفر کاهش یافته ، متوقف می شود.
رشته ها در زبان اسمبلی (Assembly) را به پایان می رسانیم.
رشته ها در زبان اسمبلی (Assembly) را در این بخش از آموزش زبان اسمبلی (Assembly) مورد بررسی قرار دادیم. در بخش بعد مبحث آرایه ها را خواهیم داشت. با ما همراه باشید.