Вопрос № 60305: Уважаемые эксперты. Можно ли проверить значение переменной (уже зарезервированной и возможно инициализированной) на этапе трансляции программы для построения блока условной компиляции?...Вопрос № 60357: Здравствуйте, господа эксперты! Я программирую на С++ в частности MSVC2003, а с ассемблером почти совсем не знаком. Но вот встала такая необходимость каким-либо образом оптимизировать функции MEMSET и MEMCPY. В связи с чем
очень хочется спросить у ва...Вопрос № 60395: Приветствую, Уважаемые Эксперты!
У меня скорее просьба, чем вопрос: есть исходный листинг проги
__________________________
.386
.model flat, stdcall
option casemap:none
include C:ASMmasm32includewindows.inc
include C:...
Вопрос № 60.305
Уважаемые эксперты. Можно ли проверить значение переменной (уже зарезервированной и возможно инициализированной) на этапе трансляции программы для построения блока условной компиляции?
Отправлен: 26.10.2006, 23:16
Вопрос задал: Domian (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: ADSota
Здравствуйте, Domian!
Нельзя. Можно использовать проверку "присутствия" данной переменной (зарезервированность имени). Или инициализировать ее константой, а в условиях компиляции проверять значение этой константы.
--------- Открыть глаза навстречу солнцу
Ответ отправил: ADSota (статус: Специалист)
Ответ отправлен: 27.10.2006, 09:16
Вопрос № 60.357
Здравствуйте, господа эксперты! Я программирую на С++ в частности MSVC2003, а с ассемблером почти совсем не знаком. Но вот встала такая необходимость каким-либо образом оптимизировать функции MEMSET и MEMCPY. В связи с чем очень хочется спросить у вас не знает ли кто-нибудь способ максимально быстро проинициализировать большой массив типа DOUBLE, переменной типа DOUBLE, а также как можно быстро скопировать один массив DOUBLE в другой, аналогичный по размеру массив. Если можно код. Заранее всем СПАСИБО.
Отвечает: Mihasic
Здравствуйте, Попович Игорь Васильевич!
Вообще-то эти функции и так оптимизированы по максимуму, бывший коллега проверял как-то от отсутствия другой работы.
А в ассемблере для такой вот операции Вам стоит взглянуть в сторону цепочных команд:
stos (заносит содержимое аккумулятора в приемник - обычно приемник es:[edi] - адрес приемника)
movs (копирует из источника в приемник, обычно это ds:[esi], es:[edi])
И не забывать про применяемый к ним "rep", который в зависимости от флага направления инкрементирует или декрементирует esi, edi, в зависимости от операции (а также декрементирует ecx и рповеряет его на равенство нулю)
Ответ отправил: Mihasic (статус: 8-ой класс)
Ответ отправлен: 27.10.2006, 12:31 Оценка за ответ: 5 Комментарий оценки: Эти функции оперируют 4 байтными блоками. А хотелось бы побольше.
Отвечает: Pinkbyte
Здравствуйте, Попович Игорь Васильевич!
А больше и не получится - СТАНДАРТНЫЕ команды ассемблера не позволяют использовать данные(за раз) больше чем разрядность(обычно 32 бита) вашего процессора. Правда есть еще и спец команды(MMX,SSE) и т.д. Но это история другая - они не везде могут поддерживаться...
--------- Нейтральность - высшее достижение сознания
Ответ отправил: Pinkbyte (статус: 3-ий класс)
Ответ отправлен: 27.10.2006, 22:03 Оценка за ответ: 4
Отвечает: Bob Johnson
Здравствуйте, Попович Игорь Васильевич!
проблема в том, что скорость записи в физическую память намного ниже скорости работы самого процессора, поэтому при работе с большими блоками оптимизация практически не нужна.
но уж если говорить о быстрой работе с переменными типа double, то нужно использовать sse 2, где инструкции позволяют считывать/записывать по два double за одну команду. это будет быстрее стандартной memcpy.
Ответ отправил: Bob Johnson (статус: Академик) Россия, Калуга WWW:Программирование ---- Ответ отправлен: 28.10.2006, 02:27 Оценка за ответ: 4
Вопрос № 60.395
Приветствую, Уважаемые Эксперты!
У меня скорее просьба, чем вопрос: есть исходный листинг проги
__________________________
.386
.model flat, stdcall
option casemap:none
include C:ASMmasm32includewindows.inc
include C:ASMmasm32includekernel32.inc
include C:ASMmasm32includeuser32.inc
includelib C:ASMmasm32libuser32.lib
includelib C:ASMmasm32libkernel32.lib
.data
MsgCaption db "Я изучаю ассемблер!",0
MsgBoxText db "Здравствуй, мир!",0
.code
start:
invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, MB_OK
invoke ExitProcess,NULL
end start
__________________________
После компиляции соответственно получается окошко. Необходимо модифицировать этот код так, чтобы прога прописывала себя в реестр после запуска, например в раздел автозагрузки.
Я только только начал изучать ассемблер, поэтому пока моих познаний абсолютно не хватает. :( Если у кого-нибудь возникнет желание мне помочь, я буду примного благодарен!
Отправлен: 27.10.2006, 19:46
Вопрос задал: LiFF (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Pinkbyte
Здравствуйте, LiFF!
В приложении вы найдете часть исходника моей программы, ответственной за работу с реестром- разобрацца в ней труда не представляет...
в RegCreateKey засылаем один из корневых ключей, в вашем случае - HKEY_CURRENT_USER
затем адрес строки с именем РАЗДЕЛА, который надо открыть - то есть все от HKCU до Run включительно через слеши(как в Regedit)
Следующий 2 параметра необязательны - туда пишем NULL, в качестве режима изменения рееста используем REG_OPTION_NON_VOLATILE - стандартный режим. Доступ к ключу - полный. Следующим параметром идет адрес DWORD-переменной, которая получит идентификатор открытого ключа, затем необяз. параметр NULL.
RegSetValue добавит или установит значение указанного вами параметра в открытом ранее разделе реестра:
hRegKey - открытый ранее ключ
RunKey_Name - строка с ИМЕНЕМ записываемого параметра
REG_SZ - тип параметра, в данном случае - ASCIIZ строка
PathToEXE - полный путь к текущему Exe(найдете сами)
SIZEOF PathToEXE - размер строки с полным путем
Приложение:
--------- Нейтральность - высшее достижение сознания
Ответ отправил: Pinkbyte (статус: 3-ий класс)
Ответ отправлен: 27.10.2006, 22:12