Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
gale
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 12
#1

Ассеблерные вставки в C++ - C++

28.12.2013, 19:59. Просмотров 529. Ответов 9
Метки нет (Все метки)

Потребовалось написать простенький, по идее код, в котором замерялось бы количество тактов процессора,
затрачиваемых на определенный процесс.
Почти сразу это вылилось в такой код:

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
#include <iostream>
using namespace std;
int main()
    {
 
    long long t1=0,t2=0;
    long long delta_t=0;
 
    __asm("CPUID"); //  "out-of-order"
    __asm("RDTSC");
    __asm("mov DWORD PTR[t1], eax");
    __asm("mov DWORD PTR[t1 + 4], edx");
 
 
 
    //Здесь выполняется код, время исполнения которого и замеряется
 
 
     __asm("CPUID");
     __asm("RDTSC");
     __asm("mov DWORD PTR[t2], eax");
     __asm("mov DWORD PTR[t2 + 4], edx");
 
 
    delta_t = t2 - t1;
    cout << delta_t;
    }
На первый взгляд правильно.
Однако после попытки откомпилировать код дебаггер ругнулся:
Ассеблерные вставки в C++

В ассемблере x86 разбираюсь слабо.

Компилятор - gcc
IDE - CodeBlocks
Процессор - Intel Core 2 Duo

В чем моя ошибка?
Единственный момент - замер должен производиться именно с использованием RDTSC.

P.S.
С наступающим!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2013, 19:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ассеблерные вставки в C++ (C++):

Как убрать ограничения вставки iframe (для вставки видео)? - DLE
Подскажите как на dle 10.3 убрать ограничения вставки Iframe(для вставки видео)

Вставки из C++ - Delphi
Как в Delphi делать вставки из C++? Например в C++ вставки из Delphi делаются так: pascal { //Какой-то код на Паскале. } А...

Ассемблерные вставки - C++
Будут ли у меня проблемы, если я, поработав с регистрами, не восстановлю их после выхода из вставки? Если проблем не будет, то их не будет...

Ассемблерные вставки:( - Assembler
Есть программа которая В исходную строку вставляет после заданного символа все символы, предшествующие заданному в обратном порядке ...

Ассемблерные вставки - Assembler
1)Всем добрый вечер.Хотелось бы узнать как считать а потом вывести что либо (код должен быть написан во вставке С),переменные объёвляются в...

Ассемблерные вставки - Delphi
У меня есть функция function Lalala(x, y, z: Integre): Byte; asm ... //используются регистры eax ebx ecx edx ... end; ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
gale
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 12
28.12.2013, 20:22  [ТС] #2
Прошу прощения, что текст дебаггера в виде фотографии, сейчас пытаюсь исправить.
Пока не получается разобраться в интерфейсе.
[
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
28.12.2013, 22:24 #3
У тебя синтаксис ассемблера Intel, а в gcc по дефолту используется AT&T. Думаю проблема в этом.

Добавлено через 1 минуту
Выхода 2:
1. Переписать на синтаксис AT&T
2. Нагуглить ключ для gcc, который указывает на то, что используется синтаксис Intel

Добавлено через 1 минуту
про AT&T синтаксис
http://www.insidepro.com/kk/209r.shtml

еще cpuid здесь вызывается впустую, ее результат не используется.
Somebody
2787 / 1601 / 145
Регистрация: 03.12.2007
Сообщений: 4,193
Завершенные тесты: 1
28.12.2013, 23:28 #4
Цитата Сообщение от Kastaneda Посмотреть сообщение
еще cpuid здесь вызывается впустую, ее результат не используется.
Не впустую:
CPUID can be executed at any privilege level to serialize instruction execution. Serializing instruction execution guarantees that any modifications to flags, registers, and memory for previous instructions are completed before the next instruction is fetched and executed.
See also:
“Serializing Instructions” in Chapter 8, “Multiple-Processor Management,” in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A
“Caching Translation Information” in Chapter 4, “Paging,” in the Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 3A.
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
28.12.2013, 23:39 #5
Somebody, хм, верно, я даже не знал о таких последствиях cpuid. Просто я ее редко использую и использую для получения информации о cpu.
gale
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 12
29.12.2013, 12:25  [ТС] #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
1. Переписать на синтаксис AT&T
Если я правильно понял, AT&T не поддерживает операции с 64-разрядными числами.
Существует ли какой-нибудь костыль, позволяющий обойти эту проблему?
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
29.12.2013, 15:11 #7
Цитата Сообщение от gale Посмотреть сообщение
Если я правильно понял, AT&T не поддерживает операции с 64-разрядными числами.
AT&T умеет все, что умеет Intel.
А в чем именно проблема?
Timur_CF
39 / 39 / 3
Регистрация: 12.12.2013
Сообщений: 227
Записей в блоге: 1
29.12.2013, 17:31 #8
Откомпилируй в NASM, FASM, а потом пользуй как библиотеку свой ассемблер.
gale
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 12
29.12.2013, 18:23  [ТС] #9
Пройдя по ссылке, которую вы мне дали (спасибо, кстати, много чего интересного),
я нашёл вот это:
Размер операнда задается суффиксом, замыкающим инструкцию. Всего есть три типа суффиксов: "b" - байт (8-бит), "w" - слово (16-бит) и "l" - двойное слово (32-бита):
Assembler
1
2
3
4
5
6
Intel: mov ah, al;
AT&T: movb %al, %ah;
Intel: mov bx, ax;
AT&T: movw %ax, %bx;
Intel: mov eax, ebx;
AT&T: movl %ebx, %eax;
Как в таком случае производить операции со шестибайтными словами?
Или я неправильно понял?
Kastaneda
Форумчанин
Эксперт С++
4652 / 2860 / 228
Регистрация: 12.12.2009
Сообщений: 7,268
Записей в блоге: 2
Завершенные тесты: 1
29.12.2013, 22:30 #10
Цитата Сообщение от gale Посмотреть сообщение
Как в таком случае производить операции со шестибайтными словами?
может имелось ввиду 8 байт? Попробуй movq
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2013, 22:30
Привет! Вот еще темы с ответами:

Вставки кода - Delphi
Я могу вставлять в код программы вставки с других языков? Подобно ассемблеру только скажем с# или джаву, или ещё какие? Пишу в ХЕ7

Ассемблерные вставки - Visual C++
Здрасти всем.Нужна помощь.Объявления переменных на си,основная логика на ассемблере.Нужно считать с клавиатуру символы,а потом вывести на...

триггер вставки - SQL Server
Ребятки, прошу вашей помощи!!! Не могу найти своей ошибки. В задании требуется запретить вставку строки в таблицу Mer_v_ks даты, которая...

Ассемблерные вставки в C++ - C++
Собственно сабж ...: Имею следующий код : short Carry = 2; unsigned short Mas; Mas = 12; Mas = 13; Mas = 14; Пытаюсь , в...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
29.12.2013, 22:30
Ответ Создать тему
Опции темы

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