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