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

 WASM Phorum —› WASM.WIN32 —› Помогите разобраться с обнулением массива

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


Дата: Янв 17, 2004 10:30:20

При выполнении проги buffer2 забивается сообщениями, которые я патаюсь зарезать.
Пробую вот так:
buffer1 db 48 dup(0)
buffer2 db 48 dup(0)
...
_clear_ proc _2:DWORD
 invoke lstrcpy, _2, offset buffer1
 ret
_clear_ endp 
...
 invoke _clear_, offset buffer2

Дебаггер показывает что обнуляется только первый символ, либо адрес параметра передаётся не правильно.
Я в ASMe не так давно, помогите разобраться.


Дата: Янв 17, 2004 12:16:57

Так какой же это clear. Ты просто копируешь первый буфер во второй как строку. Т.к. первый буфер у тя, видимо, пуст, то lstrcpy и копирует всего один нулевой байт считая, что это пустая строка. Для обнуления используй
RtlZeroMemory, offset buffer2, sizeof buffer2


Дата: Янв 17, 2004 13:33:06

Спасибо!
Я предполагал что lstrcpy просто заменит инфу на пустую строку.


Дата: Янв 17, 2004 17:48:44

Он и делает это. Пустая строка - это и есть "первый символ - нуль, а потом - хоть потоп".


Дата: Янв 18, 2004 00:00:56

Этого-то я не знал.


Дата: Янв 18, 2004 20:10:42
Правка

Four-F
А RtlZeroMemory не сильно погружается в недра системы? Т.е. не сильно ли это "тяжёлая" функция, вызов которой чреват потерей многих сотен тактов процессора?
Может, имеет смысл обычная процедурка, вроде тех, что в MASM32/LIB?


Дата: Янв 19, 2004 02:20:25

IceStudent

Странное предположение :-)


Дата: Янв 19, 2004 03:26:14

[ IceStudent: Т.е. не сильно ли это "тяжёлая" функция,... ]

Может оно и так - смотреть лень. Но в любом случае, для начинающего в самый раз будет.


Дата: Янв 19, 2004 03:54:32

IceStudent
А RtlZeroMemory не сильно погружается в недра системы? Т.е. не сильно ли это "тяжёлая" функция, вызов которой чреват потерей многих сотен тактов процессора?
Не пробовал смотреть kernel32.dll и/или ntdll.dll?
Из ntdll.dll
Exported fn(): RtlZeroMemory - Ord:02B2h
:77FBC7F5 57                      push edi
:77FBC7F6 8B7C2408                mov edi, dword ptr [esp+08]
:77FBC7FA 8B4C240C                mov ecx, dword ptr [esp+0C]
:77FBC7FE 33C0                    xor eax, eax
:77FBC800 FC                      cld
:77FBC801 8BD1                    mov edx, ecx
:77FBC803 83E203                  and edx, 00000003
:77FBC806 C1E902                  shr ecx, 02
:77FBC809 F3                      repz
:77FBC80A AB                      stosd
:77FBC80B 0BCA                    or ecx, edx
:77FBC80D 7504                    jne 77FBC813
:77FBC80F 5F                      pop edi
:77FBC810 C20800                  ret 0008

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:77FBC80D(C)
|
:77FBC813 F3                      repz
:77FBC814 AA                      stosb
:77FBC815 5F                      pop edi
:77FBC816 C20800                  ret 0008


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