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

 WASM Phorum —› WASM.A&O —› com-прога-самовывод (помогите оптимить)

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Июл 25, 2004 03:28:51 · Поправил: ovod

Помогите, плиз, оптимизировать по размеру com-программу,
выводящую свою точную копию на экран (а то уже запарился с ней)
И второе: в Турбо Дебаггере она все нормально кажет, а в консоли XP с глюконатами.
Как пофиксить?

;D:\TASM\Projects\SELF.COM 41 bytes

00000000: B1 52 8A 84 00 01 8A D8 - 46 C0 E8 04 80 E3 0F 3C
00000010: 09 77 04 04 30 EB 02 04 - 37 CD 29 49 74 0A 0F BA
00000020: E1 00 73 DE 86 C3 EB E7 - C3


Её мнемоническое представление (из-под Hiew)
00000000: B152			mov	cl,052
00000002: 8A840001		mov	al,[si][00100]
00000006; 8AD8			mov	bl,al
00000008: 46			inc	si
00000009: C0E804		shr	al,004
0000000C: 80E30F		and	bl,00f
0000000f: 3C09			cmp	al,009
00000011: 7704			ja	000000017
00000013: 0430			add	al,030
00000015: EB02			jmps	000000019
00000017: 0437			add	al,037
00000019: CD29			int	029
0000001B: 49			dec	cx
0000001C: 740A			je	000000028
0000001E: 0FBAE100		bt	cx,000
00000022: 73DE	 		jae	000000002
00000024: 86C3			xchg	al,bl
00000026: EBE7			jmps	00000000F
00000028: C3			retn


Дата: Июл 25, 2004 13:30:09

Еще от одного байтика избавился (теперь их 40)

; D:\TASM\Projects\SELF.COM 40 bytes

00000000: B1 50 8A 84 00 01 8A D8 - 46 C0 E8 04 80 E3 0F B2
00000010: 02 3C 09 77 04 04 30 EB - 02 04 37 CD 29 49 74 07
00000020: 4A 74 DF 86 C3 EB EA C3 -


Её мнемоническое представление (из-под Hiew)
00000000: B150			mov	cl,050
00000002: 8A840001		mov	al,[si][00100]
00000006; 8AD8			mov	bl,al
00000008: 46			inc	si
00000009: C0E804		shr	al,004
0000000C: 80E30F		and	bl,00f
0000000f: B202			mov	dl,002
00000011: 3C09			cmp	al,009
00000013: 7704			ja	000000019
00000015: 0430			add	al,030
00000017: EB02			jmps	00000001B
00000019: 0437			add	al,037
0000001B: CD29			int	029
0000001D: 49			dec	cx
0000001E: 740A			je	000000027
00000020: 4A			dec 	dx
00000021: 74DF	 		je	000000002
00000023: 86C3			xchg	al,bl
00000025: EBE7			jmps	000000011
00000027: C3			retn


Дата: Июл 26, 2004 15:30:58

Воспользуемся самым компактным вариантом преобразования шестнадцатиричной цифры в ASCII-код соответствующего символа

cmp al,10
sbb al,69h
das

,получим

; D:\TASM\Projects\SELF.COM 35 bytes

00000000: B1 46 8A 84 00 01 8A D8 - 46 C0 E8 04 80 E3 0F B2
00000010: 02 3C 0A 1C 69 2F CD 29 - 49 74 07 4A 74 E4 86 C3
00000020: EB EF C3


Её мнемоническое представление (из-под Hiew)
00000000: B150			mov	cl,046
00000002: 8A840001		mov	al,[si][00100]
00000006; 8AD8			mov	bl,al
00000008: 46			inc	si
00000009: C0E804		shr	al,004
0000000C: 80E30F		and	bl,00f
0000000f: B202			mov	dl,002
00000011: 3C0A			cmp	al,00A
00000013: 1C69			sbb	al,069
00000015: 2F			das
00000016: CD29			int	029
00000018: 49			dec	cx
00000019: 740A			je	000000022
0000001B: 4A			dec 	dx
0000001C: 74DF	 		je	000000002
0000001E: 86C3			xchg	al,bl
00000020: EBE7			jmps	000000011
00000022: C3			retn


Дата: Июл 26, 2004 16:28:53 · Поправил: Asterix

Ну как минимум можно ещё байт сэкономить, заменив это:
00000018: 49       dec cx
00000019: 740A     je  000000022

на loop ;-)


Дата: Июл 26, 2004 16:40:10

00000002: 8A840001 mov al,[si][00100]
А что здесь есть гарантия что si на входе = 0 ?

А вобще, если это правильно переписать то думаю в 1.5 раза точно можно уменьшить ;-)


Дата: Июл 26, 2004 18:20:45 · Поправил: Asterix

Как вариант, без прыжков(кроме loop ;-)
macro hex2ascii
 {
   cmp  al,10
   sbb  al,69h
   das
 }


org 100h
use16

code_start = $

mov si, $
mov cx, code_len
@@:
  lodsb
  aam 16
  hex2ascii
  xchg al, ah
  hex2ascii
  int 29h
  xchg al, ah
  int 29h
  loop @B
  ret
code_len = $ - code_start

ЗЫ: fasm однако..
 00000000: BE0001                       mov         si,00100
 00000003: B91E00                       mov         cx,0001E
 00000006: AC                           lodsb
 00000007: D410                         aam         010
 00000009: 3C0A                         cmp         al,00A
 0000000B: 1C69                         sbb         al,069
 0000000D: 2F                           das
 0000000E: 86C4                         xchg        al,ah
 00000010: 3C0A                         cmp         al,00A
 00000012: 1C69                         sbb         al,069
 00000014: 2F                           das
 00000015: CD29                         int         029
 00000017: 86C4                         xchg        al,ah
 00000019: CD29                         int         029
 0000001B: E2E9                         loop        000000006
 0000001D: C3                           retn


Исправлено в соответствии с замечаниями Black_mirror'а.


Дата: Июл 26, 2004 21:29:55

Asterix
aam 16 фасм итак прекрасно ест
да и ret лучше чем int 20h


Дата: Июл 26, 2004 21:44:37

Black_mirror
Спасибо, буду теперь знать :-)

ЗЫ: я под ДОС никогда не писАл %)


Дата: Июл 26, 2004 23:50:49 · Поправил: Asterix

Интересно, что должно находится в cx на первой инструкции, у меня там почему-то размер кода, совпадение или так и должно быть? Если так и должно быть то команду
mov cx, code_len
можно было бы убрать ;-)

Добавлено: видимо это всё-таки глюк из-за отладчика, потому что
при свободном запуске проги cx на входе всё-таки не равно размеру кода.


Дата: Июл 27, 2004 04:48:15 · Поправил: ovod

Если вместо cx использовать cl, то можно урезать еще 1 байт:
00000000: B11D			mov	cl,01D ; 29 байт
00000002: BE0001		mov	si,00100
00000005; AC			lodsb
00000006: D410			aam	010
00000008: 3C0A			cmp	al,00A
0000000A: 1C69			sbb	al,069
0000000C: 2F			das
0000000D: 86C4			xchg	al,ah
0000000F: 3C0A			cmp	al,00A
00000011: 1C69			sbb	al,069
00000013: 2F			das
00000014: CD29			int	029
00000016: 86C4			xchg	al,ah
00000018: CD29			int	029
0000001A: E2E9			loop	000000005
0000001C: C3			retn


Можно попробовать замутить со стеком (должно быть перспективно), чтоб избавиться от повторяющихся блоков

P.S. Ассемблером только вот на днях занялся, до этого на нем ничего не писал.


Дата: Июл 27, 2004 04:58:52

> Если вместо cx использовать cl, то можно урезать еще 1 байт

Так нельзя, никто ведь не гарантировал 0 в ch и поэтому последующие loop могут сглючить, я бы наоборот потерял ещё 1 байт, для надёжности добавив команду cld ;-)


Дата: Июл 27, 2004 05:10:35

Каждый раз при трассировке в дебаггере в начале программы cx у меня 0000h (или дело только в отладчике?). Даже если до этого было что-то другое.
Что значит "последующие loop"?


Дата: Июл 27, 2004 05:15:40

> Каждый раз при трассировке в дебаггере в начале программы cx у меня 0000h

При первой загрузке проги у меня оно равно размеру кода, при последующих рестартах уже нулю.

> Что значит "последующие loop"?

В твоём испарившемся варианте со стеком было два loop ;-)


Дата: Июл 27, 2004 05:24:37

Испарившийся вариант был глючным (заметил, когда вычитывал пост после отправки) и подлежал изничтожению :)


Дата: Июл 27, 2004 05:45:51

Запускаю предварительно прогу 890C0CС3
mov cx,0C0Ch
retn
,а затем уже вышепредставленную
и регистры ax-dx,si,di,bp в нулях.
Так это все-тки дело в отладчике? На чистом DOS`е не пробовал.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083