![]() |
[решено] реализовать вычисление массива: |S(Ai + Bi)| * X + X^2 , i = 0...3
Всем привет, есть задание реализовать вычисление массива: |S(Ai + Bi)| * X + X^2 , i = 0...3
У меня есть решение, объясните пожалуйста часть кода. Код:
int a[3]; |
Gooch, у тебя код и реализует формулу. Прям линейно по действиям. Сначала находит сумму, затем ее умножает на x, затем x квадрат заменяется через обычное умножение и плюсуется к текущей сумме.
|
до меня не доходит заполнение массива :(
int pos,i; \\ ввели целочисленные переменные pos=0; \\ сказали что pos будет 0 int sum=0; \\ почему так? я так понимаю выше мы тоже самое могли сделать? типа int i; int pos=0; или всё таки есть разница? ну вот че то понять не могу заполнение массива: for(i=0;i<3;i++) \\ заполняем массив 3 числами, что означает i++? ну и дальше вообще не доходит :( { pos=i; { sum= sum+(a[pos]+ b[i]); pos++; } } |
|
Цитата:
а что насчет дальше? зачем pos прировняли к i? (a[pos]+ b[i]) что означает данное вырожение? |
в данном случае, оно будет прибавлять пока i будет строго меньше 3
Цитата:
Код:
for(i=0;i<3;i++) здесь реализуется вычисление S(Ai + Bi) |
Цитата:
Цитата:
Код:
int my_assembler(int x) |
Цитата:
начнем с того что если ты не знаешь ассемблера смысла объяснять каждую строчку особого нет, описание команд ты можешь посмотреть и в инете, тут никакого секрета нет, коментари в коде подробные. а вот все что не попало в цитату - это уже чистый си. почему это возможно? все очень просто. любой компьютер ни коем образом не знает что такое си, бэйсики, и даже ассемблер. он знает только машинный код (готовый exe если понятнее). для того чтобы из языка программирования сделать машинный код (компилировать программу) придумали специальные программы - компиляторы. Они то как раз и знают как из строчек кода на языке сделать машинный код. Естественно компилятор понимает только свой конкретный язык программирования, но ассемблер (любой) настолько приближен к машинному коду что все компиляторы тем или иным образом его знают и могут компилировать вместе со своим родным языком. |
вообщем си меня не интересует, что такое компилятор и что такое вставка асемблереная я вкурсе. моя задача решить задание по предмету ассемблер при помощи языка высшего уровня. данная задача это пример решения моего личного задания. хочу понять её решение для того чтоб написать решение своей. в коде сверху, как я уже разобрался, первое решение на языке С, второе на Ассемблере. На данный момент читаю как организовывать массивы в асм.
|
в данной примере массив не организован на ассемблере, я правда в теле мейна не вижу объявления этих массивов но оно там быть должно.
работа с массивом такова что а и b это начальные адреса (ты это знаешь), и они смещаются на регистр esi как и в си - a[esi] и в цикле этот регистр увеличивается на 4 потому что int обычно занимает 4 байта (но ты же это знаешь). цикл организован ссылкой которая в ассемблере пишется так - some_name: . Цикл первый до тех пор пока ecx не станет больше (JB) 3 , в теле цикла каждый раз идет INC ecx. Вот и вся работа с массивами, которой собственно и нет. а вообще в ассемблере массив выделяется так (как пример) - mas db 10 dup (?), где mas - имя массива, db - размер элемента массива, 10 - количество элементов, 0 - чем заполнить. |
Цитата:
можно выкинуть. Цитата:
Beyound огромное спасибо, немного помог мне, до меня что то доходить начало. Был бы очень рад если бы дальше мне помог :) Цитата:
Код:
cycle_i: \\ : поставили метку начала цикла |
у тебя есть пару недочетов
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 бита) - это стандартно. |
Beyound, а вот моё задание: |S(Ai)*X+S(Bi)*Y|
Код:
int sum1=0; |
если чесно я немного непонимаю как тут операция с массивом идет, не хватает впереди выражения математического знака... или даже двух) вполне возможно что твой вариант верен) по крайней мере ошибок в нем нет
|
Цитата:
Код:
int sum1=0; Цитата:
Объясни пожалуйста а когда я закончил асемблерную вставку и пишу return к чему возврат мне надо указывать? к переменной в которой содержится ответ? |
ага
|
щас проверил и всё замечательно работает! Огромное спасибо!
|
Время: 01:42. |
Время: 01:42.
© OSzone.net 2001-