|
|
| Посл.отвђт | Сообщен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 |