Обробка блоків даних в асемблері
Delphi programming
Підписатися на розсилку:
Assembler&Win32. Курс молодого бійця. Урок 12.
Обробка блоків даних
Завантаження та вивантаження даних.Команди lodsb, lodsw, lodsd потрібні, щоб завантажити байт (слово, подвійне слово) з пам'яті, на яку вказує регістр ESI в регістр al,ax або eax. Після надання значення регістру значення регістру ESI збільшується на 1,2 або 4. Ось еквіваленти цих команд
Lodsb Mov al, byte ptr [esi] Inc esi /dec esi Lodsb Mov ax, слово ptr [esi] Add esi, 2h /sub esi, 2h Lodsd Mov eax, dword ptr [esi] Add esi, 4h / sub esi, 4h
Отже, ці команди полегшують нам обробку даних, одразу збільшуючи значення регістру esi для наступної порції даних. Регістр може також зменшуватись залежно від прапора напрямку DF. Якщо він виставлений, то регістр буде зменшуватися, а якщо він скинутий, то регістр esi буде збільшуватися. Абсолютно, протилежне роблять команди stosb, stows та stosd. Вони завантажують регістр al, ax, eax на згадку, яку вказує регістр edi. Зміна регістру edi залежить від того самого прапора напрямку DF.
movsb Mov al, byte ptr [esi] Mov byte ptr [edi], al Inc edi /dec edi Inc esi /dec esi stosw Mov ax, word ptr [esi] Mov word ptr [edi], ax Add edi, 2h /sub edi, 2h Add esi, 2h /sub esi, 2h stosd Mov eax, dword ptr [esi] Mov dword ptr [edi], eax Add edi, 4h / sub edi, 4h Add esi, 4h / sub esi, 4h
Порівняння даних.Команди scasb, scasw і scasd порівнюють вміст регістру al, ax, eax із вмістом пам'яті на яку вказує регістр edi. Зрозуміло зі збільшенням регістру edi. Більш просунуті командиcmpsb, cmpsw, cmpsd порівнюють значення пам'яті, на які вказують регістри esi та edi відповідно. З відповідним зміною регістру прапорів.
Префікс rep.Всі вищеописані команди призначені зручно використовувати у циклах, тобто. при операціях, що повторюються. Префікс rep потрібен для повторення команди обробки блоків кількість разів, яка вказана в регістрі ecx. Приклад:
Mov ecx, 045h Mov edi, 0422310h Mov al, 088h Rep stosb
Після цього пам'ять у діапазоні 0422310h-0422355h буде заповнена значеннями 88h. Для команд cmps* та scas* префікс повторює команду лише доти, доки прапор ZF встановлено. Префікси repe, repz це теж саме. Якщо після чергового виконання команди прапор ZF скинувся, повтори припиняються. Не менш корисний префікс repne, він повторюватиме команду поки прапор ZF скинутий. Якщо після чергового виконання команди прапор ZF встановився, повтори припиняються. Те саме робить префікс repnz.
Str1 db 'qwerty' Str2 db '111111' …… Mov ecx, 06h Mov esi, offset str1 Mov edi, offset str2 Rep movsb
Після всіх цих маніпуляцій дані будуть такими:
Str1 db 'qwerty' Str2 db 'qwerty'
Str1 db 'qwerty' Str2 db 'qwe111' …… Mov ecx, 06h Mov esi, offset str1 Mov edi, offset str2 Rep cmpsb
Це повторення закінчиться 4 кроці при порівнянні 'r' і '1' тобто. при порівнянні r і 1 прапор ZF скинеться і повторення припиниться. Тим самим можна порівнювати два рядки, а після Rep cmpsb перевіряти, чи дорівнює регістр ECX нулю, якщо він дорівнює нулю, то рядки рівні.
Str1 db 'qwerty' Str2 db '1111t1' …… Mov ecx, 06h Mov esi, offset str1 Mov edi, offset str2 Repne cmpsb
Це повторенняприпиниться на 5 кроці у порівнянні 't' і 't' тобто. при їх порівнянні прапор ZF встановиться і повторення припиниться.
Ось і закінчився цей урок. На цьому уроці ми довідалися команди для обробки блоків даних.