Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.03.2011, 22:36   #1
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию Поиск числа по двумерному массиву.

В программе поиска числа по двумерному массиву, что то не так с регистрами esi и ebx. Сама программа работает неправильно. Посмотрел в олли, а там адрес элемента неправильно в eax загружается. Попробовал к esi и ebx прибавлять по 4 (все таки тип данных двойное слово), программа немного другие числа в eax загружала, но все равно не те. Прошу помочь, в чем ошибка?

Код:
.386
.model flat, stdcall
option casemap : none
include\masm32\include\windows.inc
include\masm32\include\kernel32.inc
include\masm32\include\user32.inc
includelib\masm32\lib\kernel32.lib
includelib\masm32\lib\user32.lib
.data
array dd 1,2,3,4,5,6,7,8,9,0; массив
elem dd 3; это искомое число
failed	db	"Нет такого элемента в массиве!",0
success	db	"Такой элемент в массиве присутствует ",0
.data?
foundtime dd ?
.code
start:
xor eax, eax
mov esi, 0
mov ebx, 0
mov ecx, 5
external:; здесь начинается основной цикл
mov eax, array[ebx][esi]
push ecx
mov ecx, 2
mov esi, 0
internal:; здесь начинается вложенный цикл
add esi, 1
cmp eax, elem
je here
loop internal; конец вложенного
here:
jcxz move_next
inc foundtime; инкремент счетчика кол-ва повторов искомого элемента
move_next:
pop ecx
add ebx, 1
loop external; конец основного
cmp foundtime, 0
je not_found
invoke MessageBox, NULL, addr success, NULL, MB_OK; сообщение, если найдено
jmp exit
not_found:; сообщение если не найдено совпадений
invoke MessageBox, NULL, addr failed, NULL, MB_OK
exit:
invoke ExitProcess, NULL
end start

P.S. На счет счетчика повторов foundtime, возможно вы скажите что он здесь ни к чему, потому что я не вывожу количество повторов. Просто не хотел переписывать. Извиняйте.
Ibanez Wizard вне форума Ответить с цитированием
Старый 31.03.2011, 02:12   #2
yuran666666
Форумчанин
 
Аватар для yuran666666
 
Регистрация: 23.04.2009
Сообщений: 346
По умолчанию

Вроде так.. И без этого счетчика не получится - там же по нему проверяется были ли вообще совпадения
Код:
.386
.model flat, stdcall
option casemap : none
include\masm32\include\windows.inc
include\masm32\include\kernel32.inc
include\masm32\include\user32.inc
includelib\masm32\lib\kernel32.lib
includelib\masm32\lib\user32.lib
.data
array dd 1,2,3,4,5,6,7,8,9,0; массив
elem dd 3; это искомое число
failed	db	"Нет такого элемента в массиве!",0
success	db	"Такой элемент в массиве присутствует ",0
.data?
foundtime dd ?
.code
start:
xor ebx,ebx
push sizeof array/(2*4)
pop ecx
external:; здесь начинается основной цикл
push ecx
push 2
pop ecx
lea esi,[array+ebx]
internal:; здесь начинается вложенный цикл
lodsd
cmp eax, elem
je here
loop internal; конец вложенного
here:
jecxz move_next
inc foundtime; инкремент счетчика кол-ва повторов искомого элемента
loop internal; если первый элемент совпал, это не значит, что второй уже не совпадет, если это был второй, то он же и последний
move_next:
pop ecx
add ebx,8
loop external; конец основного
xor eax,eax 
push eax ;аргумент ЭкситПроцесс
push MB_OK
push eax
cmp foundtime,eax
je not_found
push offset success сообщение, если найдено
jmp exit
not_found:; сообщение если не найдено совпадений
push offset failed
exit:
push eax
call MessageBoxA
call ExitProcess
end start
Нет, ну правда..

Последний раз редактировалось yuran666666; 31.03.2011 в 08:36.
yuran666666 вне форума Ответить с цитированием
Старый 31.03.2011, 13:52   #3
Ibanez Wizard
Адский тунеядец
Форумчанин
 
Аватар для Ibanez Wizard
 
Регистрация: 11.06.2010
Сообщений: 164
По умолчанию

Спасибо). Сейчас в отладчике посмотрел вроде работает).
Ibanez Wizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разбить текст на слова и произвести поиск каждого слова по текстовому массиву Burning_brook Microsoft Office Excel 2 22.05.2010 01:56
Помогите решить задачу по двумерному массиву в паскале Tolegg Помощь студентам 1 27.10.2009 23:05
Сформировать одномерный массив равный двумерному семечко Помощь студентам 3 07.10.2009 23:37
Академические задачи по с++ (гдз) Сортировка и поиск совпадений по массиву Andrew#90 Общие вопросы C/C++ 2 10.01.2009 18:44
помогите решить задачу по двумерному массиву Kain Помощь студентам 3 10.11.2008 17:34