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

 WASM Phorum —› WASM.ASSEMBLER —› push 0 (и так пять раз)

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


Дата: Мар 15, 2004 23:35:44

PUSH 37
PUSH 0
PUSH 0
PUSH 0
PUSH 0
PUSH 0
PUSH hEdit
CALL SetWindowPos

Это можна оптимизировать или это уже оптимизировано ?


Дата: Мар 15, 2004 23:40:35

А как насчет
xor eax, eax
push eax
push eax
...


Пните, если не прав, но, кажется, регистр будет быстрее, чем константа...


Дата: Мар 16, 2004 00:14:45 · Поправил: Asterix


Дата: Мар 16, 2004 00:15:53

Ага , и плюс 3 байта экономятся .

6A00 - PUSH 0
50 - PUSH EAX


Дата: Мар 16, 2004 00:32:17

Ещё возможен вариант из статьи по ссылке
push 5
pop ecx
@@:
push 0
loop @B


Дата: Мар 16, 2004 00:33:22

Asterix

Да, ты прав. Но цикл использовать - это извращение.
Поэтому xor eax,eax вполне хватит.


Дата: Мар 16, 2004 04:37:46 · Поправил: Black_mirror

bogrus
Если ранее была директива .radix 16, то можно так:
PUSH 37h
SUB ESP,20d
PUSH hEdit 
CALL SetWindowPos 


Дата: Мар 16, 2004 08:31:11

SUB ESP,20
Вот так лучше не делать никогда.. Откуда в стеке нули сами по себе возьмутся?


Дата: Мар 16, 2004 11:52:46

Помнится достаточно оригинальный и быстрый способ заполнения памяти был такой (z80) :
ld r1,src
ld r2,src+1
ld r3,length
ldir
операция производит move одного куска памяти в другой. Но из-за того, что куски памяти пересекаются, происходит эффект, когда первый байт расползается по всей области.
p.s. имена регистров не помню.


Дата: Мар 16, 2004 12:39:25

bogrus
Первая команда это PUSH 37h или PUSH 37d?

S_T_A_S_
Если первая команда PUSH 37h, то это такой набор флагов:
SWP_NOSIZE          0x0001
SWP_NOMOVE          0x0002
SWP_NOZORDER        0x0004
SWP_NOACTIVATE      0x0010
SWP_FRAMECHANGED    0x0020  /* The frame changed: send WM_NCCALCSIZE */

Поэтому все эти пять нулей функцией игнорируются.


Дата: Мар 16, 2004 13:11:26

xor eax, eax
push eax
...
Пните, если не прав, но, кажется, регистр будет быстрее, чем константа...


Мне почему-то кажется что reg и imm оба будут по одному такту, так что на xor reg, reg пойдет лишний такт.


Дата: Мар 16, 2004 13:45:50

rst
Помнится достаточно оригинальный и быстрый способ заполнения памяти был такой (z80) :
ld hl,src
ld de,src+1
ld bc,length-1
mov [hl],0
ldir 
Но это мадленный был способ..
Самый быстрый - как раз серия push в развернутом цикле (штук по 200 доходило подряд)


Black_mirror
Теперь понял. Без бутылки т.е. контекста тут не разобрать :)


Dr.Golova
Мне почему-то кажется что reg и imm оба будут по одному такту, так что на xor reg, reg пойдет лишний такт.

А есть смысл здесь такты считать? Там следом API Call. Да и push - довольно медленная операция
IMHO - единственно смысл здесь уменьшать размер


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