Здравствуйте, дорогие люди. Есть задание - найти строку (ну просто строка, она не вводится, всего лишь определяется в самой программе). Есть некий (хех) код: Code (Text): .model small .stack 100h .data x db 'hola' .code start: mov ax,@data mov ds,ax xor ax,ax mov BX, 0 ;с чего начинаем mov ES,BX searchin: mov Dx, BX ;помещаем в DI адрес, хранящийся в ES:BX push BX ;помещаем BX в стек lea si, x ;заносим эффективный адрес (смещение) Х в SI lodsb ;извлекаем элемент из SI в AL, меняем значение SI на величину, равную длине элемента cmp Dx, ax ;сравниваем jne enhancin ;если не равно, переход на M1 inc si ;если равно, то увеличиваем SI (переходим на следующий элемент) inc bx ;увеличиваем BX mov Dx,BX lodsb cmp dx,ax jne enhancin inc si inc bx mov Dx, BX lodsb cmp dx,ax jne enhancin inc si inc bx mov Dx, BX lodsb cmp dx,ax jne enhancin enhancin: pop BX ;достаем из стека значение и записываем в BX inc BX ;наращиваем BX cmp BX, 0ffffh ;полон ли BX? jne searchin ;если нет, то переход на asd1 push BX mov BX, ES ;записываем содержимое ES в BS inc BX cmp BX, 0ffffh mov ES, BX pop BX jne searchin mov ax,4c00h int 21h end start насколько я понимаю, код не совсем верен. Можно даже сказать, совсем неверен, вместо поиска, собственно адреса, есть просто инкрементирование содержимого регистров BX & ES. В связи с этим у меня есть несколько вопросов: 1) вот к примеру нашлось у меня совпадение (cmp Dx, ax). Это значит что адрес первой буквы строки будет равен содержимому DX (или АХ). Когда будет второе совпадение, то что нужно сделать? Чтобы получить на выходе адрес строки нужно последовательно складывать, то что мы получаем при совпадениях? Или мы должны записывать это в новый разряды? Просто циферки друг за другом? 2) касательно вывода (нужно его приделать будет). Адрес целиком сразу не получится вывести, так ведь? Т.е. нужно выводить посимвольно? Каким образом нужно будет переходить к последующим символам адреса? Куда-то скидывать после вывода символ из начала строки, затем выводить следующий? Каким прерыванием?
Вот и мы отвечаем - ХЕХ. Полная деградация. Все твои вопросы описаны в учебниках. Э-ле-мен-тар-щи-на. Поздно батенька - Новый год приближается.
Процедура поиска строки в блоке памяти с использованием бинарной маски Code (Text): proc scanmem SRCdata:dword, SRCsize:dword, PTRdata:dword,\ PTRsize:dword, MSKdata:dword push esi edi ebx ecx edx ; Длина паттерна больше длины данных? mov eax,[PTRsize] cmp eax,[SRCsize] ; Да, возврат -1 ja .scanmem_not_found mov esi,[SRCdata] mov edi,[PTRdata] mov edx,[MSKdata] mov ebx,esi add ebx,[SRCsize] sub ebx,[PTRsize] .scanmem_loop: xor ecx,ecx .scanmem_test_char: or edx,edx jz .scanmem_no_mask cmp byte [edx+ecx],0 jz .scanmem_char_equal .scanmem_no_mask: mov al,[esi+ecx] cmp al,[edi+ecx] jne .scanmem_next_pattern .scanmem_char_equal: inc ecx cmp ecx,[PTRsize] jb .scanmem_test_char jmp .scanmem_found .scanmem_next_pattern: inc esi cmp esi,ebx jbe .scanmem_loop .scanmem_not_found: ; Строка не найдена mov eax,-1 jmp .scanmem_ret .scanmem_found: ; Строка найдена mov eax,esi .scanmem_ret: pop edx ecx ebx edi esi ret endp
K10 Бинарная(битовая) маска является значением (которое может храниться в переменной), которое позволяет изолировать определенный набор битов целого типа. Обычно в маске будет бит вы заинтересованы в значение 1, а все остальные биты установлены в 0. Маска затем позволяет изолировать значение бита, очистить все биты, установить все биты или установить новое значение битов. Маски (особенно мульти-битные) часто имеют сдвиг значения, которое необходимо чтобы младший масках бит переместился в младший бит в типе. Например, если использовать 16-битный короткий тип данных, чтобы замаскировать биты 3, 4 и 5 (LSB имеет номер 0). Маска и сдвиг будет выглядеть примерно так: # определяем MASK 0x0038 # определяем SHIFT 3 Если у меня есть переменная, вар, который содержит данные,и соответствующая маска, то я могу выделить биты, так: vаr & MASK Выделить все остальные биты, так уаr & ~ MASK Очистить бит, так vаr & = ~ MASK; Удалить все другие биты, так vаr & = MASK; Установить все биты, так vаr | = MASK; Установить все остальные биты, так vаr | = ~ MASK; Извлечь десятичное значение бита, так (переменная & MASK)>> SHIFT Назначить новое значение бита, так vаr & = ~ MASK; vаr | = (NewValue <<SHIFT) и маски; в данном случае, для поиска задается бинарная(битовая) маска, каждый элемент которой может принимать значения 0, 1 или *. 0 — в этом месте в найденном результате должен быть бит 0. 1 — в этом месте в найденном результате должна быть бит 1. * — в этом месте в найденном результате может быть любой бит. http://www.inetdaemon.com/tutorials/basic_concepts/number_systems/binary/masks.shtml
dessaber Зачем сразу брать ассемблер, если ты даже алгоритм придумать не можешь? А алгоритм-то элементарный. Реши для начала задачу на Си, на массивах. Как поймешь алгоритм - переписывай на ассемблере.