Однозначно асм, набрал 1-ый раз в Notepead ++ и сохранил *.asm а вот по поводу включены расширения или нет я не знаю, в самом масме в настройках я ничего не трогал, а когда пытался скомпилировать попробовал два варианта prog001.asm и просто prog001
Участник клуба
Регистрация: 02.03.2010
Сообщений: 1,323
а блокнот закрыли?
кстати, в первом посте кол-во нулей в имени файла разное для команды и ошибки. это оппечатка?
Последний раз редактировалось f.hump; 24.04.2012 в 13:18 .
Пользователь
Регистрация: 09.04.2011
Сообщений: 35
а блокнот закрыли?
кстати, в первом посте кол-во нулей в имени файла разное для команды и ошибки. это оппечатка?
в самом деле проглядел, большое спасибо что заметили. После этой команды у меня создался объектный файл но не создался ком файл, сама командная строка выдаёт следующее: fatal error LNK190: invalid fixup found, type 0x0001
вот листинг:
CSEG segment org 100h Begin: mov ah,9 mov dx,offset Message int 21h int 20h Message db ‘Hello World$’ CSEG ends end Begin
Изображения
asm.jpg (64.1 Кб, 253 просмотров) |
Источник: www.programmersforum.ru
as011 masm32 введение
Компиляция.
В основном вы будете использовать эту опцию, так как вы будете использовать внешний линкер (например link.exe), для компоновки ваших файлов.
генерировать объектный файл в COFF формате
Это генерирует формат файла для компоновщика microsoft.
имя объектного файла
может использоваться, если вы хотите, чтобы выходной файл был с другим именем, не таким как исходный файл.
Использует вызовы Pascal, C, или Stdcall
выберите тип вызовов для ваших процедур.
Добавить символьную отладочную информацию
Установите эту опцию, если хотите использовать отладчик.
Установить include путь
Определяет ваш include путь
Линковка:
Это создаст информацию для отладки. Используйте эту опцию, когда вы хотите использовать отладчик.
Тип отладки: codeview / coff
Выбирает выходной формат отладочной информации. Это зависит от вашего отладчика. Softice и visual c++ отладчики оба могут обрабатывать CV (codeview)
Указывает файл определения (.def). Используется с dll, для экспортируемых функций.
Выходной файл DLL, а не EXE.
Путь к библиотекам
Указывает путь к файлам библиотек (*.lib).
Устанавливает путь для inc-файлов
Указывает путь для inc-файлов, по умолчанию.
Может изменить имя выходного файла.
Выбирает ОС на которой должна выполнятся программа: NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX
Я установил masm в папку d:masmmasm32, в папке d:masm находятся все тексты наших программ *.asm. А для компиляции я создал bat файл, который компилирует файл current.asm:
d:masmmasm32binml.exe /c /coff current.asm
КАРЬЕРА ХАКЕРА. Книга 1 — Основы MASM32. Глава 1 — Установка и настройка MASM32
d:masmmasm32binlink.exe /subsystem:windows current.obj
В результате после запуска это файл у нас в папке d:masm готовая скомпилированная программа current.exe.
Оконное приложение
.model flat, stdcall
hInst dd 00000000h
szTitleName db ‘Window Application’,0
szClassName db ‘ASMCLASS32’,0
msg MONMSGSTRUCT ; структура сообщения
wc WNDCLASS ; структура класса
Invoke GetModuleHandle,0 ; получаем hInstanse
Mov [wc.style], CS_HREDRAW+CS_VREDRAW+CS_GLOBALCLASS
; устанавливаем стиль окна
Mov [wc.lpfnWndProc], offset WndProc ;
Mov [wc.cbClsExtra], 0
Mov [wc.cbWndExtra], 0
Mov [wc.hInstance], eax
Invoke LoadIcon,0,IDI_APPLICATION ; получаем значок приложения по
Mov [wc.hIcon], eax
Invoke LoadCursorA,0,IDC_ARROW ; получаем курсор по умолчанию
Mov [wc.hCursor], eax
Mov [wc.hbrBackground], COLOR_BACKGROUND+1
Mov dword ptr [wc.lpszMenuName], 0
Mov dword ptr [wc.lpszClassName], offset szClassName ; задаём имя класса
Invoke RegisterClassA,offset wc ; регистрируем класс окна
Push [hInst] ; дескриптор
Push CW_USEDEFAULT ; высота
Push CW_USEDEFAULT ; ширина
Push CW_USEDEFAULT ; y
Push CW_USEDEFAULT ; x
Push WS_OVERLAPPEDWINDOW ; стиль
Push offset szTitleName ; заголовок окна
Push offset szClassName ; имя класса
Push 0 ; дополнительный стиль
Call CreateWindowEx ; создаём окно
mov [newhwnd], eax ; сохраняем его дескриптор
invoke ShowWindow,[newhwnd],SW_SHOWNORMAL; показываем окно
invoke UpdateWindow, [newhwnd]; обновляем его
msg_loop: ; запускаем цикл обработки сообщений
invoke GetMessage,offset msg, 0,0,0
invoke TranslateMessage, offset msg
invoke DispatchMessage, offset msg
invoke ExitProcess, 0
WndProc proc uses ebx edi esi, hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD
Cmp [wmsg], WM_DESTROY
Cmp [wmsg], WM_KEYDOWN
; вызываем стандартный обработчик сообщений
cmp [wparam], VK_ESCAPE
je wmdestroy; если нажата клавиша Escape то выход
invoke PostQuitMessage, 0
invoke ExitProcess, 0 ; выход
В самой первой строке мы получаем hInstanse т.е дескриптор приложения, фактически это база образа приложения, т.е. то место в памяти в которого начинается наша программа. Функция GetModuleHandle нужна для получения дескриптора библиотеки (фактически хендл библиотеки это и есть её база образа), параметром этой функции надо передавать имя библиотеки, но если мы укажем 0, то получим дескриптор нашего приложения. Потом мы заполняем структуру класса окна, т.е. задаём атрибуты класса окна.
Mov [wc.lpfnWndProc], offset WndProc
Этой строкой мы указываем, какая функция будет обрабатывать сообщения окна. Функция, которая обрабатывает сообщения окна, называется оконной функцией. Оконная функция вызывается всякий раз, когда окну было прислано какое-либо сообщение.
Потом мы получаем иконку окна с помощью функции LoadIcon, в качестве первого параметра этой функции надо передавать дескриптор приложения, но мы указали 0 поэтому мы получим стандартный значок окна. Во втором параметре мы указываем указатель на строку, которая содержит имя иконки, которую мы хотим получить, но если мы укажем определённую константу, то сможем получить предопределённую иконку. Точно также мы получаем курсор, т.е. его дескриптор.
Потом мы вызываем RegisterClass, единственным параметром которой является указатель на структуру, которая описывает новый класс окна.
Потом мы создаём окно с помощью функции CreateWindowEx.
DWORD dwExStyle, // расширенный стиль окна
LPCTSTR lpClassName, // имя класса
LPCTSTR lpWindowName, // заголовок окна
DWORD dwStyle, // стиль окна
int x, // позиция х
int y, // позиция у
int nWidth, // ширина
int nHeight, // высота
HWND hWndParent, // хендл окна родителя
HMENU hMenu, // хендл меню
HINSTANCE hInstance, // хендл приложения
LPVOID lpParam //указатель на данные (обычно они не нужны)
После создания окна мы показываем его и обновляем. Потом запускаем бесконечный цикл обработки системных сообщений.
В оконной функции мы получаем сообщение и обрабатываем его. Если тип сообщения WM_DESTROY, то мы переходим на соответствующую метку, после которой выходим из нашей программы. Если была нажата клавиша, то мы продолжаем обработку и смотрим, нажата ли клавиша escape, если да, то выходим. Если сообщение, какое либо другое, то вызываем стандартный обработчик сообщений окна.
Этот обработчик превращает наше окно в настоящее «живое» окно, которое может двигаться, расширятся и свёртываться. Можно и не вызывать эту функцию, но для того чтобы окно стало живым нам придётся вручную обрабатывать все сообщения окна, а это просто нецелесообразно.
Источник: studfile.net
Компилятор MASM
На всех предыдущих уроках я рассказывал о компиляторе TASM, потому что он стандартный и ненавороченный. Но более популярный компилятор это MASM, он создан специально для написания программ на ассемблере для Win32. В нём есть макросы и специальные директивы для упрощения программирования.
Функции.
Основное преимущество MASM это макрос invoke, он позволяет вызывать API функции по-обычному с проверкой количества и типа параметров. Это почти тот же call, как в TASM, но этот макрос проверяет количество параметров и их типы. Вот так вызывается функция:
Invoke , , ,
Чтобы использовать invoke для вызова процедуры, вы должны определить ее прототип:
PROTO STDCALL testproc:DWORD, :DWORD, :DWORD
Эта директива объявляет процедуру, названную testproc, которая берет 3 параметра размером DWORD.
Теперь, если вы сделаете это.
invoke testproc, 1, 2, 3, 4 .
masm выдаст вам ошибку потому, что процедура testproc берет 3 параметра, а не 4. Masm также имеет контроль соответствия типов, т.е. проверяет, имеют ли параметры правильный тип (размер).
В invoke вы можете использовать ADDR вместо OFFSET. Это сделает адрес в правильной форме, когда код будет собран.
testproc PROTO STDCALL :DWORD, :DWORD, :DWORD .code testproc proc param1:DWORD, param2:DWORD, param3:DWORD . ret testproc endp
Это создает процедуру, названную testproc, с тремя параметрами. Прототип используется, invoke. Все параметры можно использовать в коде процедуры, они автоматически извлекутся из стека. Также в процедурах можно использовать локальные переменные.
testproc proc param1:DWORD, param2:DWORD, param3:DWORD LOCAL var1:DWORD LOCAL var2:BYTE mov ecx, param1 mov var2, cl mov edx, param2 mov eax, param3 mov var1, eax add edx, eax mul eax, ecx mov ebx, var1 .IF bl==var2 xor eax, eax .ENDIF ret testproc endp
Вы не можете использовать эти переменные вне процедуры. Они сохранены в стеке и удаляются при возврате из процедуры.
Конструкции сравнения и повтора.
If — Об этой конструкции я рассказывал на 10 уроке. Она имеет тот же самый синтаксис, что и в TASM.
Repeat — Эта конструкция выполняет блок, пока условие не истинно:
.REPEAT ; код здесь .UNTIL eax==1
Эта конструкция повторяет код между repeat и until, пока eax не станет равным 1.
While — Конструкция while это инверсия конструкции repeat. Она выполняет блок, пока условие истинно:
.WHILE eax==1 ; код здесь .ENDW
Вы можете использовать директиву .BREAK, чтобы прервать цикл и выйти.
.WHILE edx==1 inc eax .IF eax==7 .BREAK .ENDIF .ENDW
Если eax=7, цикл while будет прерван.
Директива continue осуществляет переход на код проверяющий условие цикла в конструкциях repeat и while.
Теперь наша первая программа видоизменяется следующим образом:
.486 .model flat, stdcall option casemap :none includelib .masm32libkernel32.lib includelib .masm32libuser32.lib MessageBoxA PROTO STDCALL :DWORD, :DWORD, :DWORD, :DWORD ExitProcess PROTO STDCALL :DWORD .data ttl db ‘11111’,0 .code start: invoke MessageBoxA,0,offset ttl,offset ttl,0 invoke ExitProcess,0 end start
При компиляции в TASM пути к статическим библиотекам мы указывали при компиляции, в MASM пути к статическим библиотекам мы указываем в тексте программы точно так же как и пути к включаемым файлам с помощью директивы includelib.
Прототипы каждой из библиотек есть в одноимённых включаемых файлах в папке include. Теперь не надо писать прототипы функций самому, они уже есть:
includelib .masm32libkernel32.lib includelib .masm32libuser32.lib include .masm32includekernel32.inc include .masm32includeuser32.inc
В этих включаемых файлах определены функции без букв A или W в конце. Теперь не надо указывать эти буквы в конце.
Директива option нужна для задания некоторых настроек компиляции. Опция casemap задаёт чувствительность к регистру символов. Мы указали none, тем самым установили чувствительность к регистру символов. Это надо, для того чтобы избежать конфликтов включаемых файлов от разных авторов.
Компиляция.
ML [ /опции ] filelist [ /link linkoptions ]
В основном вы будете использовать эту опцию, так как вы будете использовать внешний линкер (например link.exe), для компоновки ваших файлов.
Это генерирует формат файла для компоновщика microsoft.
может использоваться, если вы хотите, чтобы выходной файл был с другим именем, не таким как исходный файл.
выберите тип вызовов для ваших процедур.
Установите эту опцию, если хотите использовать отладчик.
Определяет ваш include путь
Линковка:
Это создаст информацию для отладки. Используйте эту опцию, когда вы хотите использовать отладчик.
Выбирает выходной формат отладочной информации. Это зависит от вашего отладчика. Softice и visual c++ отладчики оба могут обрабатывать CV (codeview)
Указывает файл определения (.def). Используется с dll, для экспортируемых функций.
Выходной файл DLL, а не EXE.
Указывает путь к файлам библиотек (*.lib).
Указывает путь для inc-файлов, по умолчанию.
Может изменить имя выходного файла.
Выбирает ОС на которой должна выполнятся программа: NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX
Я установил masm в папку d:masmmasm32, в папке d:masm находятся все тексты наших программ *.asm. А для компиляции я создал bat файл, который компилирует файл current.asm:
;======[CUT HERE]===== d:masmmasm32binml.exe /c /coff current.asm d:masmmasm32binlink.exe /subsystem:windows current.obj pause ;=======[CUT HERE]========
В результате после запуска это файл у нас в папке d:masm готовая скомпилированная программа current.exe.
Вот и конец этого урока. В этом уроке я рассказал про макрософтский компилятор MASM. На следующем уроке мы напишем первое оконное приложение на ассемблере.
Источник: codenet.ru