Для многих инструкций (add,sub,or,xor,sbb,adc) существует по два опкода с разным положением операндов определяемых полями reg и reg/mem байта modrm. Поднятая тема может показаться мелочной, но мне с этим нужно как можно лучше разобрать для написания ассемблера, что-б с этим в дальнейшем проблем не возникало. Например для инструкции add edx,esi возможны два опкода. Код (Text): 00400000:03D6 altm(1) add edx,esi ;опкод генерируют cl и ml altm - псевдомакрос 00400002:01F2 add edx,esi ;обычный опкод для моего ассемблера В моём ассемблере предусмотрена возможность генерации опкода 03D6 вместо 01F2, но только через псевдо макрос altm. Быть может опкод 03D6 лучше чем 01F2. Например выполняется быстрее. Интересно узнать у кого какие мысли на эту тему.
Инструкции идентичны по размеру и по скорости выполнения(а главное по смыслу, так что не важно, как ты их будешь кодировать. Borland и fasm генерируют 01 F2, cl и ml 03 D6. да, в тот же список mov и cmp можешь добавить.
Проверял скорость у себя с помощью такого кода Код (Text): rdtsc mov ebx,eax mov ecx,edx REPEAT 100000 db 01h,0F2h ENDM rdtsc sub eax,ebx sbb edx,ecx mov ebx,eax mov ecx,edx rdtsc mov esi,eax mov edi,edx REPEAT 100000 db 03h,0D6h ENDM rdtsc sub eax,esi sbb edx,edi ;ecx:ebx количество clock`oв для db 01h,0F2h ;edx:eax количество clock`oв для db 03h,0D6h Большой разницы не обнаружил. Единственное что опкод 01 может записывать в память, а 03 только читает. Если попытаться расписать алгоритмы выполнения. Код (Text): add dword ptr [edx],esi - опкод 0132 1. Чтение из памяти dword ptr [edx]. 2. Собственно сложение. 3. Запись результата в dword ptr [edx]. add edx,dword ptr [esi] - опкод 0316 1. Чтение из памяти dword ptr [esi]. 2. Собственно сложение, и всё. Результат в регистре edx. Возможно на каких-нибудь моделях процессоров это имеет значение.