Ассемблерные вставки в Си++

Аватар пользователя
Полевой
Сообщений: 34
Зарегистрирован: 07 янв 2014, 21:00

Ассемблерные вставки в Си++

Сообщение Полевой » 18 янв 2014, 19:31

В один прекрасный, солнечный, не предвещавший ничего дурного денек я решил написать простенький код для замера количества тактов, потребных на выполнение некой операции (по факту - обработку исключения).

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

Код: Выбрать все

#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("movl DWORD %PTR[t2], %eax");
 __asm("movl DWORD %PTR[t2 + 4], %edx");


 delta_t = t2 - t1;
 cout << delta_t;
 }



После попытки компиляции которого я был обруган:
junk '[t1]' after expression
junk '[t1+4]' after expression
junk '[t2]' after expression
junk '[t2+4]' after expression


Метод усиленного вглядывания в текст ни к чему ни привел.


Не могли бы вы поглядеть коллективным разумом и тыкнуть меня носом?


M Дубль текста удален
A Дубль текста удален
Последний раз редактировалось Полевой 28 ноя 2019, 06:37, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
zykov
Сообщений: 1777
Зарегистрирован: 02 ноя 2009, 21:00

Ассемблерные вставки в Си++

Сообщение zykov » 18 янв 2014, 22:10

Наверно нужно уточнить, что за компилятор...
('__asm' и тем более его аргумент точно не входит стандарт C++.)

А насчёт измерений, как насчёт прерываний?
Последний раз редактировалось zykov 28 ноя 2019, 06:37, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
Wild Bill
Сообщений: 4820
Зарегистрирован: 26 июл 2009, 21:00

Ассемблерные вставки в Си++

Сообщение Wild Bill » 18 янв 2014, 22:16

zykov писал(а):Source of the post
Наверно нужно уточнить, что за компилятор...
('__asm' и тем более его аргумент точно не входит стандарт C++.)

А насчёт измерений, как насчёт прерываний?
Я бы сказал обиднее... Есть стандартная процедура для определения долей секунды для операции... Кто хочет изобретать велосипед --- кирку им в руки!
Последний раз редактировалось Wild Bill 28 ноя 2019, 06:37, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Ассемблерные вставки в Си++

Сообщение NT » 19 янв 2014, 10:12

zykov писал(а):Source of the post А насчёт измерений, как насчёт прерываний?

Я согласен с Андреем.
Зачем такие заморочки?
Вчера весь вечер анализовал код ТС и ничего не понял.
Уж лучше вызов низкоуровних функций (неявно их выполнение идет через прерывания).

Как например тут:

Код: Выбрать все

 // Test.cpp - program
#include <iostream>
#include <windows.h>
#include <intrin.h>
#include <stdint.h>
using namespace std;

uint64_t rdtsc()
{
    return __rdtsc();
}

int main()
{
    cout << rdtsc() << "\n";    cin.get();    return 0;}
Последний раз редактировалось NT 28 ноя 2019, 06:37, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
kiv
Сообщений: 1012
Зарегистрирован: 02 дек 2011, 21:00

Ассемблерные вставки в Си++

Сообщение kiv » 19 янв 2014, 10:23

Ну, надо смотреть правила конкретного компилятора. Visual C++ вполне компилирует

Код: Выбрать все

 __asm CPUID; // "out-of-order"
 __asm RDTSC;

 __asm mov DWORD PTR[t1], eax;
 __asm mov DWORD PTR[t1 + 4], edx;


Я, честно говоря, предпочитаю под Windows QueryPerformanceFrequency/QueryPerformanceCounter.
Последний раз редактировалось kiv 28 ноя 2019, 06:37, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Ассемблерные вставки в Си++

Сообщение NT » 19 янв 2014, 11:32

kiv писал(а):Source of the post Ну, надо смотреть правила конкретного ...
Скопилировать под Windows for "Dev-C++ compiler"
в нотации Intela (без movl), проходит вот так например:

Код: Выбрать все

 //Test4.cpp program
#include <iostream>
using namespace std;

long long t1=0,t2=0;
static long long delta_t=0;

int main(){
    
    __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;    return 0;}

Но что делает программа - ума не приложу.
Т.е. теоретический знаю, что должна.
Но так, как написана - не врублюсь.
Последний раз редактировалось NT 28 ноя 2019, 06:37, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
kiv
Сообщений: 1012
Зарегистрирован: 02 дек 2011, 21:00

Ассемблерные вставки в Си++

Сообщение kiv » 19 янв 2014, 12:57

NT писал(а):Source of the post
Скопилировать под Windows for "Dev-C++ compiler"

Не хочется начинать еще один спор, но "Dev-C++ — свободная интегрированная среда разработки приложений для языков программирования C/C++.", как сказано в Википедии... То, что в основном используется с компилятором MinGW, еще ни о чем не говорит

А по сути - да, нотация была явно GNU-шная, но тут я, увы, не помощник...
Последний раз редактировалось kiv 28 ноя 2019, 06:37, всего редактировалось 1 раз.
Причина: test

Аватар пользователя
NT
Сообщений: 3384
Зарегистрирован: 25 янв 2010, 21:00

Ассемблерные вставки в Си++

Сообщение NT » 19 янв 2014, 13:22

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



PS.
kiv писал(а):Source of the post ... в основном используется с компилятором MinGW ...
Совершенно верно в Dev-C++ у меня в опциях до выбора MinGW-32 или MinGW-64.
Последний раз редактировалось NT 28 ноя 2019, 06:37, всего редактировалось 1 раз.
Причина: test

folk
Сообщений: 4177
Зарегистрирован: 11 сен 2009, 21:00

Ассемблерные вставки в Си++

Сообщение folk » 19 янв 2014, 18:13

В таком виде вроде работает но сразу скажу что количество плавает изрядно - не вижу большого смысла в таком измерении
Лучше все же повторить 10^5 раз и поделить время на 10^5)

Код: Выбрать все

#include <iostream>
#include <stdio.h>
using namespace std;

#include <stdint.h>
inline unsigned long long rdtsc() {
 register unsigned int lo, hi;
 asm volatile (
 "cpuid \n"
 "rdtsc"
 : "=a"(lo), "=d"(hi) /* outputs */
 : "a"(0) /* inputs */
 : "%ebx", "%ecx"); /* clobbers*/
 return ((unsigned long long)lo) | (((unsigned long long)hi) << 32);
}


int main()
 {
 register long long t1=0,t2=0;
 register long long delta_t=0;

 __asm("CPUID"); // "out-of-order"
 t1 = rdtsc();

__asm ("nop");
 //Здесь выполняется код, время исполнения которого и замеряется

 t2 = rdtsc();

 delta_t = t2 - t1;
 printf("%ld=\n",delta_t);
 }
Последний раз редактировалось folk 28 ноя 2019, 06:37, всего редактировалось 1 раз.
Причина: test


Вернуться в «Computer Science»

Кто сейчас на форуме

Количество пользователей, которые сейчас просматривают этот форум: нет зарегистрированных пользователей и 16 гостей