Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / Assembler (Ассемблер)

Выпуск № 590
от 02.11.2006, 09:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 358, Экспертов: 31
В номере:Вопросов: 3, Ответов: 5


Вопрос № 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 в другой, аналогичный по размеру массив. Если можно код. Заранее всем СПАСИБО.
Отправлен: 27.10.2006, 12:07
Вопрос задал: Попович Игорь Васильевич (статус: Посетитель)
Всего ответов: 3
Мини-форум вопроса >>> (сообщений: 1)

Отвечает: 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

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


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2006, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
Авторские права | Реклама на портале
Версия системы: 4.37 от 04.10.2006
Яндекс Rambler's Top100

В избранное