Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 18.11.2016, 18:11   #1
Ярослав777
Пользователь
 
Регистрация: 18.11.2016
Сообщений: 17
По умолчанию - Реализуйте вычисление заданного выражения как ассемблерную вставку в программе на языке высшего уровня ( С++ ). Assembler

- Реализуйте вычисление заданного выражения как ассемблерную вставку в программе на языке высшего уровня ( С++ ).
- Программа на языке высшего уровня должна запрашивать значения переменных и выводить результат на экран.
- Все переменные (X, Y) являются целочисленными.
- A, B – массивы.
- Если у массива указан один индекс, значит он одномерный, если два – двумерный.
- Индекс i=1..3.

знак суммы (|Ai|) * X + знак суммы (Bi) * Y

Заранее спасибо




#include "stdafx.h"
#include <cstdio>
#include <conio.h>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])


{
int a, b, x, y, Result;
a = 0;
b = 0;
x = 1;
y = 2;

Result = 0;

int A[3] = {1,2,3};
int Acount = 3;
int B[3] = {1,2,3};
int Bcount = 3;

_asm {


xor eax, eax
mov ecx, Acount //добавляем в счетчик длину массива
lea esi, A //находим адрес начала массива
Acycle:
mov eax, [esi] //берем значение из массива
mark1: //берем модуль
neg eax //берем модуль числа из массива
js mark1 //берем модуль
add a, eax //считаем суму элементов
add esi, 4 //сдвигаемся по адресу
loop Acycle //тут в переменной а будет сумма
mov eax, a //готовимся умножать a
imul eax, x //a*x
mov a, eax //возвращаем результат в a



xor eax, eax
mov ecx, Bcount //добавляем в счетчик длину массива
lea esi, B //находим адрес начала массива
Bcycle:
mov eax, [esi] //берем значение из массива
mark2: //берем модуль
neg eax //берем модуль числа из массива
js mark2 //берем модуль
add b, eax //считаем суму элементов
add esi, 4 //сдвигаемся по адресу
loop Bcycle //тут в переменной в будет сумма
mov eax, b //готовимся умножать в
imul eax, y //b*y
mov b, eax //возвращаем результат в b



};
printf("C_Result = %d\n", x);
printf("ASM_A = %d\n", a);
printf("ASM_B = %d\n", b);
printf("ASM_Result = %d\n", Result);
return 0;

}

Последний раз редактировалось Ярослав777; 18.11.2016 в 18:40.
Ярослав777 вне форума Ответить с цитированием
Старый 18.11.2016, 23:42   #2
Мановар
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 84
По умолчанию

А проблема собственно в чем?
Мановар вне форума Ответить с цитированием
Старый 19.11.2016, 08:12   #3
Ярослав777
Пользователь
 
Регистрация: 18.11.2016
Сообщений: 17
По умолчанию

Надо поправить код до рабочего, я на 1 курсе заочно, поэтому еще не въехал в тему... Если есть возможность, помогите или укажите где подправить...
Ярослав777 вне форума Ответить с цитированием
Старый 19.11.2016, 11:22   #4
Мановар
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 84
По умолчанию

Код рабочий, все компилируется.
Мановар вне форума Ответить с цитированием
Старый 19.11.2016, 19:54   #5
Ярослав777
Пользователь
 
Регистрация: 18.11.2016
Сообщений: 17
По умолчанию

Прости что отнимаю время, но само решение задачи неверно...
знак суммы (|Ai|) * X + знак суммы (Bi) * Y
Нужно чтобы результат с++, совпадал с ассемблеровским...
Ярослав777 вне форума Ответить с цитированием
Старый 19.11.2016, 20:31   #6
Мановар
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 84
По умолчанию

А где у Вас результат с++, а где ассемблеровский? У Вас только вывод в с (с++ это тяжело назвать), а все вычисления в асме, так что с чем сравнивать здесь тяжело понять. Если Вы имеете ввиду, что Result = 0, то как Вы его обозначили в начале программы нулем, так Вам программа его и выводит нулем. Вы же его нигде потом не изменяете. Как выводите
Цитата:
Сообщение от Ярослав777 Посмотреть сообщение
printf("C_Result = %d\n", x)
так вам и выводится 1, так как обозначили x = 1 в начале.
Объясните грамотно, что Вас не устраивает.
Мановар вне форума Ответить с цитированием
Старый 19.11.2016, 21:35   #7
Ярослав777
Пользователь
 
Регистрация: 18.11.2016
Сообщений: 17
По умолчанию

)))Я и попросил подправить код, чтобы он был отождествлен с
выражением:
знак суммы (|Ai|) * X + знак суммы (Bi) * Y,
я заочник пока времени нет вникать, а зачет уже на носу...
Я подумал, что нас просят написать код, не вдаваясь в подробности, значит он логически прост... Но я, даже C++ не знаю, не говоря об АСМЕ))).
Просто прошу помощи кому не трудно...
Ярослав777 вне форума Ответить с цитированием
Старый 19.11.2016, 21:46   #8
Мановар
Пользователь
 
Регистрация: 13.11.2016
Сообщений: 84
По умолчанию

А код кто тогда писал вышеизложенный?
Мановар вне форума Ответить с цитированием
Старый 19.11.2016, 22:02   #9
Ярослав777
Пользователь
 
Регистрация: 18.11.2016
Сообщений: 17
По умолчанию

Частично я (это где ошибки), остальное взял из готового примера другого варианта...
Ярослав777 вне форума Ответить с цитированием
Старый 19.11.2016, 22:05   #10
Ярослав777
Пользователь
 
Регистрация: 18.11.2016
Сообщений: 17
По умолчанию

Надо сделать еще ввод с клавы...
Ярослав777 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычисление выражения, заданного формулой (помогите найти ошибку в программе) Sonya888 Паскаль, Turbo Pascal, PascalABC.NET 2 19.02.2014 08:31
Выполнить подсчёт выражения в ассемблере вставкой _asm в языке высокого уровня TikTak93 Помощь студентам 12 29.11.2013 14:11
Реализуйте афинную систему подстановок Цезаря. При A=12, B=7. в любой программе программирования.. mariy337 Помощь студентам 2 15.01.2013 21:07
Разработать программы на языке Turbo Pascal для вычисления заданного матричного выражения Aspik18 Помощь студентам 0 26.12.2012 14:59
Assembler(Вычисление значений выражения) Ric Помощь студентам 0 06.04.2012 20:44