· Начало · Статистика · WASM.RU · Noir.Ru ·

 WASM Phorum (Оффлайн - 24.11.2003) —› WASM.ASSEMBLER —› rep movs и rep stos

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


Дата: Май 19, 2003 19:29:10

Вопросик следующий:
W32Dasm показывает
F3 repz
AA stosb
но в fasm я записал rep stosb в доке я прочитал, что stos не меняет флагов значит ли это, что засылать в цепочку можно нули и repz не остановит пересылку раньше времени (т.е. раньше чем сх не станет равен 0) из-за того, что будет заслан ноль?
И такой макрос
macro ZeroInit buffer,count
{
mov edi,buffer
mov ecx,count
xor eax,eax
cld
rep stosb
}
будет заменой RtlZeroMemory т.е.
ZeroInit [lpBuf],100
заполнит ста нулями память начиная с lpBuf?
С уважением,pas.


Дата: Май 19, 2003 20:13:04

F3AA <- rep stosb
значит ли это, что засылать в цепочку можно нули и repz не остановит пересылку раньше времени
Совершенно верно! REP(Z) не остановит вашу пересылку.

будет заменой RtlZeroMemory т.е.
ZeroInit [lpBuf],100
заполнит ста нулями память начиная с lpBuf?

Заполнит, конечно!


Дата: Май 19, 2003 21:58:58

Спасибо.


Дата: Июн 3, 2003 17:23:47

Может оптимизация под Pentium не нужна,
но я написал бы:
<pre>
mov edi,buffer
mov ecx,count
shr ecx,2 ; обнулять двойными словами
xor eax,eax
cld
Label:
dec ecx ; флаг нуля выставляется здесь
stosd
jnz Label
</pre>


Дата: Июн 3, 2003 20:49:29

misyachniy
Когда я решал как писать я рассматривал и такую возможность, но тогда нужно будет длинну указывать в двойных словах, а иногда нужно будет и нечётное количество байт обнулить. Тут видимо надо 3 разных макроса писать для байт, слов и двойных слов.
С уважением, pas.


Дата: Авг 29, 2003 17:13:20 · Поправил: SolidCode

Я бы предложил тот вариант, который видел где-то в виндовой библиотеке (то ли kernel32, то ли user32). Короче код для обнуления буфера такой.

mov ecx,nSizeBuf
xor eax,eax
mov edi,lpBuf
mov edx,ecx
shr ecx,2
rep stosd
and edx,3
jnz @dobytes
ret
@dobytes:
mov ecx,edx
rep stosb
ret

Т.о. на @dobytes мы попадаем только, если размер не выровнен по 4-байтной границе.


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