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

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

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

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

28.12.2013, 19:59. Просмотров 531. Ответов 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.
С наступающим!
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2013, 19:59
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Ассеблерные вставки в C++ (C++):

бинарные вставки - C++
укажите на ошибку пожалуйста! stroka1=stroka2; for (h=1;h&lt;=k;h++) { if (stroka1&gt;=stroka2) R=h; else { ...

Метод вставки - C++
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int main() { const int n = 10; int a; int key = 0, j = 0; ...

Ассемблеровские вставки в C++ - C++
Подскажите, пожалуйста, как в таких вставках в C++ сделтаь массив чисел (или строк) везде написано одно и то же, вот как здесь...

С++ и шестнадцатиричные вставки - C++
не раз встречал в примерах С++ встречал вставки по типу 0x... очень бы хотелось этим научиться пользоваться. гугл не ответил на мой вопрос...

Метод вставки - C++
Расположение массива в порядке убывания методом вставки!!! Как это? Я просто саму задачу не понимаю, решить, думаю, смогу??? По убыванию...

Асемблерные вставки - C++
Здравствуйте! Можете посоветовать литературу (или если у кого есть исходники) по поводу того как делать вставки AMS в C++ Builder. ...

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

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

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

Ассемблерские вставки. - C++
void main(void) { __asm { mov ah,2h mov al,'A' xor bx,bx int 10h } }

Ассемблеровские вставки - C++
Пользуюсь на C++ ассемблеровскими вставками, как на assembler хранить число типа double (8 байт), если регистры вмещают по 4 байта.


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

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

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