Другие языки программирования и технологии
Ассемблер! ! Помогите, пожалуйста с программированием.
Проверить или есть четной сумма нечетных элементов массива. (в ассемблерных вставках V.Studio С++ )
Проверка чётности в ассемблере с помощью деления - это нонсенс.
Не для того его применяют, чтобы переносить все приёмы вычислений из языков высокого уровня.
А упоминание для этих целей арифметического сопроцессора - без комментариев.
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
bool isEvenSumOfOdd(int*, int);
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
srand(static_cast <unsigned> (time(NULL)));
int n = rand() % 81 + 20;
int *a = new int [n];
cout << "Дан массив (" << n << "):" << endl;
for (int i = 0; i < n; i++)
{
a[і] = rand() % 201 - 100;
cout << setw(5) << a[і];
}
cout << endl << endl
<< "Сумма нечётных элементов массива " << (isEvenSumOfOdd(a, n) ? "" : "не") << "чётная";
cin.get();
delete [ ] a;
return 0;
}
bool isEvenSumOfOdd(int* a, int n)
{
bool result = false;
__asm
{
mov esi, a
mov ecx, n
DoLoop:
lodsd
not al
and al, 1
xor result, al
loop DoLoop
}
return result;
}
Неплохо в эту программу было бы добавить проверку, что нечётные элементы в массиве действительно есть.
P.S. Представляю, что однажды одному из любителей определять чётность по остатку от деления придётся писать программу для микроконтроллера.
Для начала ему придётся изрядно поломать голову, чтобы уместить все его деления (кроме множества других операций) в отведённые 8 Кбайт.
И какие же будут проблемы с отладкой, когда за время, отведённое для отпроса состояния 10 датчиков и выдачи управляющих команд 5 исполнительным устройствам, микроконтроллер будет продолжать делить для определения чётности. :D
Не для того его применяют, чтобы переносить все приёмы вычислений из языков высокого уровня.
А упоминание для этих целей арифметического сопроцессора - без комментариев.
#include <iostream>
#include <iomanip>
#include <ctime>
using namespace std;
bool isEvenSumOfOdd(int*, int);
int _tmain(int argc, _TCHAR* argv[])
{
setlocale(LC_ALL, "Russian");
srand(static_cast <unsigned> (time(NULL)));
int n = rand() % 81 + 20;
int *a = new int [n];
cout << "Дан массив (" << n << "):" << endl;
for (int i = 0; i < n; i++)
{
a[і] = rand() % 201 - 100;
cout << setw(5) << a[і];
}
cout << endl << endl
<< "Сумма нечётных элементов массива " << (isEvenSumOfOdd(a, n) ? "" : "не") << "чётная";
cin.get();
delete [ ] a;
return 0;
}
bool isEvenSumOfOdd(int* a, int n)
{
bool result = false;
__asm
{
mov esi, a
mov ecx, n
DoLoop:
lodsd
not al
and al, 1
xor result, al
loop DoLoop
}
return result;
}
Неплохо в эту программу было бы добавить проверку, что нечётные элементы в массиве действительно есть.

P.S. Представляю, что однажды одному из любителей определять чётность по остатку от деления придётся писать программу для микроконтроллера.
Для начала ему придётся изрядно поломать голову, чтобы уместить все его деления (кроме множества других операций) в отведённые 8 Кбайт.
И какие же будут проблемы с отладкой, когда за время, отведённое для отпроса состояния 10 датчиков и выдачи управляющих команд 5 исполнительным устройствам, микроконтроллер будет продолжать делить для определения чётности. :D
Аскар Момынов
Забыла написать, что для определения чётности суммы нечётных элементов не требуется не только проверка чётности каждого элемента, но и само суммирование, что и реализовано в функции isEvenSumOfOdd.
Делишь каждый эл-т массива на 2, проверяешь остаток. Если он не 0, увеличиваешь переменную. В конце эту переменную делишь на 2 и смотришь остаток. Что сложного-то?
Юрий Белов
сложность именно в ассемблере.. (
Алексей Липаткин
Зачем делить, когда можно использовать битовое И?
Немного не понял суть вопроса. Проверить: четная ли сумма нечетных элементов?
Юра Борюк
Если я правильно понял вопрос:
int myArray [10]={23,74,33,22,11,6,14,22,3,9};
bool fEven=0;
__asm
{
//обнуляем индекс. index=0 - первый элемент - нечетный
xor esi,esi
//обнуляем аккумулятор
xor eax,eax
//Цикл сложения нечетных элементов
sum_loop:
/Непосредственно сложение. Можно было воспользоваться мат.процессором, но там больше букав :)
//myArray[index*размер_приемника_в_байтах]
add eax,myArray[esi*4]
//увеличиваем индекс на 2, т.е переходим к следующему нечетному элементу
inc esi
inc esi
//проверяем достигли ли конец массива. Если не достигли, возвращаемся к подсчету суммы
cmp esi,9
jb sum_loop
//результат делим на 2 без остатка и снова умножаем на 2
mov ecx,eax
shr ecx,1
shl ecx,1
//если то, что получили выше = сумме полученной в цикле - сумма четная
cmp eax,ecx
jnz fin_asm
//устанавливаем флаг, если сумма четная
mov fEven,1
fin_asm:
}
if (fEven==true)
{
printf("it is even!");
}
else
{
printf("it is not even!");
}
int myArray [10]={23,74,33,22,11,6,14,22,3,9};
bool fEven=0;
__asm
{
//обнуляем индекс. index=0 - первый элемент - нечетный
xor esi,esi
//обнуляем аккумулятор
xor eax,eax
//Цикл сложения нечетных элементов
sum_loop:
/Непосредственно сложение. Можно было воспользоваться мат.процессором, но там больше букав :)
//myArray[index*размер_приемника_в_байтах]
add eax,myArray[esi*4]
//увеличиваем индекс на 2, т.е переходим к следующему нечетному элементу
inc esi
inc esi
//проверяем достигли ли конец массива. Если не достигли, возвращаемся к подсчету суммы
cmp esi,9
jb sum_loop
//результат делим на 2 без остатка и снова умножаем на 2
mov ecx,eax
shr ecx,1
shl ecx,1
//если то, что получили выше = сумме полученной в цикле - сумма четная
cmp eax,ecx
jnz fin_asm
//устанавливаем флаг, если сумма четная
mov fEven,1
fin_asm:
}
if (fEven==true)
{
printf("it is even!");
}
else
{
printf("it is not even!");
}
Похожие вопросы
- Помогите пожалуйста с программированием БЕЙСИК
- 100 балов Помогите пожалуйста с программированием С++
- Помогите пожалуйста с программированием
- помогите пожалуйста в ПРОГРАММИРОВАНИИ
- помогите пожалуйста по программированию!!!
- Помогите пожалуйста с программированием в паскаль
- Помогите пожалуйста разобраться с вопросами по информатике и программированию
- Лабораторная работа по Ассемблеру (TASM), помогите пожалуйста)
- Помогите пожалуйста решить задачу по программированию. В чем я ошибаюсь?
- Здравствуйте! помогите пожалуйста выполнить зачётные задания по программированию на Pascal