Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.76/85: Рейтинг темы: голосов - 85, средняя оценка - 4.76
instagib
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
1

Вставка на ассемблере

10.03.2011, 22:00. Просмотров 15512. Ответов 12
Метки нет (Все метки)

Добрый вечер.

Код пишу в CodeBlocks&MinGW, есть и студия.

вопрос:
нужны ли какие-нибудь инклюды чтоб осуществить вставку на ассемблере?.

и вообще. дайте пример простой с вставкой на ассемблере (ОТ и ДО).

компиль ругается: error expected ';' before '{' token
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.03.2011, 22:00
Ответы с готовыми решениями:

вставка кода на ассемблере
РЕБЯЯЯЯЯЯТ:(Может кто-нибудь помочь?:( Необходимо,написать программу на с++ с...

массивы на ассемблере
всем привет,помогите составить такую программу на ассемблере: в одномерном...

Вывод на ассемблере
Хочу посмотреть как код выглядит на ассемблере. Загрузила в Olly debug но...

Возведение в степень в ассемблере
Доброго времени суток, подскажите пожалуйста как возвести в степень eps ^ 3 * x...

Внешняя процедура на ассемблере
Доброй ночи! Не хочет собираться C++ (в Dev-C++) и внешняя процедура ...

12
Ma3a
Эксперт С++
619 / 463 / 57
Регистрация: 28.01.2011
Сообщений: 605
10.03.2011, 23:30 2
Лучший ответ Сообщение было отмечено как решение

Решение

Я пользуюсь студией, так что пример под нее, если что(__asm ключевое слово). Ничего подключать специально, чтобы сделать ассемблерную вставку, не нужно, просто оформляете asm-код в __asm { } и __asm (для однострочной вставки) блоках.
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
#include <iostream>
 
int main()
    {
    // измерения для времени(тиков процессора)
    long long t1,t2;
 
    __asm{
        CPUID // страхуемся от "out-of-order" исполнения инструкций
        RDTSC // делаем первый замер
        mov DWORD PTR[t1], eax // сохраняем 64-битный результат из EDX:EAX
        mov DWORD PTR[t1 + 4], edx // в t1
        }
 
    // что нужно тестить на время исполнения
    for(int i = 0; i < 100; ++i)
        std::cout << "hey\n";
    
    __asm{ // делаем аналогичное для второго замера
        CPUID
        RDTSC
        mov DWORD PTR[t2], eax
        mov DWORD PTR[t2 + 4], edx
        }
    // количество тиков процессора, сделанное за время выполнения теста
    long long delta_t = t2 - t1;
    std::cout << delta_t;
    }
4
instagib
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
11.03.2011, 00:13  [ТС] 3
Ma3a, спасибо, ваш код в студии заработал. но вот напрашивается еще 1 вопрос.

я помимо с++ изучаю ассемблер и вот пример простой программы банальной Хелоу ворлд:

Assembler
1
2
3
4
5
6
7
8
9
10
CSEG segment
org 100h
Begin:
mov ah,9
mov dx,offset Message
int 21h
int 20h
Message db 'Hello world$'
CSEG ends
end Begin

компиль ужасно ругается(студия). п.с книга Олег Калашников - Ассемблер. Учимся программировать.
0
Ma3a
Эксперт С++
619 / 463 / 57
Регистрация: 28.01.2011
Сообщений: 605
11.03.2011, 00:27 4
Ну во-первых , эта программа расчитана на работу в реальном 16битном режиме, а у нас в windows работа идет в 32- 64- битном защищенном. Во-вторых, определенные директивы ассемблерная вставка просто не сможет переварить, то как например
Assembler
1
2
3
CSEG segment
...
CSEG ends
или
Assembler
1
org 100h
ибо, например, указывать смещение относительно сегмента для выполнения инструкций по меньшей мере лишено смысла во вставке, ибо вставки объявляются в функциях, ну а код вида
Assembler
1
2
3
4
5
6
7
some_func PROC
...
CSEG segment
...
CSEG ends
...
some_func ENDP
С точки зрения ассемблера тоже некорректен, ибо задать сегмент внутри функции никак не представляется возможным, а при вставке будет сгенерирован код именно такого вида, как я указал выше. Объявление данных во вставках тоже невозможно.
1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
11.03.2011, 00:27 5
instagib, такое было во времена дос
если хотите такого асма - используйте старые компиляторы (Turbo C, TASM)
1
instagib
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
11.03.2011, 00:41  [ТС] 6
alex_x_x,
Ma3a, исчерпывающий ответ спасибо.

подскажите тогда, литературу по которой я мог нормально учиться и практиковаться под виндовс.
компиль я уже нашел(flat assembler 1.69). Спасибо большое заранее

а книга то сцуко 2006 года.. под DOS оказывается. эх..
__________________________________________________
и еще.. какой код бы добавить чтоб программа не закрывалась сразу после выполнение..п.с. аналог getch();
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
11.03.2011, 00:46 7
Юров Ассемблер, неплохая во всех отношения, по windows там в том числе есть
1
Ma3a
Эксперт С++
619 / 463 / 57
Регистрация: 28.01.2011
Сообщений: 605
11.03.2011, 00:46 8
Насчет книг подсказать не смогу, но как крайне полезный ресурс отмечу http://www.wasm.ru/ . Там можно найти абсолютно весь интересующий материал по тому, что вам будет нужно для win32 assembly и даже больше, есть много хороших статей написанных на доступном языке, самое оно для начала изучения.
1
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
11.03.2011, 00:48 9
хотя если хотите учится асму, думаю лучше начинать с доса, там все проще и с практической точки зрения не очень много поменялось
2
instagib
122 / 85 / 16
Регистрация: 14.02.2011
Сообщений: 340
11.03.2011, 00:48  [ТС] 10
alex_x_x, а вы как начинали? с доса?
0
alex_x_x
бжни
2455 / 1661 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
11.03.2011, 01:05 11
с него родимого
0
Troll_Face
603 / 403 / 8
Регистрация: 26.04.2012
Сообщений: 2,070
08.06.2012, 09:02 12
хоть больше года прошло, но всеже:
Ma3a, дева не берет Ваш код, только по одной строке асма тянет, не заете в чем причина? мож настроить чо надо?
0
mrden777
3 / 11 / 12
Регистрация: 20.03.2018
Сообщений: 404
Завершенные тесты: 2
06.06.2018, 17:53 13
Почему выдало 86 MHZ если у меня 3.6 GHz ,,,??
0
06.06.2018, 17:53
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.06.2018, 17:53

Связь С++ с программой на ассемблере
Помогите пожалуйста! Не удается создать связь Borland C++ v5.02 с программой...

Вызов функций на Ассемблере в программе на С++
Помогите,пожалуйста. Нужно написать программу, состоящую из ассемблерной...

Обращение к 32-разрядным числам в Ассемблере
Пож-ста,помогите,как объявлять 32-разр. числа в асм и оперировать с ними с...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru