Определить, есть ли в матрице строка, все числа которой нечетны (C++ и ассемблер) - Assembler
Формулировка задачи:
Здравствуйте
Помогите пожалуйста исправить ошибку
Дана матрица, и нужно определить есть ли в ней строка, все числа которой нечетны
Так вот, команда Test всегда определяет первый элемент в первой строке матрицы как четный, даже если он нечетный
В чем может быть проблема?
public _haracterictica
.586
.model flat
.code
_haracterictica proc ;функция near
push ebp
mov ebp,esp ;ebp - указывает на вершину стека
push esi
push ecx
push edi
push ebx
push edx
add ebp,8 ;пропускаем в стеке адрес возврата
mov edi,[ebp] ;адрес матрицы(массив указателей на строки)
mov ecx,[ebp+4] ;размерность
mov ebx,ecx
mov edx,ecx
mov esi,ebp
c2: ;рассматриваем только первую строку матрицы
xor eax,eax
mov eax,[esi] ;помещаем в eax элемент строки массива
test eax,1
jnz nechet ;если нечетный...
jmp c3
nechet: ;...то продолжаем работу
add esi,4
dec edx ;уменьшаем количество нерассмотренных строк
loop c2
c3: ;рассматриваем все оставшиеся строки
mov edx,ebx
dec ebx ;уменьшаем количество нерассмотренных строк
cmp ebx,0 ;если строки кончились...
jnz m1
jmp exit ;...то выходим
m1:
xor ecx,ecx
mov ecx,[ebp+4] ;в ecx количество столбцов в матрице
add edi,4
mov esi,[edi] ;переходим к следующей строке
mov edx,[ebp+4] ;в edx количество столбцов в матрице
c4:
xor eax,eax
mov eax,[esi] ;переходим к следующему элементу в строке
test eax,1 ;проверяем на нечетность
jnz nechet1 ;если нечетный, то продолжаем работу
jmp c3
nechet1:
add esi,4 ;переходим к следующему элементу в строке
dec edx ;уменьшаем счетчик количества элементов в строке
loop c4
exit:
mov eax,edx ;помещаем счетчик в eax(если равен 0, то есть строка, содержащая только нечетные числа)
pop edx
pop ebx
pop edi
pop ecx
pop esi
pop ebp
ret ;возврат данных через регистр eax
_haracterictica endp
endРешение задачи: «Определить, есть ли в матрице строка, все числа которой нечетны (C++ и ассемблер)»
textual
Листинг программы
.386 .model flat, stdcall .stack 4096 ExitProcess proto, dwExitCode:dword .data array dword 4, 4, 4, 13, 33, 51, 344, 3431, 343 .code main proc push 3 push offset array call checkArray invoke ExitProcess, 0 main endp checkArray proc push ebp mov ebp, esp push ecx push esi push edx mov ecx, [ebp + 12] mov esi, [ebp + 8] xor eax, eax L1: push ecx mov ecx, [ebp + 12] L2: mov edx, [esi] add esi, type dword shr edx, 1 jnc L3 loop L2 or eax, 1 pop ecx jmp L4 L3: mov eax, type dword dec ecx mul ecx add esi, eax xor eax, eax pop ecx loop L1 L4: pop edx pop esi pop ecx mov esp, ebp pop ebp ret 8 checkArray endp end main