Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/18: Рейтинг темы: голосов - 18, средняя оценка - 4.67
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545

Ассемблер в с++ не работает

18.11.2018, 21:33. Показов 3891. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Уравнение: ( 5x - 10y / 2y ) / ( 6y - 3x / 8*y^2 ).
Выскакивает множество ошибок
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
78
79
80
81
82
83
84
85
86
87
88
#include "stdafx.h"
#include "iostream"
 
using namespace std;
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (LC_ALL,"Russian"); 
 
    int x, y;
 
    int zn1 = 0,   // первый знаменатель
        zn2 = 0,    // второй знаменатель
        y2,        // переменная для хранения y^2
        ch1,         // числитель 1
        ch2,       // числитель 2
        res1 = 0,     // дробь 2
        res2,        // дробь 1
        res;      // ответ
 
    cout << "Введите x: "; cin >> x;
    cout << "Введите y: "; cin >> y;
                                     // 5x - 10y / 2y   :   6y - 3x / 8y^2;
    _asm
    { 
        mov eax, y     // поместили у в eax
        mov ebx, eax     //  сохранили у в регистре ebx
        imul eax, y     // умножили у на у
        mov y2, eax     // поместили y^2 в у2
        add y2, eax      
        add y2, eax
        add y2, eax
        add y2, eax
        add y2, eax
        add y2, eax
        add y2, eax
        mov zn2, y2         // в zn2 поместили 8у^2
        mov eax, ebx      // скопировали у из ebx в eax
        add eax, ebx        // получили 2у
        mov zn1, eax       // поместили 2у в zn1
        add eax, ebx        // получили 3у
        add eax, ebx        // получили 4у
        add eax, ebx        // получили 5у
        add eax, ebx        // получили 6у
        add eax, ebx        // получили 7у
        add eax, ebx        // получили 8у
        add eax, ebx        // получили 9у
        add eax, ebx        // получили 10у
        mov ebx, eax       // сохранили в ebx 10у из eax
        mov eax, x         // поместили в eax значение переменной x
        add eax, x      // получили 2x
        add eax, x          // получили 3x
        add eax, x      // получили 4x
        add eax, x      // получили 5x
        sub eax, ebx     // 5x - 10у
        mov ch1, eax       // скопировали в ch1 значение из eax
        mov eax, y       // поместили в eax значение y 
        mov ebx, eax       // сохранили в ebx значение eax
        add eax, ebx
        add eax, ebx
        add eax, ebx
        add eax, ebx
        add eax, ebx        // получили 6y
        mov ebx, eax          // сохранили в ebx значение из eax
        mov eax, x          // поместили в eax значение x
        add eax, x
        add eax, x        // получили 3x
        sub ebx, eax       // 6y - 3x
        mov ch2, ebx        // скопировали в сh2 значение из ebx
        idiv ch2, zn2    // делим 2 дробь
        mov res2, ch2      // копируем в res2 значение 2 дроби
        idiv ch1, zn1       // делим 1 дробь
        move res1, ch1     // копируем в res1 значение 1 дроби
        idiv res1, res2    //  делим 1 дробь на 2 дробь
        mov res, res1      // копируем в res окончательный результат
    }
 
    cout << "Результат по ассемблеру: " << res << endl;
 
 
    int drob1 = (5*x - 10*y) / 2*y;
    int drob2 = (6*y - 3*x) / 8*(y*y);
    int resultat = drob1 / drob2;
    cout << "Результат по с++: " << resultat << endl;
    return 0;
}
Добавлено через 4 часа 4 минуты
..............
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2018, 21:33
Ответы с готовыми решениями:

с++ вставка ассемблер не работает
Много ошибок. Подскажите где неправильно, почему и как надо правильно делать. решить функцию y = f(x). 1) sin(x) + 1 / x + 1 ...

Не работает ассемблер под GCC
сначала я долго искал как включить ассемблерный код в c++ под g++. (В boland это было крайне просто.) ( asm{ код ...

Не работает ассемблер в Free Pascal
Free Pascal при компиляции кода, содержащего вставки на ассемблере, выдает ошибки Uncnown Identifier...

14
2619 / 1630 / 266
Регистрация: 19.02.2010
Сообщений: 4,324
18.11.2018, 22:25
Реализовывать умножения с помощью сложений... "Месье знает толк в извращениях" (C)
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
18.11.2018, 22:27  [ТС]
VTsaregorodtsev, огромное спасибо за помощь
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
18.11.2018, 22:57
cherc,
1. #include <Windows.h>
2. _TCHAR -> TCHAR
3. Visual Studio не поддерживает ассемблерные вставки под x64
4. mov не умеет перемещать из области память в другую область памяти. Нужен промежуточный регистр
5. idiv принимает только один аргумент. Второй должен храниться в строго заданном регистре
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
18.11.2018, 23:04  [ТС]
nonedark2008,да я уже понял, завтра попробую еще раз. После с++ заставляют писать на ассемблере. Первая программа
0
1394 / 1023 / 325
Регистрация: 28.07.2012
Сообщений: 2,813
18.11.2018, 23:16
Цитата Сообщение от cherc Посмотреть сообщение
После с++ заставляют писать на ассемблере
Полезно для понимания того, как компилятор исполняет твой код. Если вдруг понадобится что-то сильно оптимизировать, или заниматься хакингом, то знания ассемблера будут очень кстати.
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
19.11.2018, 13:23  [ТС]
Ну а теперь почему не работает, вроде все правильно. idiv zn1 // 5x-10y / 2y - здесь какое то исключение происходит
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
// 6 лаба с++.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "iostream"
 
using namespace std;
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (LC_ALL,"Russian"); 
 
    int x, y;
 
    int zn1 = 0,   // первый знаменатель
        zn2 = 0,    // второй знаменатель
        y2,        // переменная для хранения y^2
        x2,
        ch1,         // числитель 1
        ch2,       // числитель 2
        res1 = 0,     // дробь 2
        res2 = 0,        // дробь 1
        res = 0,      // ответ
        x5,
        y10,
        y6,
        x3;
 
    cout << "Введите x: "; cin >> x;
    cout << "Введите y: "; cin >> y;
                                     // 5x - 10y / 2y   :   6y - 3x / 8y^2;
    _asm
    { 
        mov eax, y     // поместили у в eax
        mov ebx, eax     //  сохранили у в регистре ebx
        imul eax, y     // умножили у на у
        imul eax, 8         // 8y^2
        mov zn2, eax         // в zn2 поместили 8у^2
        mov eax, ebx      // скопировали у из ebx в eax
        add eax, ebx        // получили 2у
        mov zn1, eax       // поместили 2у в zn1
        imul ebx, 10       // 10y
        mov y10, ebx
        sub ebx, 4       // 6y
        mov y6, ebx
        mov eax, x         // поместили в eax значение переменной x
        imul eax, 5        // 5x
        mov x5, eax     // 
        sub eax, 2     // 3x
        mov x2, eax  
        sub ebx, x3      // 6y - 3x
        mov ch2, ebx        // скопировали в сh2 значение из ebx
        mov eax, x5
        sub eax, y10      // 5x - 10y
        idiv zn1          // 5x-10y / 2y
        mov res1, eax
        mov eax, ch2
        idiv zn2
        idiv res1
    }
 
    cout << "Результат по ассемблеру: " << res << endl;
 
 
    int drob1 = (5*x - 10*y) / 2*y;
    int drob2 = (6*y - 3*x) / 8*(y*y);
    int resultat = drob1 / drob2;
    cout << "Результат по с++: " << resultat << endl;
    return 0;
}
0
2619 / 1630 / 266
Регистрация: 19.02.2010
Сообщений: 4,324
19.11.2018, 13:44
Цитата Сообщение от cherc Посмотреть сообщение
здесь какое то исключение происходит
На ноль, может быть, делите.
Поставьте на строку брэйкпойнт и посмотрите там, что в регистрах в этот момент будет лежать.

Ну и Вы не сохраняете результат в res - осталась недоработка.
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
19.11.2018, 13:47  [ТС]
VTsaregorodtsev, ошибку исправил ноответы не совпадают по с++ и ассемблер
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
78
79
80
81
82
// 6 лаба с++.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include "iostream"
 
using namespace std;
 
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    setlocale (LC_ALL,"Russian"); 
 
    int x, y;
 
    int zn1 = 0,   // первый знаменатель
        zn2 = 0,    // второй знаменатель
        y2,        // переменная для хранения y^2
        x2,
        ch1,         // числитель 1
        ch2,       // числитель 2
        res1 = 0,     // дробь 2
        res2 = 0,        // дробь 1
        res3 = 0,      // ответ
        x5,
        y10,
        y6,
        x3;
 
    cout << "Введите x: "; cin >> x;
    cout << "Введите y: "; cin >> y;
                                     // 5x - 10y / 2y   :   6y - 3x / 8y^2;
    _asm
    { 
        mov eax, y     // поместили у в eax
        mov ebx, eax     //  сохранили у в регистре ebx
        imul eax, y     // умножили у на у
        imul eax, 8         // 8y^2
        mov zn2, eax         // в zn2 поместили 8у^2
        mov eax, ebx      // скопировали у из ebx в eax
        add eax, ebx        // получили 2у
        mov zn1, eax       // поместили 2у в zn1
        imul ebx, 10       // 10y
        mov y10, ebx
        sub ebx, 4       // 6y
        mov y6, ebx
        mov eax, x         // поместили в eax значение переменной x
        imul eax, 5        // 5x
        mov x5, eax     // 
        sub eax, 2     // 3x
        mov x2, eax  
        sub ebx, x3      // 6y - 3x
        mov ch2, ebx        // скопировали в сh2 значение из ebx
        mov eax, x5
        sub eax, y10      // 5x - 10y
        cdq
        mov ebx, zn1
        idiv ebx
        mov res1, eax
        mov eax, ch2
        mov ebx, zn2
        cdq
        idiv ebx
        mov res2, eax
        mov eax, res1
        mov ebx, res2
        cdq
        idiv ebx
        mov res3, eax
    }
 
    cout << "Результат по ассемблеру: " << res3 << endl;
 
 
    int drob1 = (5*x - 10*y) / 2*y;
    int drob2 = (6*y - 3*x) / 8*(y*y);
    int resultat = drob1 / drob2;
    cout << "Результат по с++: " << resultat << endl;
    system("pause");
    return 0;
}
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
19.11.2018, 14:38
Лучший ответ Сообщение было отмечено cherc как решение

Решение

Цитата Сообщение от cherc Посмотреть сообщение
Assembler
1
2
3
4
        mov eax, x         // поместили в eax значение переменной x
        imul eax, 5        // 5x
        mov x5, eax     // 
        sub eax, 2     // 3x
Почему вдруг стало https://www.cyberforum.ru/cgi-bin/latex.cgi?5x - 2 = 3x?
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
19.11.2018, 14:47  [ТС]
valen10, исправил, все равно не совпадают
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
19.11.2018, 14:49
cherc, покажите, что получилось. Не факт, что все исправили, с https://www.cyberforum.ru/cgi-bin/latex.cgi?10y-4=6y тоже самое было.
1
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
19.11.2018, 14:57  [ТС]
valen10, все теперь работает правильно. Спасибо за помощь, неправильно вычитал, а это нормально что у меня код такой длинный для такого простого выражения???
0
Параллельный Кот
 Аватар для valen10
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
19.11.2018, 15:02
Цитата Сообщение от cherc Посмотреть сообщение
Assembler
1
2
3
        sub eax, 2     // 3x
        mov x2, eax  
        sub ebx, x3      // 6y - 3x
Результат помещен в x2, а далее используется неинициализированная x3.

С ассемблерными вставками Вы вроде бы разобрались, теперь приведите свою программу в порядок: уберите лишние переменные, прокомментируйте каждую строку в ассемблерном коде. А потом выполняйте пошаговую отладку с внимательной проверкой, совпадает ли полученный на каждом шаге результат с ожидаемым. Мы конечно можем это сделать за Вас, но пользы от этого будет мало.

Добавлено через 1 минуту
Цитата Сообщение от cherc Посмотреть сообщение
это нормально что у меня код такой длинный для такого простого выражения?
Да, нормально. Хотя, если выражение попробовать упростить и не выполнять лишние перемещения между регистрами и памятью, можно и короче сделать. Попробуйте, если есть желание.
0
13 / 18 / 6
Регистрация: 02.05.2018
Сообщений: 545
19.11.2018, 15:03  [ТС]
valen10, в условии сказано никаких упрощений.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.11.2018, 15:03
Помогаю со студенческими работами здесь

Передача данных в ассемблер. Объясните как работает
Здравствуйте. Нужно реализовать метод ньютона с подвижным полюсом с вычислением на ассемблере. мои достижения: на C++: ...

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

Ассемблер и C++
Может быть кто нибудь знает, почему у меня ассемблер на Codeblocks не работает? char* y = argv; int lenas = strlen(y); ...

Вычислить R=X!/2-2 при x=sp
пример R=X!/2-2 при x=sp Добавлено через 2 часа 56 минут up up up

Вычислить арифметическое выражение
Помогите решить 3 задачи на ассемблере 1. Даны двузначные числа m и n в десятичной системе счисления. От большего числа отнимите...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru