Поиск нечетных чисел в 2 массиве - Assembler
Формулировка задачи:
Всем привет, у меня вот такая проблема которую я не могу решить уже 2 дня. Нужно посчитать нечетные числа в каждой строчке и записать их кол-во в одномерный массив. Но вот у меня проблема с частью записи кол-ва нечетных чисел в одномерный массив. Очень прошу помочь, а то голова уже не варит
На си++ это выглядело бы так:
const int ROWS = 2;
const int COLS = 3;
int data1[ROWS][COLS] = { { 7, -1, 11 }, { 3, 4, -5 } };
int result1[ROWS] = {};
for (int i= 0; i<=ROWS-1 ; i++)
for (int j = 0; j<=COLS-1 ;j++)
{
if ( data1[i][j] % 2 ==1 || data1[i][j] % 2 == -1)
{
result1[i] +=1; // эта часть не получается на MASM
}
else // skip
}#include "stdafx.h"
#include <cstdio>
#include <cassert>
// For each grade level variant implement own function, e.g.:
void solution_for_grade_7(const int* arr, size_t arr_rows, size_t arr_cols, int* result)
{
int counter = 0;
int modNumb = 2;
__asm
{
// mov ebx, arr//definition of arr
mov ecx, [arr_rows] // ecx == for(int ROWS = 2;----;----;)
RowLoop:
mov ebx, arr//definition of arr
push ecx //save row loop counter
xor esi, esi
mov ecx, [arr_cols]
ColLoop :
xor edx, edx
mov eax, dword ptr[ebx + esi] // eax = arr[ROWS][n]
idiv[modNumb] // eax = eax mod 2
cmp edx, 0 // (eax mod 2) == 0 ?
je Skip // go to Skip, if true
inc [counter]
Skip:
add esi, 4
loop ColLoop // repeat (for COL=N;------;-----) loop
add ebx, esi //next row
pop ecx //restore RowLoop counter i.e. ecx = 2
//Store counted odd values to result1 array
xor edx, edx
xor eax, eax
mov edx, result
mov eax, [counter]
mov [edx + ecx * 4], eax
mov [counter], 0
loop RowLoop
}
}
const int ROWS = 2;
const int COLS = 3;
int main()
{
// Change the array definitions to be appropriate for your assignments:
int data1[ROWS][COLS] = { { 7, -1, 11 }, { 3, 4, -5 } };
int result1[ROWS] = {}; // Note: for some assignments the result will depend on the number of COLS!
// Change the parameters according to your assignment function, e.g.:
solution_for_grade_7((const int*)data1, ROWS, COLS, result1);
// Print the result one-dimensional array to the console:
for (size_t i = 0; i <= 1; i++)
{
_tprintf(_T("%d "), result1[i]);
}
// :::
getchar();
return 0;
}Решение задачи: «Поиск нечетных чисел в 2 массиве»
textual
Листинг программы
#include "stdafx.h"
#include <cstdio>
#include <cassert>
// For each grade level variant implement own function, e.g.:
void solution_for_grade_7(const int* arr, size_t arr_rows, size_t arr_cols, int* result)
{
int counter = 0; //counter of odd values
int resIndex = 0; //result index
int modNumb = 2;
__asm
{
//col counter
mov ecx, [arr_rows] // ecx == for(int ROWS = 2;----;----;)
mov ebx, [arr]// arr definition
RowLoop:
push ecx //save row loop counter
mov ecx, [arr_cols] // ecx == for(int COLS = 3;----;----;)
xor esi, esi
ColLoop:
xor edx, edx
mov eax, dword ptr[ebx + esi] // eax = arr[ROWS][n]
idiv[modNumb] // eax = eax mod 2
cmp edx, 0 // (eax mod 2) == 0 ?
je Skip // go to Skip, if true
inc [counter] // counter of odd value increasing
Skip:
add esi, 4 // next column
loop ColLoop // repeat (for COL=N;------;-----) loop
xor edx, edx
add ebx, esi //next row offset
mov edi, result //result array definition
mov eax, [counter] // eax == amount of odd values
mov edx, [resIndex] // load result arr index
mov dword ptr[edi + edx*4], eax //load to result amount of odd values
mov [counter], 0 //reset counter
add [resIndex], 1 // next result arr index
pop ecx // next row
loop RowLoop
}
}
const int ROWS = 2;
const int COLS = 3;
int main()
{
// Change the array definitions to be appropriate for your assignments:
int data1[ROWS][COLS] = { { 5, 13, 11 }, { 3, 7, -5 } };
int result1[ROWS]; // Note: for some assignments the result will depend on the number of COLS!
// Change the parameters according to your assignment function, e.g.:
solution_for_grade_7((const int*)data1, ROWS, COLS, result1);
// Print the result one-dimensional array to the console:
for (size_t i = 0; i < ROWS; i++)
{
_tprintf(_T("%d "), result1[i]);
}
getchar();
return 0;
}
Объяснение кода листинга программы
Código a Assembler:
mov ecx, [arr_rows]- Эффективноecxравнымarr_rows, что используется в качестве счетчика для цикла.mov ebx, [arr]- Эффективноebxравнымarr, что используется для доступа к элементам массива.xor esi, esi- Эффективноesiравным 0, что используется в качестве счетчика для столбца.xor edx, edx- Эффективноedxравным 0, что используется для хранения результата операции деления.mov eax, dword ptr[ebx + esi]- Эффективноeaxравнымarr[row][col], гдеrowиcolявляются текущими индексами.idiv[modNumb]- Эффективно делитeaxнаmodNumbс сохранением остатка вedx.cmp edx, 0- Проверяет, равен ли остаток от деленияedxнулю.je Skip- Если остаток от деления равен нулю, переходит к меткеSkip.inc [counter]- Увеличивает счетчик на 1.Skip:- Метка, к которой переходит выполнение, если остаток от деления не равен нулю.add esi, 4- Увеличивает счетчик столбца на 1.loop ColLoop- Переходит к началу циклаColLoop.xor edx, edx- Эффективноedxравным 0, что используется для хранения индекса строки.add ebx, esi- Эффективноebxравнымarr + row, что используется для доступа к следующей строке.mov edi, result- Эффективноediравнымresult, что используется для доступа к результату.mov eax, [counter]- Эффективноeaxравнымcounter, что используется для хранения количества нечетных чисел.mov edx, [resIndex]- ЭффективноedxравнымresIndex, что используется для доступа к индексу результата.mov dword ptr[edi + edx*4], eax- Эффективно записываетeaxвresult[resIndex], увеличиваяresIndexна 1.mov [counter], 0- Сбрасывает счетчик на 0.add [resIndex], 1- УвеличиваетresIndexна 1.pop ecx- Восстанавливает значениеecxперед выходом из функции.loop RowLoop- Переходит к началу циклаRowLoop.