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

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

Восстановить пароль Регистрация
 
gale
 Аватар для gale
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 12
28.12.2013, 19:59     Ассеблерные вставки в C++ #1
Потребовалось написать простенький, по идее код, в котором замерялось бы количество тактов процессора,
затрачиваемых на определенный процесс.
Почти сразу это вылилось в такой код:

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.
С наступающим!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gale
 Аватар для gale
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 12
28.12.2013, 20:22  [ТС]     Ассеблерные вставки в C++ #2
Прошу прощения, что текст дебаггера в виде фотографии, сейчас пытаюсь исправить.
Пока не получается разобраться в интерфейсе.
[
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
28.12.2013, 22:24     Ассеблерные вставки в C++ #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
2775 / 1588 / 142
Регистрация: 03.12.2007
Сообщений: 4,162
Завершенные тесты: 1
28.12.2013, 23:28     Ассеблерные вставки в C++ #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
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
28.12.2013, 23:39     Ассеблерные вставки в C++ #5
Somebody, хм, верно, я даже не знал о таких последствиях cpuid. Просто я ее редко использую и использую для получения информации о cpu.
gale
 Аватар для gale
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 12
29.12.2013, 12:25  [ТС]     Ассеблерные вставки в C++ #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
1. Переписать на синтаксис AT&T
Если я правильно понял, AT&T не поддерживает операции с 64-разрядными числами.
Существует ли какой-нибудь костыль, позволяющий обойти эту проблему?
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
29.12.2013, 15:11     Ассеблерные вставки в C++ #7
Цитата Сообщение от gale Посмотреть сообщение
Если я правильно понял, AT&T не поддерживает операции с 64-разрядными числами.
AT&T умеет все, что умеет Intel.
А в чем именно проблема?
Timur_CF
39 / 39 / 3
Регистрация: 12.12.2013
Сообщений: 227
Записей в блоге: 1
29.12.2013, 17:31     Ассеблерные вставки в C++ #8
Откомпилируй в NASM, FASM, а потом пользуй как библиотеку свой ассемблер.
gale
 Аватар для gale
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 12
29.12.2013, 18:23  [ТС]     Ассеблерные вставки в C++ #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;
Как в таком случае производить операции со шестибайтными словами?
Или я неправильно понял?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
29.12.2013, 22:30     Ассеблерные вставки в C++
Еще ссылки по теме:

C++ Ассемблерные вставки
C++ Ассемблерные вставки в C++
C++ Ассемблерные вставки пример
Метод вставки C++
С++ и шестнадцатиричные вставки C++

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

Или воспользуйтесь поиском по форуму:
Kastaneda
Модератор
Эксперт С++
 Аватар для Kastaneda
4248 / 2780 / 219
Регистрация: 12.12.2009
Сообщений: 7,109
Записей в блоге: 1
Завершенные тесты: 1
29.12.2013, 22:30     Ассеблерные вставки в C++ #10
Цитата Сообщение от gale Посмотреть сообщение
Как в таком случае производить операции со шестибайтными словами?
может имелось ввиду 8 байт? Попробуй movq
Yandex
Объявления
29.12.2013, 22:30     Ассеблерные вставки в C++
Ответ Создать тему
Опции темы

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