Имя пользователя:
Пароль:
 | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] реализовать вычисление массива: |S(Ai + Bi)| * X + X^2 , i = 0...3

Ответить
Настройки темы
C/C++ - [решено] реализовать вычисление массива: |S(Ai + Bi)| * X + X^2 , i = 0...3

Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160


Конфигурация

Профиль | Отправить PM | Цитировать


Всем привет, есть задание реализовать вычисление массива: |S(Ai + Bi)| * X + X^2 , i = 0...3

У меня есть решение, объясните пожалуйста часть кода.

Код: Выделить весь код
int a[3];
int b[3];

int my_c(int x)
{
int pos,i;
pos=0;
int sum=0;
for(i=0;i<3;i++)
{
     pos=i;
     {
       sum= sum+(a[pos]+ b[i]);
       pos++;
     }
}
sum=(abs(sum));
sum=(sum*x);
int pow=0;
     pow=x*x;

     sum= sum+pow;
return sum;
}

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 19:49, 09-05-2011

 

Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


Цитата Beyound:
в данной примере массив не организован на ассемблере »
действительно, по заданию его обозначали на С и вводятся значения с клавиатуры. Кусок кода int my_c(int x)
можно выкинуть.

Цитата Beyound:
а вообще в ассемблере массив выделяется так (как пример) - mas db 10 dup (?), где mas - имя массива, db - размер элемента массива, 10 - количество элементов, 0 - чем заполнить. »
вот только такие примеры к сожалению я и нахожу в различных учебниках

Beyound огромное спасибо, немного помог мне, до меня что то доходить начало. Был бы очень рад если бы дальше мне помог

Цитата Beyound:
цикл организован ссылкой которая в ассемблере пишется так - some_name: . Цикл первый до тех пор пока ecx не станет больше (JB) 3 , в теле цикла каждый раз идет INC ecx. »
вот что я понял:
Код: Выделить весь код
           cycle_i:              \\ : поставили метку начала цикла
           MOV eax,a[esi]  \\адрес первого элемента массива а
           MOV edx,b[esi]  \\адрес первого элемента массива b
           ADD esi,4           \\следующий элемент с шагом 4 (т.к. регистр esi имеет размер 4 байта)

           ADD sum, eax     \\ прибаляем к sum содержимое eax
           ADD sum, edx     \\ прибавляем к sum содержимое edx
           INC ecx               \\ увиличение ecx на 1
           CMP ecx, 3          \\ проверяет равен ли ecx 3
           JB cycle_i             \\если ecx < 3 то перейти в начало цикла
Beyound огромнейшее спасибо! очень помог. как заполнять массив я наконец то понял. Щас буду пробывать в своём задании!

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 20:45, 10-05-2011 | #11



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 154
Благодарности: 39

Профиль | Отправить PM | Цитировать


у тебя есть пару недочетов

1. CMP ecx, 3 \\ сравниваем ecx 3, итог сравнения эта коменда нам не показывает а хранит его в регистре
2. JB cycle_i \\ команда раскладывается так J - "если сравнение выдало результат" B (bigger) "больше" то переходм по ссылке cycle_i
3.ADD esi,4 \\прибавляем к текущему значению региста esi число 4. 4 потому что все считается в байтах, а нам нужно сместиться на int который занимает 4 байта (32 бита) - это стандартно.
Это сообщение посчитали полезным следующие участники:

Отправлено: 21:13, 10-05-2011 | #12


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


Beyound, а вот моё задание: |S(Ai)*X+S(Bi)*Y|

Код: Выделить весь код
int sum1=0;
int sum2=0;

___asm
{
mov esi,0
mov ecx,0

cycle_AB:
MOV eax,A[esi]
MOV edx,B[esi]
ADD esi,4
ADD sum1,eax
ADD sum2,edx
INC ecx
CMP ecx,3
JB cycle_AB
MOV eax,sum1
MOV ecx,X
iMUL ecx
MOV sum1,eax
MOV eax,sum2
MOV ecx,Y
iMUL ecx
ADD sum,eax

modyl:
NEG sum
JS modul
}
Правильно ли я его сделал?

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 21:23, 10-05-2011 | #13


Старожил


Сообщения: 154
Благодарности: 39

Профиль | Отправить PM | Цитировать


если чесно я немного непонимаю как тут операция с массивом идет, не хватает впереди выражения математического знака... или даже двух) вполне возможно что твой вариант верен) по крайней мере ошибок в нем нет

Последний раз редактировалось Beyound, 10-05-2011 в 21:48.


Отправлено: 21:37, 10-05-2011 | #14


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


Цитата Beyound:
давай так - я тебе напишу логику, а ты сбацаешь на ассемблере. »
ошибку понял Я сначала так и хотел сделать, но потом почему то подумал, а почему бы не сделать подругому...

Код: Выделить весь код
int sum1=0;
int sum2=0;

___asm
{
mov esi,0
mov ecx,0

cycle_A:
MOV eax,A[esi]
ADD esi,4
ADD sum1,eax
INC ecx
CMP ecx,3
JB cycle_A
MOV eax,sum1
MOV ecx,X
iMUL ecx
MOV sum1,eax

mov esi,0
mov ecx,0
cycle_B:
MOV eax,B[esi]
ADD esi,4
ADD sum2,eax
INC ecx
CMP ecx,3
JB cycle_B
MOV eax,sum2
MOV ecx,Y
iMUL ecx
ADD sum1,eax
modul:
NEG sum1
JS modul
}
Цитата Beyound:
если чесно я немного непонимаю как тут операция с массивом идет, не хватает впереди выражения математического знака... или даже двух) вполне возможно что твой вариант верен) по крайней мере ошибок в нем нет »
ну вот теперь 2 варианта я в первом варианте просто в одном цикле заполнил оба массива без сложения их с друг другом. А так по-моему тоже самое.
Объясни пожалуйста а когда я закончил асемблерную вставку и пишу

return

к чему возврат мне надо указывать? к переменной в которой содержится ответ?

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 21:56, 10-05-2011 | #15


Старожил


Сообщения: 154
Благодарности: 39

Профиль | Отправить PM | Цитировать


ага

Отправлено: 22:10, 10-05-2011 | #16


Аватара для Gooch

Ветеран


Сообщения: 876
Благодарности: 160

Профиль | Отправить PM | Цитировать


щас проверил и всё замечательно работает! Огромное спасибо!

-------
Не забываем жмакать "полезное сообщение"


Отправлено: 22:20, 10-05-2011 | #17



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Программирование и базы данных » C/C++ - [решено] реализовать вычисление массива: |S(Ai + Bi)| * X + X^2 , i = 0...3

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] кто поможет реализовать такое? Cherterok Вебмастеру 3 02-03-2011 10:36
[решено] Как реализовать в скрипте возможность автозаполнения evg64 AutoIt 5 03-10-2009 20:07
[решено] Как реализовать. VistaMizer интегрированная в дистрибутив K.A.V. Автоматическая установка Windows 2000/XP/2003 5 30-09-2009 00:15
[решено] P5K/EPU + RAID как реализовать? svchost Материнские платы и память 4 20-10-2008 16:35
вычисление даты lastdruid Общий по Linux 1 03-03-2007 16:14




 
Переход