|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Авг 27, 2003 18:10:11 Это процедура, которая связана с другими моими процедурами декодирующими опкод. Задача процедуры декодировать код регистра в имя. Процедура получает код регистра в EDX, указатель на строку в EDI и параметры - дополнительную информацию в Flags - для данной процедуры важны только два младших бита этих параметров, которые предаставляют собой значение бита w (бит[0]) и наличие\отсутсвие префикса 66h (бит[1]). Процедура должна "написать" имя регистра по указателю EDI, установить EDI на байт соседний к только что написаному имени. Она может изменять EAX, но все остальные регистры должны остаться неизменными (про EDI сказано выше). Интересны ваши мысли но возможности уменьшения размера. В голове крутятся несколько идей по блоку управления и проверки параметров в Flags, но пока "поймать" их немогу :) Может быть Ваши светлые головы помогут ;) Синтаксис MASM. OPTION PROLOGUE:NONE OPTION EPILOGUE:NONE rCode2Str proc Flags ;IN EDI=String out,EDX = reg code ;Flags bit[0]-bit w,bit[1]-if 66h ;OUT EDI = next byte to output string ;EAX trashed, All other regs unchaged pop eax xchg eax,[esp] pushr 16 mov esi,offset regstr push 2 lea esi,[esi][edx*2] ;esi = Str+code*2 popr 1 test al,1 ;if w = 1 je write lea esi,[esi][edx][16] ;esi=Str+16+code*3 inc ecx test al,2 ;if prefix 66h je write inc esi dec ecx write: rep movsb popr 61 retn regstr db 'ALCLDLBLAHCHDHBHEAXECXEDXEBXESPEBPESIEDI' rCode2Str endp OPTION PROLOGUE:PROLOGUEDEF OPTION EPILOGUE:EPILOGUEDEF pushr macro r irpc n,r db (50h or n) endm endm popr macro r irpc n,r db (58h or n) endm endm |
|
|
Дата: Авг 27, 2003 18:31:55 На байт сократил: rCode2Str proc Flags ;IN EDI=String out,EDX = reg code ;Flags bit[0]-bit w,bit[1]-if 66h ;OUT EDI = next byte to output string ;EAX trashed, All other regs unchaged pop eax xchg eax,[esp] pushr 16 ; mov esi,offset regstr push 2 lea esi,[edx][edx][offset regstr] ;esi = Str+code*2 popr 1 test al,1 ;if w = 1 je write lea esi,[esi][edx][16] ;esi=Str+16+code*3 inc ecx test al,2 ;if prefix 66h je write inc esi dec ecx write: rep movsb popr 61 retn regstr db 'ALCLDLBLAHCHDHBHEAXECXEDXEBXESPEBPESIEDI' rCode2Str endp OPTION PROLOGUE:PROLOGUEDEF OPTION EPILOGUE:EPILOGUEDEF |
|
|
Дата: Авг 28, 2003 13:18:46 The Svin А что по скорости ??? Нельзя? |
|
|
Дата: Авг 28, 2003 17:18:31 · Поправил: The Svin Можно что угодно. Печатай код, говори что делает и какие задачи выполняет в отношении оптимизации. Но для меня в данный момент интересна точно описаная задача, и оптимизация по размеру. Накидал мне идей друг Рикки Бауэр. Скоро будет короче версия. |
|
|
Дата: Авг 31, 2003 02:18:48 Если кому интересно,(хотя не видать кому:)) следующая версии написана Р.Бауром (bitRake) которая совместила наиболее эффективные наши идеи. Короче предыдущей на 14 байт: OPTION PROLOGUE:NONE OPTION EPILOGUE:NONE rCode2Str proc Flags ;IN EDI=String out,EDX = reg code ;Flags bit[0]-bit w,bit[1]-if 66h ;OUT EDI = next byte to output string ;EAX trashed, All other regs unchaged pop eax mov BYTE PTR [edi], "E" ; 01y only xchg eax,[esp] push esi shl al,7 lea esi,[edx*4][OFFSET regstr] jns write2 sbb edi, 0 lodsw inc edi write2: movsw pop esi retn regstr BYTE \ 'ALAX','CLCX','DLDX','BLBX',\ 'AHSP','CHBP','DHSI','BHDI' rCode2Str endp ; 30+32 OPTION PROLOGUE:PROLOGUEDEF OPTION EPILOGUE:EPILOGUEDEF |
|
|
Дата: Сен 4, 2003 02:45:28 · Поправил: The Svin Новый вариант пришол в голову уже мне, он построен на совсем другой системе и занимает теперь 59 байт. Рикки оставлся позади, не надолго пологаю :) Чего нить тоже новое выдумает. Эх... Чего никто не отвечает то? Не вдохноляет? Задачка вроде из интересных, короткая но с заковыками :) rCode2Str2 proc Flags pop eax xchg eax,[esp] shl al,7 push esi push edx js @reg3216 and dl,11b stc jmp @lod @reg3216: mov byte ptr [edi],"E" inc edi sbb edi,0 @lod: lea esi,[regstr2][edx][edx] lodsd jnc @store pop edx push edx and edx,100b xor edx,10100b xor ah,dl @store: stosw pop edx pop esi ret regstr2 db 'AXCXDXBXSPBPSIDI' rCode2Str2 endp OPTION PROLOGUE:PROLOGUEDEF OPTION EPILOGUE:EPILOGUEDEF |
|
|
Дата: Сен 4, 2003 03:28:42 · Поправил: The Svin Новая версия. Меня переплюнуюли. by Poimander
rCode2Str proc Flags
;IN EDI=String out,EDX = reg code
;Flags:
;CF = W BIT
;PF = 1 if 66h
;OUT EDI = next byte to output string
;EAX trashed, All other regs unchaged
pop eax
xchg eax, [esp]
mov BYTE PTR [edi], 'E' ;01Y only
push esi
lea esi, [2*edx][OFFSET R70]
shl al, 7
jns short @F
sbb edi, -1
movsw
jmp short @1
@@:
mov al, dl
and al, 4
sub esi, eax
sub esi, eax
xor al, 'L'
movsb
stosb
@1:
pop esi
ret
R70 BYTE 'AXCXDXBX','SPBPSIDI'
rCode2Str endp; 41,16
OPTION PROLOGUE:PROLOGUEDEF
OPTION EPILOGUE:EPILOGUEDEF
|
|
|
Дата: Сен 4, 2003 03:35:16 Господа управители форумом, Второй раз сообщаю - задолбала просто эта ваша защита от спама. Говорит постоянно про какие-то 15 секунд, хотя десятки минут проходят после сообщения. Всё равно не даёт править, говоря про свои безразмерные 15 секунд. Подправтье что-нить у себя там, чтобы эти секунды нормально считались. |
|
|
Дата: Сен 4, 2003 03:46:00 The Svin А что это такое будет? Дизассемблер инструкций четвертого пня в 1К? |
|
|
Дата: Сен 4, 2003 04:01:17 Это пока декодер имени регистра. Написан универсальный декодер modrm и его "хвостов" который в частности использует эту процедуру тоже. Послал декодер на другой топик про дизассемблер. Правда уже нужно обновлять. А вообще можно рассматривать задачу просто как некое упражнение в кодинге. Общий декодер врядли в 1кб влезет, имён больно много. |
|
|
Дата: Сен 4, 2003 06:25:18 · Поправил: Asterix [ The Svin: Второй раз сообщаю - задолбала просто эта ваша защита от спама. Говорит постоянно про какие-то 15 секунд, хотя десятки минут проходят после сообщения. Всё равно не даёт править, говоря про свои безразмерные 15 секунд.] Перезапусти браузер и править можно будет сразу, защита от спама здесь действительно глючит ;-) |
|
|
Дата: Сен 4, 2003 06:55:01 Не получалось у меня. Закрывал Opera, открывал. Заходил снова на сайт - всё одно. Вобще понять не могу логику - то сразу даёт править то не даёт хоть сколь проходит времени. |
|
|
Дата: Сен 4, 2003 07:58:04 · Поправил: Fixer The Svin А почему ты не преобразовываешь сегментные регистры |
|
|
Дата: Сен 4, 2003 17:10:11 Эта для регистров общего назначения. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.164 |