Поиск:

Ответ в темуСоздание новой темы Создание опроса
> ESI, EDI - почему они? 
:(
    Опции темы
stab
Дата 7.7.2007, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



в исходниках часто вижу такое: авторы пытаются использовать ESI, EDI при организации циклов чтения\записи\копирования, принося в жертву работу на регистрах без использования стека. в самом теле цикла нет ни комманд с префиксом rep, ни комманд вроде movsb, т.е. что-то вроде:

Код

; IN: EAX = src, EDX = dst, ECX = count
push    ESI
push    EDI

mov    ESI, EAX
mov    EDI, EDX

loop:
mov    EAX, [ESI]
mov    [EDI], EAX

add    ESI, 4
add    EDI, 4
dec    ECX
jnz    loop

pop    EDI
pop    ESI
ret


исходники довольно новые, датированы нашим веком smile состояние регистров EAX, EDX, ECX после выхода из процедуры никого воздействия на дальнейшую работу не имеет, т.е. их смело можно менять как душе угодно. в чём же смысл этого подхода с EDI\ESI?

з.ы. форум по асму вообще жив? )


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
Kuvaldis
Дата 7.7.2007, 13:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



stab
Как я понимаю: тут сделано простое "ручное" movsd, причем оно медленнее работает (нет аппаратной поддержки), больше по коду (смотрим формат машинной команды) да и вообще не эстетично

ВЫВОД: такой подход от незнания команд

Добавлено через 1 минуту и 31 секунду
А так как код ЯВНО 32-битный, то вместо esi/edi можно использовать любой из регистров общего назначения.


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
stab
Дата 7.7.2007, 13:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



дело в том, что код делался какими-то вроде как гуру, оптимизации под MMX, SSE, т.д. вот я и задумался, может они что-то знают чего не знаем мы?

з.ы. для меня критична именно скорость работы..


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
W4FhLF
Дата 7.7.2007, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 3
Всего: 121



Цитата(Kuvaldis @  7.7.2007,  13:02 Найти цитируемый пост)
причем оно медленнее работает (нет аппаратной поддержки)


Обоснуйте. Люди съевшие собаку на оптимизации с таким мнением несогласны. Для какого процессора и на основании чего делались выводы? 



--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
Kuvaldis
Дата 7.7.2007, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



W4FhLF
Цитата

Обоснуйте. Люди съевшие собаку на оптимизации с таким мнением несогласны. Для какого процессора и на основании чего делались выводы? 

А для чего в архитектуру INTEL были введены строковые команды? ИМХО, все, что делается на аппаратном уровне, должно выполняться быстрее. Даже в универе как-то тестили ради интереса похожие вещи (не хотелось верить, что строковые команды лучше) 

Кстати, как я понимаю, именно поэтому например, сохранение регистров и т.д. при переключении задач стараются делать на аппаратном уровне.

НО! Я могу и ошибаться. Если я не прав, то с удовольствием выслушаю компетентное мнение.


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
W4FhLF
Дата 7.7.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


found myself
****


Профиль
Группа: Участник Клуба
Сообщений: 2831
Регистрация: 2.12.2006

Репутация: 3
Всего: 121



Цитата(Kuvaldis @  7.7.2007,  14:53 Найти цитируемый пост)
А для чего в архитектуру INTEL были введены строковые команды?


Нет, ну хороший вопрос smile Видимо, для удобства. 

Цитата(Kuvaldis @  7.7.2007,  14:53 Найти цитируемый пост)
МХО, все, что делается на аппаратном уровне, должно выполняться быстрее.


Что ты имеешь ввиду? А обычные команды они как по-твоему выполняются? Не ОС же их эмулирует. 


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

Например:
Код

    mov     esi,src
            mov     edi,dest
            mov     ecx,size_of_byte
            cmp     ecx,4
            jl      b_c
            sub     ecx,4
         @@:   
            mov     eax,[esi+ecx]
            mov     [edi+ecx],eax
            sub     ecx,4
            js      @F
            mov     eax,[esi+ecx]
            mov     [edi+ecx],eax
            sub     ecx,4
            jns     @B
         @@:
            add     ecx,4
        b_c:    
            jz      _end
         @@:
            mov     al,[esi+ecx-1]
            mov     [edi+ecx-1],al
            dec     ecx
            jnz     @B
        _end:


Или, немножко из другой области, но всё же приведу:
Код

;================================================================================
;   Процедура копирования строки
;   Возвращаемое значение: eax==длина скопированной строки
;   

align 16
cr_strcpy proc lpDest:DWORD, lpSource:DWORD
    option prologue : none
    option epilogue : none
    
    push    esi
    push    edi

    mov     esi,[esp+16]
    mov     edi,[esp+12]
    jmp     _test_align
    
align 16
 @@:
    mov     al,[esi]
    mov     [edi],al
    add     esi,1
    add     edi,1
    test    al,al
    jz      @ret
_test_align:
    test    esi,3h
    jnz     @B
_st:    
    sub     esi,4
    sub     edi,4
    jmp     _loop
    
align 16
_last:
    mov     al,[esi]                ;копирование последних 0...3 байт
    inc     esi
    mov     [edi],al
    inc     edi
    test    al,al                   ;
    jnz     _last
@ret:    
    lea     eax,[esi-1]
    sub     eax,[esp+16]            ;кол-во скопированных (длина строки)
    pop     edi
    pop     esi
    retn    8
    
align 16
_copy:
    mov     [edi],edx               ;если не конец, сохраняем дворд
_loop:

    add     esi,4
    add     edi,4
    mov     eax,[esi]               ;дворд из первой строки;lea     ecx,[eax-01010101h]     ;вычитаем из каждого байта 1, если был ноль, то будет FFh
    mov     ecx,-01010101h
    mov     edx,eax                 ;загружаем для копирования
    add     ecx,eax
    not     eax                     ;инвертируем, если был ноль будет FFh
    and     ecx,eax                 ;and : если был ноль, на его месте будет FFh
    and     ecx,80808080h           ;на месте исходного нулевого байта будет 80h, в остальных - ноль
    jz      _copy
    jmp     _last                   ;если не ноль (один из байтов = 80h) - конец строки

    
    option prologue : prologuedef
    option epilogue : epiloguedef
    
cr_strcpy endp


http://www.insidepro.com/kk/024/024r.shtml (причём обрати внимание насколько разняться результаты для разных процессоров, так, что единую формулу вывести невозможно)

Это сообщение отредактировал(а) W4FhLF - 7.7.2007, 15:32


--------------------
"Бог умер" © Ницше
"Ницше умер" © Бог
PM ICQ   Вверх
stab
Дата 8.7.2007, 06:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Экс. модератор
Сообщений: 1839
Регистрация: 1.1.2003

Репутация: нет
Всего: 48



W4FhLF, мой вопрос был скорее в том, почему авторы выбрали для работы ESI, EDI, ECX, вместо оригинальных EAX, EDX, ECX.


--------------------
6, 6, 6 - the number of the beast.
PM MAIL WWW   Вверх
dumb
Дата 8.7.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 4
Всего: 158



Цитата(stab @  8.7.2007,  07:45 Найти цитируемый пост)
почему авторы выбрали для работы ESI, EDI, ECX, вместо оригинальных EAX, EDX, ECX. 

потому что "оригинальных" просто не хватает для такой реализации. eax - обменник, ecx - счетчик, нужно еще два для src-dst, а у тебя только edx остался. а коль уж все равно сохраняться, то почему не сделать все через привычные "строковые" регистры?
также не исключен вариант "недо-переделки": автор просто заменил rep movsd на "ручной" цикл, а "обвеску" менять не стал... 
PM MAIL   Вверх
Kuvaldis
Дата 8.7.2007, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



W4FhLF
Сиба за инфу smile Есть мне в чем еще разбираться. +1


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
Kuvaldis
Дата 8.7.2007, 15:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


механик-вредитель
***


Профиль
Группа: Участник Клуба
Сообщений: 1189
Регистрация: 16.6.2006
Где: Минск

Репутация: нет
Всего: 61



кстати, полезная ссылка:
http://www.rsdn.ru/Forum/message/18426.flat.aspx


--------------------
Помни - когда ты спишь, враг не дремлет
Спи чаще и дольше, изматывай врага бессоницей
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm: Общие вопросы"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0887 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.