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

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

<< . 1 . 2 .

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


Дата: Июл 27, 2004 07:18:12 · Поправил: ovod

Этюд со стеком (28 байт)
00000000: BE0001		mov	si,00100
00000003: B11C			mov	cl,01C
00000005; 51			push	cx
00000006: B102			mov	cl,002
00000008: AC			lodsb	
00000009: D410			aam	010
0000000B: 86C4			xchg	al,ah
0000000D: 50			push	ax
0000000E: 3C0A			cmp	al,00A
00000010: 1C69			sbb	al,069
00000012: 2F			das
00000013: CD29			int	029
00000015: 58			pop	ax
00000016: E2F3			loop	00000000B
00000018: 59	 		pop	cx
00000019: E2EA			loop	000000005
0000001B: C3			retn


Дата: Июл 27, 2004 14:28:24

Этот вариант проигрывает, cl всё-таки нужно заменить на cx,
да и два loop нехорошо.


Дата: Июл 27, 2004 15:02:00

если cl заменить на cx, то он не проигрывает, а равен по размеру с безстечным. Согласен, что два loop`а нехорошо.
Поправил ошибку (было mov cl,001)


Дата: Июл 27, 2004 17:07:53

Вот написал прогу для медитации по поводу сотояния регистров на Entry Point :-)

335236230__first_com3.com


Дата: Июл 27, 2004 18:43:20

ovod
Ну если тебя не смущают два loop и два push то вот такой вариант.
 00000000: BE0001                       mov         si,00100
 00000003: B91C00                       mov         cx,0001C
 00000006: AC                           lodsb
 00000007: 51                           push        cx
 00000008: D410                         aam         010
 0000000A: B90200                       mov         cx,00002
 0000000D: 86C4                         xchg        al,ah
 0000000F: 3C0A                         cmp         al,00A
 00000011: 1C69                         sbb         al,069
 00000013: 2F                           das
 00000014: CD29                         int         029
 00000016: E2F5                         loop        00000000D
 00000018: 59                           pop         cx
 00000019: E2EB                         loop        000000006
 0000001B: C3                           retn


Оптимизация заменой cx на cl считается несостоятельной, так что смею предположить что это окончательный вариант ;-)))


Дата: Июл 27, 2004 19:14:03

Может быть я что-то не то делаю?
D:\FASM>self5
BE0001B11C51B102ACD41086C4503C0A1C692FCD2958E2F359E2EAC3
D:\FASM>d:\home\drivers\335236230__first_com3
ax=0000
bx=0000
dx=0527
cx=00FF
si=0100
di=FFFE
bp=091E
sp=FFFE
D:\FASM>self5
BE0001B11C51B102ACD41086C4503C0A1C692FCD2958E2F359E2EAC3
D:\FASM>
Как сгенерировать ситуацию, когда бодяга с cl упадет на бок?


Дата: Июл 27, 2004 19:41:36

ovod
> Как сгенерировать ситуацию, когда бодяга с cl упадет на бок?

Это нигде не документировано.
Если гипотетически предположить что ch на входе может быть не 0, то всё рухнет :-)
Далее если дальше смотреть в сторону не документированности, то я вот смотрю что si на входе равно 100h, поэтому можно убрать строку
mov si, $
но опять же никто не гарантирует что это будет работать под всеми виндами ;-)


Дата: Июл 27, 2004 20:46:35 · Поправил: ovod

Если убрать mov si,$, то в консоли XP все чудно выполняется, а если в отладчике, то с пургеном.
таким образом
org	100h			
	use16				

    start = $

	;mov 	si,start
 	mov 	cl,code_len ; mov cx,code_len
@@: 	
	push 	cx
	mov	cl,2 ; mov cx,2
	lodsb
	aam	16
@l:	xchg	al,ah
	cmp	al,10
	sbb	al,69h
	das
	int	29h
	loop	@l
	pop	cx
	loop	@@
	ret	

    code_len = $-start

считаем экспериментальной: если у кого-нить, когда-нить, под какой-нить осью заглючит, просим отписАть сюда.

P.S. Спасибо всем большое за участие! Узнал много интересного, а главное полезного.


Дата: Июл 27, 2004 21:08:11

ovod
Это глючные отладчики, в TRW2000 показывается в регистрах то же самое что и про свободном запуске проги!


Дата: Июл 27, 2004 21:19:01

Немного в оффтоп: Хочу закачать какой-нить отладчик. WinDBG, SoftIce или TRW2000? Чтоб в XP со всем, чем угодно работал.


Дата: Июл 27, 2004 21:29:39

В XP работают только первые два, TRW2000 для win98 :-)


Дата: Июл 27, 2004 23:30:53 · Поправил: Asterix

Кстати, вот слегка оптимизированный вариант проги выводящий значения регистров на старте, может кому и пригодится ;-)
macro hex2ascii
 {
   cmp  al,10
   sbb  al,69h
   das
 }

org 100h
use16

  mov [temp_reg], sp
  push ax
  push bx
  push dx
  push cx
  push si
  push di
  push bp
  mov si, (_sp - _ax)
  mov cx, 8
  jmp @do
@@:
  pop [temp_reg]
@do:
  call convert_proc
  mov WORD [_ax+si], ax
  mov WORD [_ax+si+2], dx
  sub si, (_bx - _ax)
  loop @B

; вывод строки
  mov ah, 9
  mov dx, string
  int 21h
  ret

convert_proc:
  mov al, BYTE [temp_reg]
  aam 16
  hex2ascii
  xchg al, ah
  hex2ascii
  mov dx, ax
  mov al, BYTE [temp_reg+1]
  aam 16
  hex2ascii
  xchg al, ah
  hex2ascii
  ret

temp_reg  dw  ?

string  db 'ax='
   _ax  rb 4
        db 13,10
        db 'bx='
   _bx  rb 4
        db 13,10
        db 'dx='
   _dx  rb 4
        db 13,10
        db 'cx='
   _cx  rb 4
        db 13,10
        db 'si='
   _si  rb 4
        db 13,10
        db 'di='
   _di  rb 4
        db 13,10
        db 'bp='
   _bp  rb 4
        db 13,10
        db 'sp='
   _sp  rb 4
        db '$'

<< . 1 . 2 .


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