DevProg: Блог для программистов

Секреты программирования. Примеры разработки. Обзоры программёрского софта, блогов и форумов и просто полезные советы!

Archive for Ноябрь 2008

Узелок впрок! Как отобразить окно без заголовка в Ассемблере?

Posted by devprog на Ноябрь 4, 2008

блог программистовВозможно отображать окна, без их заголовка. Достаточно лишь удалить у них свойство WS_CAPTION, которое отвечает как раз за его отображение. Так же, таким способом можно удалять и выставлять другие свойства окон.

Рассмотрим пример:

invoke GetWindowLong,hWnd,GWL_STYLE ; получение информации об окне
and eax,not WS_CAPTION ; удаление WS_CAPTION
invoke SetWindowLong,hWnd,GWL_STYLE,eax ; установка свойств окна

Так, мы получаем сначала все стили окна, в одном числе. А потом из него убераем стиль WS_CAPTION и выставляем всё обратно, но уже без заголовка.

В Delphi, такое возможно путём установки поля BorderStyle значением bsNone.

Вы можете присылать свои советы для рубрики “Узелок впрок” по адресу seorobo@gmail.com

Реклама

Posted in Ассемблер, Узелок впрок | 11 комментариев »

Ассемблер для начинающих. Урок III — Сравнения и переходы (более подробно)

Posted by devprog на Ноябрь 4, 2008

Привет. На этом уроке поговорим про операторы cmp & условные переходы более подробно. Для начала обратите внимание на таблицу условных переходов. Вы уже видели нечто подобное на прошлом уроке:

Теперь давайте посмотрим на практике. Есть код:

1) mov eax,32  ; в EAX 32h

2) mov ebx,33  ; в EBX 33h

3) cmp eax,ebx  ; сравниваем EAX c EBX

4) jne metka  ; Если не равны то прыгаем на metka

5) sub eax,eax  ; иначе обнуляем EAX

metka:

6) invoke ExitProcess,0 ; завершаем процесс

Разберём каждую инструкцию:

1) mov — инструкция, которая присваивает значения. В данном случаи мы присваиваем регистру EAX число 32h (hex)

2) Аногогично, только теперь регистру EBX присваиваеться 33h

3) cmp — оператор сравнения (Compare — сравнивать). Сравнивает EAX c EBX и взависимости от результата выставляет соответствующие арифметические флаги (у нас ZF, SF, CF — но не подумайте что это все флаги!)

4) Наш условный переход, чтобы его понять обратимся к таблице. Смотрим тип операндов — любые, значит не имеет значения, со знаком числа или без. Далее смотрим критерий условного перехода — 1операнд НЕ РАВЕН 2операнду. И третие — смотрим значение флага, в данном случаи это флаг «нуля» (ZF — Zerro Flag). Итак из таблицы видно что, чтобы мы прыгнули на метку — регистры EAX & EBX не должны быть равны и флаг нуля устанавливаеться в 0(нуль). То есть если они не равны — мы прыгаем на метку «metka»

5) Так как переходу быть — процессор не выполняет эту инструцкию. Она предназначена для вычитания. То есть если бы перехода не было она бы вычла из EAX, EAX (значения) — тем самым обнулив его.

6) Уже до боли знакомый вам вызов функции API ExitProcess, который просто завершит программу.

Если бы мы в 4) пункте написали бы не JNE a JZ то мы бы не прыгнули на метку, так как регистры EAX & EBX не равны между собой.

Для полноты всей картины давайте воспроизведём всё выше описаное в полноценную программу:

include ‘D:\FASM\include\win32ax.inc’

.code

start:

mov eax,32              ; в EAX 32h

mov ebx,33              ; в EBX 33h

cmp eax,ebx             ; сравниваем EAX c EBX

jne metka               ; Если не равны то прыгаем на metka

sub eax,eax             ; иначе обнуляем EAX

metka:

invoke ExitProcess,0    ; завершаем процесс

.end start

Вот и весь урок. Можно эксперементировать задавая разные значения регистрам и изменяя прыжок — так вы быстрее поймёте. Есстественно нужно это делать в отладчике. Возьмите Olly. Кстати вот этот наш кусок кода в отладчике выглядит следующим образом:

Красная стрелочко означает что сейчас произойдёт переход, и я ещё там написал что флаг нуля = 0 (нуль), чтобы не постить весь экран от Olly. А вот Olly лучше скачайте и посмотрите сами! Пока.

Posted in Ассемблер, Новичку | 8 комментариев »

Узелок впрок! Как реализовать функцию Undo в TMemo ?

Posted by devprog на Ноябрь 3, 2008

блог программистовНе многие программисты на Delphi знают, что в компоненте TMemo есть функция отмены последней правки. Её вызов выглядит следующим образом:

Memo1.Perform(EM_UNDO,0,0);

Для проверки, киньте на форму Memo и Button и по OnClick напишите вышенаписанный код.

 

Вы можете присылать свои советы для рубрики “Узелок Впрок” по адресу seorobo@gmail.com. Спасибо.

Posted in Delphi, Узелок впрок, Хитрости | 3 комментария »

Delphi. Для чего используется поле Tag ?

Posted by devprog на Ноябрь 3, 2008

Приветствую вас, дорогие читатели блога. С этого момента, на блоге для программистов будут выкладываться советы по языкам программирования. Назвал я эту рубрику — Узелок впрок. Вы можете присылать мне ваши полезные советы по разным языкам программирования, с указанием прямой ссылки на ваш сайт. Они обязательно будут опубликованны на страничках сего блога. Ну а вам, почёт и уважение, и прямая ссылка.

Для чего используется поле Tag ?

Поле Tag введено разработчиками во все компоненты специально и исключительно для нужд программиста и может быть использовано в любое время и для любых целей. Компоненты никогда сами не используют это поле и пользователь в праве расчитывать, что и Ваш компонент его использовать самостоятельно не будет. Поле Tag например можно использовать как какой либо признак чего либо, для любого из компонентов. Так же поле Tag ещё называют инженерным полем. Поле Tag имеет тип LongInt.

Posted in Delphi, Узелок впрок | Отмечено: | 3 комментария »

Стили программирования. Выбираем свой!

Posted by devprog на Ноябрь 3, 2008

Все программируют по разному. Кто-то предерживаеться рационального стиля кто-то стиля Алмена, а кто-то изобретает свои, всё новые и новые стили программирования. В данный момент я предлагаю вам выбрать самый удобный для себя стиль программирования. Вы поймёте это сразу, просто взглянув на кусок кода.

Рациональный стиль:


Один из наиболее распространённых стилей. Его начали использовать ещё Керниган и Ричи — авторы языка Си. Выглядит он примерно вот так:

if (perem) {
print(«perem is true»);
}

Сейчас даже Ява программисты используют этот стиль, но на мой взгляд — он не удобен.

Стиль Алмена (стиль BSD)

if (perem)
{
    print(«perem is true»);
}

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

Стиль Whitesmith

if (perem)
{
print(«perem is true»);
}

Мы не отступаем ни одного пробела после начала блока. Стиль по моему более чем неудобный…

Стиль GNU


Количесиво пробелов-отступов должно быть кратным числу 2. Не больше 8. То есть 2,4…8.

perem = true;
if (perem)
{
        print(«perem is true»);
}
else
{
        print(«perem is false»);
}

Ну как? Какой вы выбрали стиль? Я думаю или GNU или BSD. Я прав?

Posted in Новичку, Программирование, С и С++ | 5 комментариев »