Kiaoosh Mansoori
Kiaoosh Mansoori
خواندن ۲ دقیقه·۴ سال پیش

سند پروژه متن یاب به زبان ++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 proc

push ebp

mov ebp,esp

push esi

mov esi,[ebp+8] ;Load base string location in memory

mov ecx,[ebp+12] ;Load target character value

xor eax,eax

xor ebx,ebx

start:

lodsw ;Load character from base string

or ax,ax ;Check for end of base string

jz endway

inc ebx ;Increase base string searching location

cmp ax,cx

jz lastpoint

jnz start

lastpoint:

mov eax,ebx

jmp exitdoor

endway:

mov eax, -1

exitdoor:

pop esi

pop ebp

ret

find_char endp

find_string(wchar_t *, wchar_t *, int):

این تابع متن هدف را در متن اصلی پیدا می کند، تمام حروف متن اصلی را با متن هدف بررسی می کند و در اولین مکان وقوع از تابع خارج می شود و نتیجه را بر می گرداند.

محتوای آن به صورت زیر است:

find_string proc

push ebp

mov ebp,esp

push esi

push ebx

push edi

mov edx,[ebp+16] ;Target string's length

or edx,edx

jz notFound

mov esi,[ebp+8] ;Base string starting point

xor eax,eax

xor ecx,ecx

xor edi,edi

;Save position in base string that target string occures

startPoint:

mov ebx,[ebp+12] ;Target string starting point

mov edx,[ebp+16]

;Searching for target string in base string

search:

or edx,edx

jz founded

lodsw ;Load base string to ax, character by character

or ax,ax

jz notFound

add edi,1

mov cx,[ebx] ;Load target string to cx, character to character

dec edx ;Decrease target string by 1, this indecates searching location

add ebx,2 ;Update location for reading new character

cmp ax,cx ;Compare base string character to target string character

jz search

jnz startPoint

;When searching has no results

notFound:

mov eax,-1

jmp exitpoint

;When searching has a result

founded:

mov eax,edi

exitpoint:

pop edi

pop ebx

pop esi

pop ebp

ret

find_string endp

هر دو تابع بالا در صورتی که نتیجه ای پیدا نکنند ، مقدار -1 را باز می گردانند

cAssemblyپروژهآموزش
شاید از این پست‌ها خوشتان بیاید