Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/64: Рейтинг темы: голосов - 64, средняя оценка - 4.66
2 / 2 / 2
Регистрация: 01.12.2012
Сообщений: 123
1

Вставка asm в С++

06.03.2015, 21:01. Показов 13311. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Помогите пожалуйста!
Задание:
Вычислить арифметическое выражение. Требуется написать функцию на языке C++ с вставкой на языке ассемблера. Ввод и вывод данных производить средствами библиотеки классов систем Borland C++ Builder либо Microsoft Visual C++. Для вычислений использовать только 16-разрядные регистры.
Если значения входных параметров приводят к ошибке вычисления выражения (например, деление на нуль), программа должна выводить предупреждающее сообщение.

Вопрос в том что "Для вычислений использовать только 16-разрядные регистры." Это получается используя регистры ax,bx.... Возможно ли это использовать на Visual Studio под Windows 8.1 х64. Насколько я понимаю возможность только использовать регистры старших разрядов eax,ebx.... И появится ли такая возможность если использовать Windows ХР?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.03.2015, 21:01
Ответы с готовыми решениями:

asm вставка в C++
есть код #include "stdafx.h" #include <iostream> #include <fstream> using namespace std; ...

asm вставка в C++
#include <iostream> int a = 10; void func( int& aIn ) { __asm { mov aIn,...

asm вставка в C++ часть 2
есть код. за его написание отдельное спасибо Kastaneda) #include <iostream> #include <fstream>...

Asm вставка в С++ возвести число в степень
Возвести число А в степень n (на Assemblerе в С++)

16
7792 / 6559 / 2984
Регистрация: 14.04.2014
Сообщений: 28,669
06.03.2015, 21:05 2
Нет там ограничения на 16-разрядные регистры.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
06.03.2015, 21:05 3
Цитата Сообщение от Avicii Посмотреть сообщение
Насколько я понимаю возможность только использовать регистры старших разрядов eax,ebx.
ax, bx и другие регистры в 32-битных системах никуда не делись,
они доступны, как и раньше. Также, как и их собственные восьмибитные
половинки - al, bl и т.д.

Цитата Сообщение от Avicii Посмотреть сообщение
И появится ли такая возможность если использовать Windows ХР?
Нет никакой связи между версией Windows и тем, какие регистры процессора доступны.
(16-битные Windows не в счет, ибо архаизм).
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.03.2015, 21:12 4
Не зависимо от разрядности ОС можно использовать все составляющие регистра: al, ah, ax, eax, rax. Архитектура это позволяет.
0
2 / 2 / 2
Регистрация: 01.12.2012
Сообщений: 123
06.03.2015, 21:40  [ТС] 5
Можете привести простейший пример использования 16 разрядных регистров... у меня не получается использовать такие команды как mov ax,5 Получается только mov eax,5 Насколько я понимаю это подходит по заданию?
Получается только так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <stdio.h>
using namespace std;
int func()
{
    //double res;
    int a = 5;
    _asm
    {
        mov eax,5
 
    }
}
int main(void)
{   
    double result = 0;
    result = func();
    cout << result;
    getchar();
}
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
06.03.2015, 21:45 6
Цитата Сообщение от Avicii Посмотреть сообщение
у меня не получается использовать такие команды как mov ax,5
Почему не получается?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
06.03.2015, 21:50 7
Цитата Сообщение от Avicii Посмотреть сообщение
Получается только mov eax,5
может из за этого
Цитата Сообщение от Avicii Посмотреть сообщение
int func()
попробуй
C++
1
2
3
4
5
short func()
{
asm mov ax,5;
 
}
0
2 / 2 / 2
Регистрация: 01.12.2012
Сообщений: 123
06.03.2015, 21:59  [ТС] 8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <stdio.h>
using namespace std;
short func()
{
    _asm
    {
        mov ax,5
 
    }
}
int main(void)
{   
    double result = 0;
    result = func();
    cout << result;
    getchar();
}
Изменив на short получилось. Но мне предстоит задача вычисления длинного выражения и ответ точно будет типа double. Как поступить в таком плане?
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
06.03.2015, 22:25 9
Цитата Сообщение от Avicii Посмотреть сообщение
и ответ точно будет типа double
во первых double 64 бита и ни окаких 16 битах речи не может быть
во вторых все операции с плавающими через сопроцессор
0
2 / 2 / 2
Регистрация: 01.12.2012
Сообщений: 123
06.03.2015, 23:17  [ТС] 10
Понятно.Спасибо за объяснение.
у меня не получается деление,подскажите почему?
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
#include <iostream>
#include <stdio.h>
using namespace std;
short func(short a, short b)
{
    //double res;
    //int a = 5;
    _asm
    {
        mov ax, a
        mov cx, b
        add ax, cx
        mov cx,2
        div cx
 
 
    }
}
int main()
{
    short a, b;
    setlocale(LC_ALL, "Russian");
    cout << "Решить уравнение (a+b)/2+(b*b)/(a+2)\n";
    cout << "Введите a b: ";
    cin >> a >> b;
    cout << func(a, b);
    cin >> a >> b;
    return 0;
}
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
07.03.2015, 05:52 11
Цитата Сообщение от Avicii Посмотреть сообщение
у меня не получается деление,
не получается что?
для начала ты работаешь со знаковыми параметрами или беззнаковыми
если со знаковыми то
Assembler
1
idiv cx
http://www.kolasc.net.ru/cdo/p... /idiv.html
а если беззнаковые то
Цитата Сообщение от Avicii Посмотреть сообщение
short func(short a, short b)
C++
1
 unsigned short func(unsigned short a, unsigned short b)
во вторых, для деление на степень двойки используют сдвиг вправо
для знаковых арифметический, для беззнаковых логический


еще
твой листинг как то не отображает сию формулу
Цитата Сообщение от Avicii Посмотреть сообщение
(a+b)/2+(b*b)/(a+2)
1
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
07.03.2015, 07:09 12
Цитата Сообщение от Avicii Посмотреть сообщение
Ввод и вывод данных производить средствами библиотеки классов систем Borland C++ Builder либо Microsoft Visual C++. Для вычислений использовать только 16-разрядные регистры.
Решить задачу на C++, открыть в дизассемблере (сеть подсказывает что для Microsoft Visual C++ - ALT-F3 в режиме отладки), выписать решение, подправить под свои нужды и сдать.

Да, да, знаю что не спортивно. Но у меня такое ощущение что ваш препод подразумевал 16-битовый реальный режим с 20-битовой сегментной адресацией, который все давно похоронили и чечетку на могиле сплясали.
0
2 / 2 / 2
Регистрация: 01.12.2012
Сообщений: 123
07.03.2015, 13:20  [ТС] 13
ValeryS,
Получается если заносить делитель в bl,в bx не получается,выдает ошибку
Я буду использовать числа чтобы деление было нацело.
Вот чуточку переделал.
После пробовал такую команду mov bx,b Почему она не заносит переменную b? Там помещает неизвестное число.
C++
1
2
3
4
5
6
7
8
9
10
11
unsigned short func(unsigned short a, unsigned short b)
{
    _asm
    {
        mov ax, a   //ax = a
        mov bx, b   //bx = b 
        add ax, bx   //ax = a + b
        mov bl, 2    //bl = 2
        div bl 
    }
}
Добавлено через 1 минуту
Renji,
Можно поконкретней как открыть в дизассемблере? у меня студия 2013 стоит,найти не смог...
0
2782 / 1935 / 570
Регистрация: 05.06.2014
Сообщений: 5,600
07.03.2015, 13:28 14
Цитата Сообщение от Avicii Посмотреть сообщение
Можно поконкретней как открыть в дизассемблере? у меня студия 2013 стоит,найти не смог...
Эту инструкцию попробуйте.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
07.03.2015, 14:46 15
Цитата Сообщение от Avicii Посмотреть сообщение
ValeryS,
Получается если заносить делитель в bl,в bx не получается,выдает ошибку
ссылку почитал?
судя вот по этому
Цитата Сообщение от Avicii Посмотреть сообщение
Для вычислений использовать только 16-разрядные регистры.
тебе современные компиляторы не подойдут
например размер делимого в два раза больше частного
чтобы получить частное 16 бит делимое должно быть 32 бита
для современных компиляторов это eax но тебе нужна пара dx:ax
посему поищи на просторах сети BC 3.1 в связке с DosBox
он как раз поддерживает 16 битный режим, и там насколько помню были библиотеки для работы с double float минуя сопроцессор
видать препод ваш уснул в году так 1995
0
2 / 2 / 2
Регистрация: 01.12.2012
Сообщений: 123
07.03.2015, 16:35  [ТС] 16
Я скажу больше он сам даже задания не читал,я больше чем уверен

Добавлено через 53 минуты
ValeryS, Да я прочел статью,сделал как надо вроде все хорошо,но не показывает код....
Единственное что пишет: Дизассемблированный текст нельзя просматривать в режиме выполнения.
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
07.03.2015, 16:46 17
Цитата Сообщение от Avicii Посмотреть сообщение
Единственное что пишет: Дизассемблированный текст нельзя просматривать в режиме выполнения.
Можно.
Поищи во время отладки в меню Debug строку "Disassembly".
Ну и WinDBG / Olly никто не отменял.
0
07.03.2015, 16:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.03.2015, 16:46
Помогаю со студенческими работами здесь

Asm вставка и возвращаемое системе значение
Здравствуйте. Почему эта программа #include &lt;iostream&gt; using std::cout; using std::cin; int...

Вставка asm, адрес члена локального объекта
TLongInteger &amp; TLongInteger:: operator + (const TLongInteger &amp;Additional) { TLongInteger ...

c++ и ASM
помогите найти ошибку #pragma once #include &lt;stdlib.h&gt; #include &lt;iostream&gt; class bbyte {...

c++ asm
_asm {} какие библиотеки нужно подключать , чтобы заставить работать ассемблер на с++ и как...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru