чуть попозже выложу текст ошибки, которую масм выдает при таком способе=\ возможно, но я уже купил книжку Калашникова, а она про masm. хотел в электронной версии прочитать, но решил купить. еще вопрос: в каком случае надо компилить в com, а в каком в exe? +еще один: зачем нужны файлы в расширении *.obj? Спасибо!=)
После ассемблирования (с помощью ml) исходник превращается в промежуточную форму - объектный модуль (.obj). Для генерации exe'шника необходимо запустить компоновщик (link), указав ему объектный модуль.
Ну COM - это уже отжившее своё. Такчто в любом случае лучше компилить EXE Хотя у комов размер меньше. Вообще у ассемблеров не очень большое различие. Вот я с легкостью перешел с TASM на FASM и при этом я понял, что с FASM'a надо было начинать с самого начала. Потому что на нем можно тварить чудеса. // Анекдот в тему: Решил хакер блины печь, первый блин как всегда вышел Комом, а второй уже EXE'шником
в тему)) я тоже хотел начать с fasm'a, но не нашел подходящей литературы, поэтому пришлось поучить masm. 2 slesh, в чем основные различия tasm/masm и fasm? (наиболее интересен синтаксис)
FASM рулит в том что не надо мучаться с компилом. Все параметры компила пишутся в исходнике проги. Вот к примеру некоторые из них: 1) format PE GUI at 5000000h - компилит в PE EXE под графическую оболочку и базовый адрес кода - 5000000h 2) format PE - тоже PE EXE но под консоль 3) format PE64 - под 64 битные системы 4) use16 - 16-ти битный bin файла 5) use32 - 32-х битный bin файла 6) format ELF - вообще под линух. Ну и в томже духе. И вообще в FASM можно ресурсы прописывать внутри кода программы.
2 slesh 1. если указать в исходнике format PE или format PE GUI at 5000000h, то строчкой ниже надо писать use16 или use32? 2. почему com весит 25 байт, а ехе 1 кб, причем при запуске ехе вылезает ошибка. вот сам код: Code: format PE ; com компилился с format binary use16 ; закомментивание этой строчки не помогло org 100h mov ah,9 mov dx,msg int 21h mov ah,0 int 16h int 20h msg db 'Hello World$'
2Piflit: 1. Формат PE подразумевает 32 битную адресацию. 2. com - программа на диске находится в таком же состоянии как и в памяти, а в exe присутствует ещё туча всякой служебной инфы, PE заголовок, стаб и т.д. И ещё, какие нафик прерывания, если ты пишешь под винду? =) Или тогда уже пиши под дос.
нафиг дос))) буду писать под винду, просто сорц из книжки был именно такой... чувствую, придется еще одну покупать, типа "асм под вин32"...
Ниасилишь скорее всего сейчас под винду, попрактикуйся под дос. Под винду можешь глянуть Уроки Iczelion'а (http://wasm.ru/publist.php?list=1), правда там под масм, но суть та же.
я сейчас и не собираюсь, только начал=) килограммы мануалов и wasm.ru мне в помощь)) кстати, я оттуда (wasm.ru) почти дочитал цикл статей про Ollydbg. познавательно)) ЗЫ но ведь дос приложения можно запускать под вин?... через командную строчку... и тогда их соответственно надо компилить в com, как в моем исходнике... я прав?)
И .exe тоже, только директивы поменять нужно, в fasm'e, к сожалению, сейчас не скажу какие именно. Васм, опять же, в помощь. =)
нужно обьединить два исходника на masm, но когда я включаю модули из второй в первую, вылезают ошибки в модуле windows.inc, огромная куча, вида: syntax error: in structure structure improperly initialized symbol type conflict: bool symbol redefenition: hinst если его закомментить то ошибки исчезают и в user32.inc ошибка symbol redefinition : wsprintfA т.е. как я понял какие-то структуры из windows.inc как-то перекрываются со структурами из других модулей? как это можно решить, можно ли вторую программу как-нибудь отдельным модулем c подпрограммой сделать, а из первой её вызывать? Code: ;модули первой программы EXTERN shutdown@8:NEAR EXTERN recv@16:NEAR EXTERN send@16:NEAR EXTERN accept@12:NEAR EXTERN listen@8:NEAR EXTERN bind@12:NEAR EXTERN closesocket@4:NEAR EXTERN socket@12:NEAR EXTERN CharToOemA@8:NEAR EXTERN WSAStartup@8:NEAR EXTERN wsprintfA:NEAR EXTERN GetLastError@0:NEAR EXTERN ExitProcess@4:NEAR EXTERN lstrlenA@4:NEAR EXTERN WriteConsoleA@20:NEAR EXTERN GetStdHandle@4:NEAR includelib \masm32\lib\user32.lib includelib \masm32\lib\kernel32.lib includelib \masm32\lib\ws2_32.lib includelib \masm32\lib\winmm.lib include \masm32\include\kernel32.inc include \masm32\include\winmm.inc ;модули второй программы include \masm32\include\windows.inc include \masm32\include\masm32.inc include \masm32\include\user32.inc include \masm32\include\wsock32.inc includelib \masm32\Lib\masm32.lib includelib \masm32\Lib\wsock32.lib
Выход - закомментировать прототип wsprintfA в windows.inc Это ошибка в масме, wsprintfA объявлена и в user32.inc (где и должна быть) и в windows.inc (где ее за каким-то хреном поместили).
выдрал фтп сервер из пинча вроде бы компилиться ml /c /coff /Cp ftp.asm потом линкую link /subsystem:windows ftp.obj вылезают ошибки unresolved external symbol _SendReply@8 unresolved external symbol _MainSockListen@0 unresolved external symbol _ServeThread@4 в файле obj к функциям SendReply, MainSockListen, ServeThread добавляются какие-то цифры и нижняя черточка перед _функция@8 _функция@0 _функция@4 и линкер не может понять их что это? у каво есть рабочий исходник ftp сервера? ниже то что добавил в файл ftp.asm Code: .586P .MODEL FLAT, stdcall include Inc\windows.inc include Inc\kernel32.inc include Inc\user32.inc include Inc\advapi32.inc include Inc\ws2_32.inc include Inc\wsock32.inc include Inc\oaidl.inc include Inc\pinch.inc include Inc\ole32.inc include Inc\shlwapi.inc include Inc\oleaut32.inc include Inc\shell32.inc include Inc\masm32.inc include Inc\rasapi32.inc include Inc\gdi32.inc include Inc\oaidl.inc include Inc\aplib.inc include Inc\urlmon.inc include Inc\wininet.inc includelib Lib\ole32.lib includelib Lib\kernel32.lib includelib Lib\user32.lib includelib Lib\oleaut32.lib includelib Lib\advapi32.lib includelib Lib\shlwapi.lib includelib Lib\shell32.lib includelib Lib\masm32.lib includelib Lib\wsock32.lib includelib Lib\ntdll.lib includelib Lib\ws2_32.lib includelib Lib\rasapi32.lib includelib Lib\gdi32.lib includelib Lib\urlmon.lib includelib Lib\aplib.lib includelib Lib\wininet.lib start: invoke startftp end start