Страницы

Поиск по вопросам

Показаны сообщения с ярлыком masm32. Показать все сообщения
Показаны сообщения с ярлыком masm32. Показать все сообщения

понедельник, 24 февраля 2020 г.

Почему у меня SetPixel не отрисовывает пиксель?

#winapi #ассемблер #masm32 #gdi


Почему у меня SetPixel не отрисовывает пиксель на форме?

WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
  switch wmsg
    case WM_INITDIALOG
      invoke SendMessage, hwnd, WM_SETICON, 1, FUNC(LoadIcon, NULL, IDI_ASTERISK)
    case WM_PAINT
      invoke SetPixel, hwnd, 15, 20, 65285
    case WM_CLOSE
      exit_program:
      invoke EndDialog, hwnd, 0
    endsw
  xor eax,eax
ret
WndProc endp

    


Ответы

Ответ 1



В качестве первого параметра SetPixel принимает не идентификатор окна, а идентификатор контекста устройства (в данном случае, идентификатор контекста окна). Контекст устройства упрощенно можно сравнить с холстом, на котором происходит рисование. В вашем случае нужно получить этот идентификатор с помощью функции BeginPaint, нарисовать пиксель, потом освободить контекст при помощи EndPaint. Код для обработки сообщения WM_PAINT будет примерно такой: invoke BeginPaint, hwnd, addr ps invoke SetPixel, eax, 15, 20, 65285 invoke EndPaint, hwnd, addr ps Также необходимо объявить переменную ps, которая является структурой PAINTSTRUCT. Скорее всего определение этой структуры уже есть в каком-то из подключаемых файлов пакета MASM. addr - ключевое слово для подстановки адреса переменной. Для нескольких вызовов SetPixel можно сделать например так: invoke BeginPaint, hwnd, addr ps push ebx mov ebx, eax invoke SetPixel, ebx, 15, 20, 65285 invoke SetPixel, ebx, 30, 20, 65285 invoke SetPixel, ebx, 45, 20, 65285 pop ebx invoke EndPaint, hwnd, addr ps Это вариант без использования дополнительной переменной. По соглашениям stdcall и cdecl, вызываемые процедуры не должны модифицировать регистры ebx, edi, esi (но могут модифицировать eax, ecx, edx), поэтому ebx, например, можно использовать для временного хранения значений, которые не должны затираться вызовами процедур. Но так как процедура WndProc тоже должна соответствовать соглашению stdcall, то перед модификацией ebx его значение нужно сохранить, а потом восстановить. Это можно сделать либо локально, вокруг места, где происходит модификция ebx (как показано в этом примере), либо сохранить в начале процедуры, а в конце (перед ret) - восстановить. Еще одно замечание - код цвета лучше писать в шестнацатеричном виде, в данном случае это будет 00FF05h, тогда будет сразу понятно, что этот цвет ближе к зеленому (порядок цветов - 0x00bbggrr, согласно описанию типа COLORREF).

Ответ 2



Потому что SetPixel ожидает первым параметром hdc, а не hwnd. Вам нужно вызвать BeginPaint для получения hdc, а после отрисовки вызвать EndPaint.

среда, 29 января 2020 г.

Сравнение возможностей компиляторов MASM и FASM [закрыт]

#ассемблер #компилятор #masm32 #fasm


        
             
                
                    
                        
                            Закрыт. На этот вопрос невозможно дать объективный ответ.
Ответы на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы на него можно было дать ответ, основанный на фактах и цитатах, отредактировав его.
                        
                        Закрыт 4 года назад.
                                                                                
           
                
        
Подскажите, пожалуйста, что можно сделать на MASM и нельзя (или очень трудно) на
FASM и наоборот.     


Ответы

Ответ 1



FASM предоставляет более развитую систему макросов, что облегчает восприятие кода и ускоряет процесс разработки. Хорошая статья по сабжу: http://www.insidepro.com/kk/108/108r.shtml

Ответ 2



Скажем так, MASM - это компилятор от крупной и вполне себе так серьезной фирмы Microsoft, а FASM - это компилятор, созданный энтузиастом, причем, насколько я знаю, только одним( и причем на Assembler`е ) =) Думаю, это о многом говорит вам. Но не подумайте, что я против энтузиазма, я наоборот за него - у энтузиастов порой получается все сделать даже лучше и качественнее, потому что они, как правило, одержимы не прибылью, как крупные компании, а скорее желанием получать удовольствие от своего дела. Но именно тут суть в том, что FASM был создан ОДНИМ человеком, что, в общем-то сложно, а MASM - подразделением Microsoft.

воскресенье, 5 января 2020 г.

Компилирование asm-файла в .exe при помощи masm

#ассемблер #masm32 #компиляция


Изучаю ассемблер. Нужно скомпилировать программу в формате .exe.
Однако до этого компилировал только в .com.
Какие аргументы для этого надо использовать?
    


Ответы

Ответ 1



ml.exe /c /coff "code.asm" ;Компиляция link.exe /subsystem:windows /out:"compiled.exe" "code.obj" ;Компоновка Компиляция. Получаем объектный файл. Компоновка. Получаем исполняемый файл в формате exe.

вторник, 26 ноября 2019 г.

Ассемблер. Стоит ли его изучать теперь? [закрыт]


Я студент 2-го курса. Программирование мы начинали изучать сразу же с языка C, сейча
заканчивается курс ООП С++ (я не говорю про вспомогательные предметы типа основ конструировани
программ и так далее). Мне нравится программировать, но меня никогда не покидала мысль
может стоит сначала разобраться в Ассемблере? Хочу конечно же когда-нибудь стать профессионало
и, разумеется, работать по специальности. Но хочется спросить: уместно ли изучение Ассемблера
Просто я ожидаю, что, изучив его, я больше буду понимать "внутреннюю реализацию". Н
тут опять же вопрос: так ли важно это понимание, что внутри происходит? Я не знаю, понадобиться ли мне он на будущей работе, так как я, вероятнее всего, буду работать с языками высокого уровня. Может быть я смогу писать более оптимизированные программы. Но смогу ли так много выиграть за счет этого? Да и вообще сейчас особо с ресурсами проблем нет. А если еще подумать про читаемость кода... Думаю, она резко уменьшится, если я буду пользоваться Ассемблерными вставками (хотя я не уверен, что они используются для опитимизации :D). А может она мне в отладке поможет? Печально, что пока в универе на это внимание почти не уделяется, но я думаю, что это важно, особенно на следующих этапах, когда программы станут серьезными.
Естественно, польза хоть какая-то будет, если я его изучу и разберусь с "внутренне
реализацией". Но "окупятся" ли усилия на изучения Ассемблера? Или может быть мне лучше начать изучать что-то более "дельное"? 
Заранее спасибо ;)    


Ответы

Ответ 1



Коварная постановка вопроса, холиварная такая :) Скажу так: знать его очень желательно, причем желательность прямо пропорциональн высокоуровневости основного языка. Если это C - можно не учить, если это js/php/c# обязательно. Не нужно даже делать ассемблерные вставки и кодить юниты на нем, но желательно именно знать, что там происходит внутри. Просто чтобы не возникало глупых вопросов вида "почему после int i = 0; if (i++ > 0) { code } i не становится обратно нулем?". Также он очень хорошо лечит от индусского кода. А насчет окупится-нет... Ну, это долгосрочное вложение, оно может окупиться незаметно а может и очень пригодиться, если будете разрабатывать высоконагруженные приложения. В любом случае если не сейчас, то в качестве хобби было бы неплохо хоть пару утилиток на нем накидать в свободное время, гарантирую веселое времяпровождение)

Ответ 2



Может, глубоко копать ассемблер не стоит (если, конечно, не собираетесь заниматьс разработкой ОС, драйверов, встроенных систем и пр.), но ознакомиться стоит обязательно И знать, что происходит внутри, как устроен процесс, как происходит вызов функций и т.д., любой профессиональный программист должен обязательно. Это не теоретические рассуждения, это из опыта. Мне изучение ассемблера крайне помогло, даже в изучении достаточно высокоуровневых вещей. А ознакомится на требуемом уровне можно за месяц-полтора. Сразу изучайте плоску модель. Всяких досовских заморочек даже не касайтесь, это совершенно ни к чему.

Ответ 3



Изучая ассемблер вы изучаете архитектуру системы, в самом языке изучать нечего он крайне прост. По поводу пользы вряд ли тут можно что-то сказать заранее, смотря каки программистом вы хотите стать: если прикладным, то скорее всего нет, а вот если системным то это вам определенно очень поможет. К примеру в какой-нибудь антивирусной контор без него никак, в то время как разрабатывая программы для бухгалтеров вы без него прекрасно обойдетесь. В любом случае знания лишними не бывают, и если вам это интересно, то изучите его хотя бы факультативно. Только я настоятельно советую разобраться сначала с высокоуровневым языком - так будет правильнее с моей точки зрения, т.к. в обратной последовательности идет очень туго.

Ответ 4



Имея в багаже С/C++, поковырять ассемблер, хотя бы чтобы изучить его возможност и архитектуру, будет очень полезно, на мой взгляд. Если Вам он когда-то действительно понадобиться - Вы будете знать, где искать и что учить. И действительно понимания в С/C++ он добавит. Лишних знаний вообще нет.

Ответ 5



Скажу, что элементарные ассемблеровские операторы надо знать по-любому, а еще лучш владеть им хотя бы на уровне "багокопателя". Ведь многие современные компиляторы компилирую написанный вами код в asm-код. Иногда надо знать, как именно компилятор транслировал ваш код, например, на C++ в машинный, чтобы, к примеру отыскать корень ошибки. А вообще, все пентестеры, все крякеры используют такой инструмент, как дизассемблер. Чтобы искать баги в чьем-либо программном коде и писать эксплоиты, к примеру.

Ответ 6



Нет, не стоит. Изучение ассемблера по книжкам десятилетней давности даст вам ложное представлени о работе процессора, расширит кругозор и поднимет ЧСВ. Еще при наличии времени стои изучить схемотехнику, чтобы знать, как из логических элементов создаются регистры. И прикладную теорию цифровых автоматов, чтобы знать, как сделана операция деления и почему она занимает больше времени. Но в целом это просто just for fun, в жизни редко встречается.

Ответ 7



Все эти ответы хороши, но проблема в том что Ассемблер человеку все равно придетс изучить, только будет это на курсе 4 (ну мне так помнится)... а еще помнится экзамен по сему предмету, на котором мы писали код на листочках в клеточку (эх были же времена :) ) но суть не в этом , так или иначе вы его все равно будете изучать, но лучше быт во всеоружии изначально ;)

Ответ 8



Как минимум ознакомиться стоит, хотя бы ради для расширения кругозора.

Ответ 9



Я не буду ортодоксом - поддержку оппозиционную точку зрения и плюсану @beardog. Согласен, что знание ассемблера не есть необходимость и может быть местами даже и вредно. Понятно, что сишнику без ассемблера никуда, но джависту/джаверу - зачем, зачем SQL прогеру? Чисто just for fun - абсолютно согласен. P.S. Я ассемблер увы знаю и иногда думаю, что это только вредит мне...

Ответ 10



Асм был, есть и будет всегда! Поэтому изучать его надо в любом случае!

суббота, 22 июня 2019 г.

masm как сделать массив с изменяемой длиной

Возможно ли изменить длинну массива (dd) и затем записать её в eax?


Ответ

И нет, и да. Дело в том, что результат декларации dd - просто последовательность байт в бинарнике, которая статически грузится в память.
Так что менять размер тут просто нечему. dd не является командой динамического выделения памяти - она просто статически помещает в бинарник нужную последовательность байт.
Хотите выделить память - обратитесь к операционной системе и попросите. Через системный вызов.

четверг, 2 мая 2019 г.

Почему у меня SetPixel не отрисовывает пиксель?

Почему у меня SetPixel не отрисовывает пиксель на форме?
WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD switch wmsg case WM_INITDIALOG invoke SendMessage, hwnd, WM_SETICON, 1, FUNC(LoadIcon, NULL, IDI_ASTERISK) case WM_PAINT invoke SetPixel, hwnd, 15, 20, 65285 case WM_CLOSE exit_program: invoke EndDialog, hwnd, 0 endsw xor eax,eax ret WndProc endp


Ответ

В качестве первого параметра SetPixel принимает не идентификатор окна, а идентификатор контекста устройства (в данном случае, идентификатор контекста окна). Контекст устройства упрощенно можно сравнить с холстом, на котором происходит рисование.
В вашем случае нужно получить этот идентификатор с помощью функции BeginPaint, нарисовать пиксель, потом освободить контекст при помощи EndPaint
Код для обработки сообщения WM_PAINT будет примерно такой:
invoke BeginPaint, hwnd, addr ps invoke SetPixel, eax, 15, 20, 65285 invoke EndPaint, hwnd, addr ps
Также необходимо объявить переменную ps, которая является структурой PAINTSTRUCT. Скорее всего определение этой структуры уже есть в каком-то из подключаемых файлов пакета MASM. addr - ключевое слово для подстановки адреса переменной.
Для нескольких вызовов SetPixel можно сделать например так:
invoke BeginPaint, hwnd, addr ps push ebx mov ebx, eax invoke SetPixel, ebx, 15, 20, 65285 invoke SetPixel, ebx, 30, 20, 65285 invoke SetPixel, ebx, 45, 20, 65285 pop ebx invoke EndPaint, hwnd, addr ps
Это вариант без использования дополнительной переменной. По соглашениям stdcall и cdecl, вызываемые процедуры не должны модифицировать регистры ebx, edi, esi (но могут модифицировать eax, ecx, edx), поэтому ebx, например, можно использовать для временного хранения значений, которые не должны затираться вызовами процедур. Но так как процедура WndProc тоже должна соответствовать соглашению stdcall, то перед модификацией ebx его значение нужно сохранить, а потом восстановить. Это можно сделать либо локально, вокруг места, где происходит модификция ebx (как показано в этом примере), либо сохранить в начале процедуры, а в конце (перед ret) - восстановить.
Еще одно замечание - код цвета лучше писать в шестнацатеричном виде, в данном случае это будет 00FF05h, тогда будет сразу понятно, что этот цвет ближе к зеленому (порядок цветов - 0x00bbggrr, согласно описанию типа COLORREF).