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

 WASM Phorum —› WASM.ASSEMBLER —› Обнулить 8 байт стек-фрейма

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


Дата: Июл 10, 2004 22:55:04

Хм... Сначала я написал
pxor mm0, mm0 ; 3 bytes
movq [esp], mm0 ; 4 bytes

Потом подумал что наверное это не хорошо...
Что-нибудь по-компактнее предложете?


Дата: Июл 10, 2004 23:24:43

diver
Если число в eax меньше 80000000h, то можно так:
pop edx
pop edx
cdq
push edx
push edx


Дата: Июл 11, 2004 00:06:02

Можно же и так, 4 байта:

push 0
push 0


Дата: Июл 11, 2004 00:33:01

S_T_A_S_
А при этом вершина не сдвинется?


Дата: Июл 11, 2004 01:04:00

cresta

Конечно, сдвинется.


imho такой вопрос сложно рассматривать без контекста.
Как правило, стековый фрейм нужно сначала ещё и создать, а потом очищать.
Т.е. я предлагаю этими командами не только обнулять байты, но и создавать фрейм :).
Корректировка вершины будет как и положено, в конце подпрограммы.
Таким образом, возможно получится сэкономить ещё несколько байтов.


Дата: Июл 11, 2004 01:21:52

На таких уровнях (4-5-6 байт) вся экономия может быть съедена восстановлением вершины. Хотя, возможно, обнуление 8 байт даёт какой-то ощутимый выигрыш в другом месте...


Дата: Июл 11, 2004 01:28:14

Если нужно занулить по адресу [esp] без изменения восемь байт, нужно типа
and [esp],0
and [esp+4],0
Это будет 9 байт.
можно pusha ми. Но сначала "подняв" esp
add esp,8
push 0
push 0
тоже 9 байт но побыстрее.


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