· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.A&O —› Reg code to name размеру

Посл.отвђт Сообщен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