Форум программистов, компьютерный форум, киберфорум
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/4: Рейтинг темы: голосов - 4, средняя оценка - 4.50
2 / 2 / 1
Регистрация: 25.11.2014
Сообщений: 87

Реализовать вычисление выражения как ассемблерную вставку

15.11.2018, 11:43. Показов 934. Ответов 3

Студворк — интернет-сервис помощи студентам
Есть выражение, вывод которого должен выводиться в консоль как через АСМ, так и С++.
С с++ все понятно, но синтаксис АСМа мне далек. Не могу разобрать с mov'ами. Что куда переносить? Уверен, что там и 1 mov'а хватит и переменная "Y" не нужна, но додуматься как правильно это написать не могу. a*x4 + b*x3 + c*x2 + (d*x)/e

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    int a, x, b, c, d, e, z, y;
    printf("Пример: (a*x^4 + b*x^3 + c*x^2 + (d*x)/e)\n");
    printf("Введите A:\n");
    scanf_s("%i", &a);
    printf("Введите X:\n");
    scanf_s("%i", &x);
    printf("Введите B:\n");
    scanf_s("%i", &b);
    printf("Введите C:\n");
    scanf_s("%i", &c);
    printf("Введите D:\n");
    scanf_s("%i", &d);
    printf("Введите E:\n");
    scanf_s("%i", &e);
    
    z = a*pow(x,4) + b*pow(x,3) + c*pow(x,2) + (d*x) / e;
 
    _asm {
        mov eax, x
            imul eax
            imul eax
            imul eax
        imul a
        mov ebx, x
            imul ebx
            imul ebx
        imul b
        add eax
        mov ecx, x
            imul ecx
        imul c
        add ebx
        mov ebx, d
        imul x
        add ecx
        idiv e
        mov Y, e
    }
 
    printf("Результат (ассемблер): %i\n", Y);
    printf("Результат (c++): %i\n", z);
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.11.2018, 11:43
Ответы с готовыми решениями:

Переписать используя ассемблерную вставку
Есть подпрограмма написанная на С++: void sion(char *&amp;str){ int len = 0; for(;str; len++); for(int j = len - 1; j &gt;= 0; j--){...

Построить гиперболу, используя ассемблерную вставку
в Borland Pascal, используя средства Assembler, нарисовать ветвь гиперболы 1/x, x&gt;0. Рисунок по точкам,но вид должен быть как сплошная...

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

3
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
15.11.2018, 16:22
Умножение выполняется не так. Почитайте о формате imul. Вам, скорее всего подойдёт двухоперандный вариант.
https://www.cyberforum.ru/post5356776.html
0
2 / 2 / 1
Регистрация: 25.11.2014
Сообщений: 87
15.11.2018, 17:14  [ТС]
Все решилось

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <iostream> 
 
int main()
{
    int a, b, c, d, e, x, y, z;
    printf("This program calculate: (a*pow(x, 4) + b*pow(x, 3) + c*pow(x, 2) + (d*x) / e) \n");
    printf("Enter value A:\n");
    scanf_s("%i", &a);
    printf("Enter value B:\n");
    scanf_s("%i", &b);
    printf("Enter value C:\n");
    scanf_s("%i", &c);
    printf("Enter value D:\n");
    scanf_s("%i", &d);
    printf("Enter value E:\n");
    scanf_s("%i", &e);
    printf("Enter value X:\n");
    scanf_s("%i", &x);
    z = a*pow(x,4) + b*pow(x,3) + c*pow(x,2) + (d*x) / e;
 
    _asm
    {
        // a*x^4
        mov eax, x
            imul x
            imul x
            imul x
        imul a
        mov edx, eax
        push edx
 
        // b*x^3
        mov eax, x
            imul x
            imul x
        mul b
 
        // op_1 + op_2
        pop edx
        add eax, edx
        mov edx, eax
        push edx
 
        // c*x^2 
        mov eax, x
            imul x
        mul c
 
        // op_1 + op_2 + op_3
        pop edx
        add eax, edx
        mov edx, eax
        push edx
 
        //(d*x) / e 
        mov eax, x
        imul d
        idiv e
 
        // op_1 + op_2 + op_3 + op_4
        pop edx
        add eax, edx
        mov y, eax
    }
 
    printf("Result on Asm: %i\n", y);
    printf("Result on C++: %i\n", z);
    system("pause");
    return 0;
}
Добавлено через 40 минут
Решил попробовать реализовать через циклы, но они начинают повторяться. Как это можно исправить?

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <cmath>
#include <iostream> 
 
int main()
{
    int a, b, c, d, e, x, z, R;
    printf("This program calculate: (a*pow(x, 4) + b*pow(x, 3) + c*pow(x, 2) + (d*x) / e) \n");
    printf("Enter value A:\n");
    scanf_s("%i", &a);
    printf("Enter value B:\n");
    scanf_s("%i", &b);
    printf("Enter value C:\n");
    scanf_s("%i", &c);
    printf("Enter value D:\n");
    scanf_s("%i", &d);
    printf("Enter value E:\n");
    scanf_s("%i", &e);
    printf("Enter value X:\n");
    scanf_s("%i", &x);
    //z = a*pow(x, 4) + b*pow(x, 3) + c*pow(x, 2) + (d*x) / e; 
    z = a * pow(x, 4) + b * pow(x, 3) + c * pow(x, 2) + (d*x) / e;
 
    _asm
    {
        // a*x^4
        mov eax, x
        mov dx, 3
            Pow_x:
        imul x
            loop Pow_x
        imul a
        mov edx, eax
        push edx
 
        // b*x^3
        mov eax, x
        mov dx, 2
            Pow_xx :
        imul x
            loop Pow_xx
        imul b
 
        // op_1 + op_2
        pop edx
        add eax, edx
        mov edx, eax
        push edx
 
        // c*x^2 
        mov eax, x
        imul x
        mul c
 
        // op_1 + op_2 + op_3
        pop edx
        add eax, edx
        mov edx, eax
 
        //(d*x) / e 
        mov eax, x
        imul d
        idiv e
 
        // op_1 + op_2 + op_3 + op_4
        pop edx
        add eax, edx
        mov R, eax
    }
 
    printf("Result on Asm: %i\n", R);
    printf("Result on C++: %i\n", z);
    system("pause");
    return 0;
}
0
Модератор
Эксперт по электронике
 Аватар для ФедосеевПавел
8655 / 4491 / 1669
Регистрация: 01.02.2015
Сообщений: 13,899
Записей в блоге: 12
15.11.2018, 21:01
loop взаимодействует с регистром ecx. Т.е. перед началом цикла нужно инициализировать ecx.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2018, 21:01
Помогаю со студенческими работами здесь

Написать ассемблерную вставку, реализующую обработку строки
Написать ассемблерную вставку, реализующую обработку строки. Даны 2 строки. Совместить половину строки 1 с половиной строки 2.

Проверка числа на полный квадрат через ассемблерную вставку
Выяснить, является ли полным квадратом натуральное число n. Например, 4 -полный квадрат. Операции деления и извдечения корня нельзя...

Реализуйте вычисление заданного выражения как ассемблерную вставку в программе на языке высшего уровня С++
Я запихнул в С++ ассемблерную вставку. Задание было такое: Тема 2. Массивы. Примечания к заданиям: Реализуйте вычисление...

Вычисление суммы ряда через ассемблерную вставку
Вычислить сумму ряда , используя ассемблерные вставки. Фото вставил внизу! программа должна быть на подобии: program sd; var...

Изменить только тело функции, т.е. создать ассемблерную вставку
Требуется изменить только тело функции, т.е. создать ассемблеровскую вставку. template &lt; class T &gt; inline int dinamic &lt; T...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! */ #include <iostream> #include <stack> #include <cctype>. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru