Опкоды Сишного компилятора cl и Masm/ml

Тема в разделе "WASM.ASSEMBLER", создана пользователем s_d_f, 9 янв 2011.

  1. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Для многих инструкций (add,sub,or,xor,sbb,adc) существует по два опкода с разным положением операндов определяемых полями reg и reg/mem байта modrm. Поднятая тема может показаться мелочной, но мне с этим нужно как можно лучше разобрать для написания ассемблера, что-б с этим в дальнейшем проблем не возникало.

    Например для инструкции add edx,esi возможны два опкода.
    Код (Text):
    1. 00400000:03D6                            altm(1) add edx,esi    ;опкод генерируют cl и ml altm - псевдомакрос
    2. 00400002:01F2                            add edx,esi        ;обычный опкод для моего ассемблера
    В моём ассемблере предусмотрена возможность генерации опкода 03D6 вместо 01F2, но только через псевдо макрос altm. Быть может опкод 03D6 лучше чем 01F2. Например выполняется быстрее.

    Интересно узнать у кого какие мысли на эту тему.
     
  2. cruzadrn

    cruzadrn New Member

    Публикаций:
    0
    Регистрация:
    3 янв 2011
    Сообщения:
    7
    посмотри может поможет
    http://rapidshare.com/files/441622671/OPCODES2.rar
     
  3. TriX

    TriX Member

    Публикаций:
    0
    Регистрация:
    7 мар 2008
    Сообщения:
    68
    Инструкции идентичны по размеру и по скорости выполнения(а главное по смыслу:), так что не важно, как ты их будешь кодировать. Borland и fasm генерируют 01 F2, cl и ml 03 D6.
    да, в тот же список mov и cmp можешь добавить.
     
  4. s_d_f

    s_d_f New Member

    Публикаций:
    0
    Регистрация:
    15 май 2008
    Сообщения:
    342
    Проверял скорость у себя с помощью такого кода
    Код (Text):
    1.     rdtsc
    2.     mov ebx,eax
    3.     mov ecx,edx
    4.     REPEAT 100000
    5.         db 01h,0F2h
    6.     ENDM
    7.     rdtsc
    8.     sub eax,ebx
    9.     sbb edx,ecx
    10.     mov ebx,eax
    11.     mov ecx,edx
    12.     rdtsc
    13.     mov esi,eax
    14.     mov edi,edx
    15.     REPEAT 100000
    16.         db 03h,0D6h
    17.     ENDM
    18.     rdtsc
    19.     sub eax,esi
    20.     sbb edx,edi
    21.     ;ecx:ebx    количество clock`oв для db 01h,0F2h
    22.     ;edx:eax    количество clock`oв для db 03h,0D6h
    Большой разницы не обнаружил.
    Единственное что опкод 01 может записывать в память, а 03 только читает.
    Если попытаться расписать алгоритмы выполнения.
    Код (Text):
    1. add dword ptr [edx],esi - опкод 0132
    2. 1. Чтение из памяти dword ptr [edx].
    3. 2. Собственно сложение.
    4. 3. Запись результата в dword ptr [edx].
    5.  
    6. add edx,dword ptr [esi] - опкод 0316
    7. 1. Чтение из памяти dword ptr [esi].
    8. 2. Собственно сложение, и всё. Результат в регистре edx.
    Возможно на каких-нибудь моделях процессоров это имеет значение.