|
|
| Посл.отвђт | Сообщен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`е не пробовал. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083 |