سند پروژه متن یاب به زبان ++C  و Assembly

نام برنامه نویس : کیانوش منصوریدانشگاه : صدراشرح کاربر :یکی از پر کاربرد ترین توابع در زبان برنامه نویسی را می توان تشخیص کلمات در یک متن نام برد ، این نوع توابع وظیفه پیدا کردن حرف ، کلمه و جمله در یک متن را دارند.این برنامه یک شبیه ساز است از این نوع توابع با هدف پیدا کردن اولین محل حروف درخواستی در متن است که با استفاده از زبان های C++ و Assembly نوشته شده است.شرح عملکرد :بخش اول که آن را میتوان رابط بین کاربر و برنامه نام برد شروع کرد ، این بخش در قالب کنسول است و به زبان C++ نوشته شده است.دلیل استفاده از C++ به جهت توسعه سریع بخش رابط کاربری است.رابط کاربری شامل چهار بخش است :· راهنما : توضیحی کوچک از رفتار برنامه است که به کاربر می گوید اگر در متن ورودی ، حروف هدف پیدا شود آن را با @ جایگزین می کند.· ورودی پایه : از کاربر درخواست می کند تا متن اصلی را که قصد دارد در آن حروفی را پیدا کند ، وارد نماید.· ورود متن(حروف) هدف : این بخش از کاربر رشته ای دریافت می کند تا آن را در متن اصلی پیدا کند.· ورود حرف هدف : دریافت حرفی که کاربر در متن اصلی به دنبال آن است(نوع ساده تر ورودی رشته)· نمایش نتیجه جست و جو حرف : برنامه اگر در متن اصلی حرف هدف را پیدا کند ، آن را با @ جایگزین و کل متن را دوباره چاپ می کند(فقط اولین مکان رویداد)· نمایش نتیجه جست و جو رشته : برنامه اگر در متن اصلی رشته هدف را پیدا کند ، آن را با @ جایگزین و کل متن را دوباره چاپ می کند(فقط اولین مکان رویداد و به تعداد حروف رشته @ جایگزین می کند)برنامه قبل از ارسال ورودی های کاربر به توابع Assembly ، اول باید نوع آن را تغییر دهد ، دلیل این کار این است که زبان C++ کاراکتر و رشته را به حالت خاصی ذخیره میکند که در Assembly غیر قابل فهم است.این تغییر داده فقط شامل تبدیل کاراکتر ها به کد ASCII آن ها است(در C++ به int تبدیل می شوند).توابع رابط کاربری :get_input(string &input) :این تابع وظیفه دریافت ورودی از کاربر را دارد ، خود این تابع شامل یک سری دستورات C++ برای دریافت ورودی است که به منظور تمیزی کد ، در یک تابع آمده است.محتوای آن به صورت زیر است :cout << "Input--";getline(cin, input);return str_to_wchar(input);str_to_wchar(string input):وظیفه این تابع تبدیل کاراکتر ها به کاراکتر نوع C یا تبدیل کاراکتر ها به کد ASCII آن ها است.محتوای آن به صورت زیر است :wchar_t * asmChar = new wchar_t[input.length() + 1];copy(input.begin(), input.end(), asmChar);asmChar[input.length()] = 0;return asmChar;: display_result(int stringOffset, string baseInput, int targetLength = 1)این تابع نتیجه نهایی بررسی را چاپ می کند.متغیر stringOffset مکان اولین رخ داد متنی ، متغیر baseInput متن ورودی اصلی و targetLength هم طول متن هدف است.محتوای آن به صورت زیر است :string marker = "";for (int counter = 0; counter < targetLength; counter++)marker.append("@");baseInput.replace(stringOffset - targetLength, targetLength, marker);cout << baseInput << endl << endl;بخش بعدی ، پردازش متن است ، این بخش با زبان Assembly نوشته شده است.کارکرد این بخش به این صورت است :متون شامل تعداد زیادی از حرف هستند که یعنی یک آرایه پس در اصل نحوه پردازش به این صورت است که در یک آرایه به نام متن اصلی که درآن ترتیب عناصر مهم است ، به دنبال سلسله ای از حروف کنار هم هستیم(مقایسه دو آرایه)توابع بخش پردازش :int find_char(wchar_t * , wchar_t) :این تابع به دنبال حرف هدف در متن اصلی می گردد، به این صورت که حروف متن اصلی را یکی یکی با حرف هدف بررسی می کند و در اولین مکان وقوع از تابع خارج می شود و نتیجه را بر می گرداند.محتوای آن به صورت زیر است:find_char procpush ebpmov ebp,esppush esimov esi,[ebp+8] ;Load base string location in memorymov ecx,[ebp+12] ;Load target character valuexor eax,eaxxor ebx,ebxstart:lodsw ;Load character from base stringor ax,ax ;Check for end of base stringjz endwayinc ebx ;Increase base string searching locationcmp ax,cxjz lastpointjnz startlastpoint:mov eax,ebxjmp exitdoorendway:mov eax, -1exitdoor:pop esipop ebpretfind_char endpfind_string(wchar_t *, wchar_t *, int):این تابع متن هدف را در متن اصلی پیدا می کند، تمام حروف متن اصلی را با متن هدف بررسی می کند و در اولین مکان وقوع از تابع خارج می شود و نتیجه را بر می گرداند.محتوای آن به صورت زیر است:find_string procpush ebpmov ebp,esppush esipush ebxpush edimov edx,[ebp+16] ;Target string's lengthor edx,edxjz notFoundmov esi,[ebp+8] ;Base string starting pointxor eax,eaxxor ecx,ecxxor edi,edi;Save position in base string that target string occuresstartPoint:mov ebx,[ebp+12] ;Target string starting pointmov edx,[ebp+16];Searching for target string in base stringsearch:or edx,edxjz foundedlodsw ;Load base string to ax, character by characteror ax,axjz notFoundadd edi,1mov cx,[ebx] ;Load target string to cx, character to characterdec edx ;Decrease target string by 1, this indecates searching locationadd ebx,2 ;Update location for reading new charactercmp ax,cx ;Compare base string character to target string characterjz searchjnz startPoint;When searching has no resultsnotFound:mov eax,-1jmp exitpoint;When searching has a resultfounded:mov eax,ediexitpoint:pop edipop ebxpop esipop ebpretfind_string endpهر دو تابع بالا در صورتی که نتیجه ای پیدا نکنند ، مقدار -1 را باز می گردانند