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

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

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

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

28.12.2013, 19:59. Просмотров 519. Ответов 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++
Будут ли у меня проблемы, если я, поработав с регистрами, не восстановлю их после выхода из вставки? Если проблем не будет, то их не будет...

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

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

Метод вставки - 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++
void main(void) { __asm { mov ah,2h mov al,'A' xor bx,bx int 10h } }

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

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
gale
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 12
28.12.2013, 20:22  [ТС]     Ассеблерные вставки в C++ #2
Прошу прощения, что текст дебаггера в виде фотографии, сейчас пытаюсь исправить.
Пока не получается разобраться в интерфейсе.
[
Kastaneda
Форумчанин
Эксперт С++
4480 / 2842 / 227
Регистрация: 12.12.2009
Сообщений: 7,225
Записей в блоге: 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
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,189
Завершенные тесты: 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
Форумчанин
Эксперт С++
4480 / 2842 / 227
Регистрация: 12.12.2009
Сообщений: 7,225
Записей в блоге: 1
Завершенные тесты: 1
28.12.2013, 23:39     Ассеблерные вставки в C++ #5
Somebody, хм, верно, я даже не знал о таких последствиях cpuid. Просто я ее редко использую и использую для получения информации о cpu.
gale
0 / 0 / 0
Регистрация: 28.12.2013
Сообщений: 12
29.12.2013, 12:25  [ТС]     Ассеблерные вставки в C++ #6
Цитата Сообщение от Kastaneda Посмотреть сообщение
1. Переписать на синтаксис AT&T
Если я правильно понял, AT&T не поддерживает операции с 64-разрядными числами.
Существует ли какой-нибудь костыль, позволяющий обойти эту проблему?
Kastaneda
Форумчанин
Эксперт С++
4480 / 2842 / 227
Регистрация: 12.12.2009
Сообщений: 7,225
Записей в блоге: 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
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++
Собственно сабж ...: Имею следующий код : short Carry = 2; unsigned short Mas; Mas = 12; Mas = 13; Mas = 14; Пытаюсь , в...

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

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

Getch() и защита от вставки - C++
Вот кусок кода где используется getch, работает вполне нормально, но если скопировать большое кол-во символов, неважно каких, и вставить в...

Ассемблерные вставки пример - C++
помогите пожалуйста решить вот условие: y1 = 8 +|x|, если x&lt;1 иначе y1 = 3, если x&gt;=1 y2 = |a|*2, если x&gt;=1 иначе y2 =...


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

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

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