Определить, есть ли в матрице строка, все числа которой нечетны (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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д