Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.08.2016, 05:46   #1
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию AT&T Linux Не могу передать данные из "С" в Ассемблер

Привет всем.

У меня никак не получается передать данные.

PHP код:

void memcpy_sse2
(void_dest, const void_src, const unsigned long _size) {

    
void *dest _dest;
    const 
void *src _src;
    const 
unsigned long size _size;

    
__asm__ __volatile__ ("movl src, %esi");    //src pointer
    
__asm__ __volatile__ ("movl dest, %edi");   //dest pointer
    
__asm__ __volatile__ ("movl size, %ebx");   //ebx is our counter

    
__asm__ __volatile__ ("shr $7, %ebx");      //divide by 128 (8 * 128bit registers)

    
__asm__ __volatile__ ("loop_copy:");
    
__asm__ __volatile__ ("prefetchnta 128(%esi)"); //SSE2 prefetch
    
__asm__ __volatile__ ("prefetchnta 160(%esi)");
    
__asm__ __volatile__ ("prefetchnta 192(%esi)");
    
__asm__ __volatile__ ("prefetchnta 224(%esi)");

    
__asm__ __volatile__ ("movdqa (%esi), %xmm0"); //move data from src to registers
    
__asm__ __volatile__ ("movdqa 16(%esi), %xmm1");
    
__asm__ __volatile__ ("movdqa 32(%esi), %xmm2");
    
__asm__ __volatile__ ("movdqa 48(%esi), %xmm3");
    
__asm__ __volatile__ ("movdqa 64(%esi), %xmm4");
    
__asm__ __volatile__ ("movdqa 80(%esi), %xmm5");
    
__asm__ __volatile__ ("movdqa 96(%esi), %xmm6");
    
__asm__ __volatile__ ("movdqa 112(%esi), %xmm7");

    
__asm__ __volatile__ ("movntdq %xmm0, 0(%edi)"); //move data from registers to dest
    
__asm__ __volatile__ ("movntdq %xmm1, 16(%edi)");
    
__asm__ __volatile__ ("movntdq %xmm2, 32(%edi)");
    
__asm__ __volatile__ ("movntdq %xmm3, 48(%edi)");
    
__asm__ __volatile__ ("movntdq %xmm4, 64(%edi)");
    
__asm__ __volatile__ ("movntdq %xmm5, 80(%edi)");
    
__asm__ __volatile__ ("movntdq %xmm6, 96(%edi)");
    
__asm__ __volatile__ ("movntdq %xmm7, 112(%edi)");

    
__asm__ __volatile__ ("add $128, %esi");
    
__asm__ __volatile__ ("add $128, %edi");
    
__asm__ __volatile__ ("dec %ebx");

    
__asm__ __volatile__ ("jnz loop_copy"); //loop please
    
__asm__ __volatile__ ("loop_copy_end:");



Ругается на не известные переменные

Код:
/tmp/ccK3mrin.o: In function `memcpy_sse2':
md5.c:(.text+0x872): undefined reference to `src'
md5.c:(.text+0x878): undefined reference to `dest'
md5.c:(.text+0x87e): undefined reference to `size'
collect2: error: ld returned 1 exit status
Нашел, пару очень интересных книг на эту тему, вроде как все ясно. Но как только ситуация меняется, то вообще ничего не понимаю.


Вот как пример. И все как-бы понятно, хоть что-то.

PHP код:

    asm 
("movl %%eax, %0;" "=r" val )); 

Но как применить это к коду выше ?

Вот такой вариант, даже откомпилировался.
Но естественно получил "Segmentation fault" за тыкание пальцем в небо

PHP код:

    __asm__ __volatile__ 
(
        
"movl $0, %esi\n\t"
        "movl $1, %edi\n\t"
        "movl $2, %ebx\n\t"
        
:"g" (src)
        :
"g" (dest)
        :
"g" (size)
    ); 

Пишу под

"Gnu/Linux Debian 7.8 "
"gcc (Debian 4.7.2-5) 4.7.2"

Флаги : "gcc -fPIC -g0 -O3 -D_FILE_OFFSET_BITS=64 prog.c md5.c -o prog"
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/
pompiduskus вне форума Ответить с цитированием
Старый 28.08.2016, 06:18   #2
pompiduskus
юзер как все
Участник клуба
 
Аватар для pompiduskus
 
Регистрация: 10.01.2012
Сообщений: 1,586
По умолчанию

Я пошел не тем путем!

Нашел то что искал, и скорее всего нету просто смысла в этом.
"заводской" memcpy будет лучше чем этот, по крайней мере на одном потоке.

// -----------------------------------------------------------------------

Может будет интересно.
Вот этот код выдает 6.67 GiB/s a memcpy 6.51 GiB/s

i7-4750HQ, compiled with clang => Linux:
Код:

memcpy              = 6.51 GiB/s
CopyWithSSE         = 3.97 GiB/s
CopyWithSSESmall    = 3.97 GiB/s
CopyWithSSENoCache  = 6.67 GiB/s
CopyWithAVX         = 4.00 GiB/s
CopyWithAVXSmall    = 3.99 GiB/s
CopyWithAVXNoCache  = 6.64 GiB/s
CopyWithRepMovsb    = 5.69 GiB/s
CopyWithRepMovsd    = 5.22 GiB/s
CopyWithRepMovsq    = 5.19 GiB/s
CopyWithRepMovsbUnaligned = 5.11 GiB/s
CopyWithThreads     = 7.70 GiB/s
PHP код:

// dst and src must be 16-byte aligned
// size must be multiple of 16*2 = 32 bytes
static void CopyWithSSENoCache(uint8_tdstuint8_tsrcsize_t size)
{
    
size_t stride sizeof(__m128);
    while (
size)
    {
        
__m128 a _mm_load_ps((float*)(src 0*sizeof(__m128)));
        
__m128 b _mm_load_ps((float*)(src 1*sizeof(__m128)));
        
_mm_stream_ps((float*)(dst 0*sizeof(__m128)), a);
        
_mm_stream_ps((float*)(dst 1*sizeof(__m128)), b);

        
size -= stride;
        
src += stride;
        
dst += stride;
    }

Посмотреть все имплементации можно по ссылке!

// 2007 год.
https://hero.handmade.network/forums...scussion/t/157
<Дзен - Вся вселенная в тебе > | Резюме: https://ch3ll0v3k.github.io/CV/

Последний раз редактировалось pompiduskus; 28.08.2016 в 06:28.
pompiduskus вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно пояснить/прокомментировать код программы, или коды функций "Добавить" "Удалить" "Обновить(редактировать" "Поиск" "Период") ZIRASS PHP 4 15.06.2016 14:23
Создание "мягких" и "жестких ссылок" (Linux) WolfEater Помощь студентам 0 27.09.2015 09:56
Как передать значениет с <input type="text"> в тег <a href="serch.php?serch=(сюда)"> SevenXP PHP 3 22.04.2012 03:14
Как передать данные типа "дата" из формы в таблицу Ярослав Блошенко Microsoft Office Access 1 26.02.2010 18:22
Что происходит на странице с такие JS: <script src="cmp.php?complete&amp;" id="las..." ...>? TwiX JavaScript, Ajax 0 05.02.2010 17:38