Assembler - язык неограниченных возможностей


Полурезидентные программы - часть 4


; процедура find_string ; выполняет поиск строки от заданного адреса до конца всей общей памяти ; ввод: ES:DI - адрес эталонной строки ; СХ - ее длина ; DS:SI - адрес, с которого начинать поиск ; вывод: CF = 1, если строка не найдена, ; иначе: CF = 0 и DS:SI - адрес, с которого начинается найденная строка find_string proc near push ax push bx push dx ; сохранить регистры do_cmp: mov dx,1000h ; поиск блоками по 1000h (4096 байт) cmp_loop: push di push si push cx repe cmpsb ; сравнить DS:SI со строкой pop cx pop si pop di je found_code ; если совпадение - выйти с CF = 0, inc si ; иначе - увеличить DS:SI на 1, dec dx ; уменьшить счетчик в DX jne cmp_loop ; и, если он не ноль, продолжить ; пройден очередной 4-килобайтный блок sub si,1000h ; уменьшить SI на 1000h mov ax,ds inc ah ; и увеличить DS на 1 mov ds,ax cmp ax,9000h ; если мы добрались до jb do_cmp ; сегментного адреса 9000h - pop dx ; восстановить регистры pop bx pop ax stc ; установить CF = 1 ret ; и выйти ; сюда передается управление, если строка найдена found_code: pop dx ; восстановить регистры pop bx pop ax clc ; установить CF = 0 ret ; и выйти find_string endp

end_of_program: lengtn_of_program = $-start+100h+100h ; длина программы в байтах par_length = length_of_program + 0Fh par_length = par_length/16 ; длина программы в параграфах end start





Начало  Назад  Вперед