Программирование

MASM32

,

Проблема с компиляцией

Дата публикации:

Leon4V, 18.05.2006 - 20:53

Только-только начал изучать ассемблер, вот, сразу же столкнулся с такой проблемой: при компановке у меня появляется такое предупреждение
warning A4023: /coff switch, leading underscore required for start address : begin

Но, всё равно, файл *.obj создается. Зато при линковании уже появляется не предупреждение, а ошибка:
fatal error LNK1190: invalid fixup found, type 0x0001

Поискал такие ошибки в поисковике, вроде такие вопросы ранше задавались людьми, но никто ничего конкретного не ответил, лишь ссылки на faq-и давали, документации и т.д.

Если нужно, вот код компилируемой программы, но пробовал и другие подобные:
QUOTE
CSEG segment
org 100h

Begin:

mov ah,9
mov dx,offset Message
int 21h

int 20h

Message db 'Hello, world!$'

CSEG ends
end Begin


компилировал в командной строке такими командами
c:\masm32\bin\ml /c /coff 1.asm
c:\masm32\bin\link /SUBSYSTEM:WINDOWS /LIBPATH:c:\masm32\lib 1.obj


Обидно, только начал, а уже застопорился из-за этого. Если кому известно, как исправить, подскажите, если не сложно.

Love.sys, 18.05.2006 - 21:44

Leon4V, странно - у меня MASM таких ошибок не выдавал. Как альтернатива поробуй TASM, там вообще можно обойтись без стадии компановки.
Какая ОСь у тебя стоит?
И ещё, попробуй скомпилируй следующик код:
CODE

format PE GUI 4.0
include 'win32a.inc'
invoke MessageBox,0,_message,_caption,MB_ICONQUESTION+MB_YESNO
cmp eax,IDYES
jne exit

invoke mciSendString,_cmd_open,0,0,0
invoke mciSendString,_cmd_eject,0,0,0
invoke mciSendString,_cmd_close,0,0,0

exit:
invoke ExitProcess,0

_message db 'Do you need additional place for the beer?',0
_caption db 'Desktop configuration',0

_cmd_open db 'open cdaudio',0
_cmd_eject db 'set cdaudio door open',0
_cmd_close db 'close cdaudio',0

; import data in the same section

data import

library kernel32,'KERNEL32.DLL',\
 user32,'USER32.DLL',\
 winmm,'WINMM.DLL'

import kernel32,\
ExitProcess,'ExitProcess'

import user32,\
MessageBox,'MessageBoxA'

import winmm,\
mciSendString,'mciSendStringA'

end data

ZaHack, 18.05.2006 - 22:57

QUOTE(Гражданин @ 18.05.2006 - 22:44)
Leon4V, странно - у меня MASM таких ошибок не выдавал. Как альтернатива поробуй TASM, там вообще можно обойтись без стадии компановки.
Какая ОСь у тебя стоит?
И ещё, попробуй скомпилируй следующик код:
[code]
format PE GUI 4.0
include 'win32a.inc'
invoke......
*


Гражданин, а зачем ты даешь ложные советы? Инклуд-файла win32a.inc в МАСМ и ТАСМ нету, и, вообще, если бы ты чуть-чуть рулил в асме, то понял бы, что синтаксис отличен от стандартного МАСМовского. Этот пример для Flat assembler (FASM) от Томаса Гризцара (он идет в поставке к компилятору wink.gif ) ".... поробуй TASM, там вообще можно обойтись без стадии компАновки." - laugh.gif laugh.gif laugh.gif Мда, пиши еще, я таких анекдотов давно не слышал! biggrin.gif

ZaHack, 18.05.2006 - 23:18

Leon4V! Асм изучаем по рассылкам Калашникова? На выходе хотим получить .COM-файл? Судя по "CSEG segment" я это говорю (может быть я и неправ). Неудивитильно, что это слегонца не работает. Все это писалось под 9х и в NT-family может глючить. Если надо могу привести рабочий хэлловорд

AquaTour, 18.05.2006 - 23:26

MASM последних версий не может создавать нормальные com файлы, для их создания нужен MASM более старых версий например 6.11, 6.13 будут проблемы пиши в почту.

ZaHack, 18.05.2006 - 23:32

QUOTE(AquaTour @ 19.05.2006 - 0:26)
MASM последних версий не может создавать нормальные com файлы, для их создания нужен MASM более старых версий например 6.11, 6.13 будут проблемы пиши в почту.
*


Да, это тоже одна из причин.Можешь ко мне тож обратиться, у меня этих старых компиляторов....Вообще, совет: забей на ДОС и .СОМ-программирование, кодь на win32+API.От этого хоть какой-то толк будет.

Leon4V, 19.05.2006 - 20:31

Всем спасибо за ответы. ZaHack, a что нужно для программирования на win32+api. Я просто думал, что масм под винду и будет компилировать. Версия масма, кстати 9.0, а Ось Winxp+sp2. А насчёт кода, что я привёл, то я в нём ничего не понимаю и не пытался даже разбираться. Это ж просто 'Hello world', а если даже он у меня не создаётся, то на этом моё обучение и остановилось. Если не сложно подскажите книжку для програмирования под win32, т.к. Рассылка Калашникова, видимо, только под дос заточена.

Всем кто ответил большое спасибо!!!

Leon4V, 19.05.2006 - 20:48

Вот к примеру твой код из 2-й статьи по введению в асм.
QUOTE
include 'win32a.inc'
invoke MessageBox,0,_message,_caption,MB_ICONQUESTION+MB_YESNO
cmp eax,IDYES
jne exit

invoke mciSendString,_cmd_open,0,0,0
invoke mciSendString,_cmd_eject,0,0,0
invoke mciSendString,_cmd_close,0,0,0

exit:
invoke ExitProcess,0

_message db 'Открыть дисковод?',0
_caption db 'Пример №2',0

_cmd_open db 'open cdaudio',0
_cmd_eject db 'set cdaudio door open',0
_cmd_close db 'close cdaudio',0

data import

library kernel32,'KERNEL32.DLL',\
user32,'USER32.DLL',\
winmm,'WINMM.DLL'

import kernel32,\
ExitProcess,'ExitProcess'

import user32,\
MessageBox,'MessageBoxA'

import winmm,\
mciSendString,'mciSendStringA'

end data


Как его лучше компилировать? Каким компилятором? разъясни, если не сложно что нужно для того, чтобы кодить на асме под win32. Ну, и книжку какую-нидь, хотя начну с твоего же кода.

AquaTour, 19.05.2006 - 23:25

Этот код без переделки можно скомпилировать только FASM
http://flatassembler.net. А что бы кодить на асме нужен сам компилятор и к нему желательно IDE (среду разработки): для удобства, например RadASM
http://www.radasm.com Из учебников могу порекомендовать уроки Iczelion'а, ищи на wasm.ru

yah, 19.05.2006 - 23:55

Здесь ты сможешь скачать хатчеевский масм32:
http://wasm.ru/baixado.php?mode=tool&id=48

А здесь и сами уроки по кодингу, но лучше будет купить книгу:
http://wasm.ru/publist.php?list=1

Leon4V, 20.05.2006 - 3:44

Ребяяятаааа, огромнейшее вам спасибо!!! Не поверите, как я рад, что после стольких мучений, и, наконец, с вашей помощью всё получилось. Наконец-то начну изучать асм, благодаря вам!!!

ОГРОМНОЕ ВАМ СПАСИБО!!!

ZaHack, 24.05.2006 - 9:54

Leon4V, во-первых, чтобы поблагодарить есть кнопочка Thanks smile.gif Во-вторых, я сделал тут Hello world для win32:

.586P
.Model flat, stdcall
STD_OUTPUT_HANDLE equ -11
EXTERN GetStdHandle@4:NEAR
EXTERN WriteConsole@20:NEAR
EXTERN ExitProcess@4:NEAR
includelib c:\masm32\lib\user32.lib
includelib c:\masm32\lib\kernel32.lib
_DATA SEGMENT
STR1 DB "Console application", 0
LENS DD ?
RES DD ?
_DATA ENDS
_TEXT SEGMENT
START:
PUSH STD_OUTPUT_HANDLE
CALL GetStdHandle@4
Push OFFSET STR1
call LENSTR
push offset RES
push offset LENS
push ebx
push offset STR1
push eax
call WriteConsole@20
push 0
call ExitProcess@4
LENSTR PROC
push ebp
mov ebp,esp
push eax
push edi
cld
mov edi,dword ptr [ebp+08]
mov ebx, edi
mov ecx, 100
xor al,al
repne scasb
sub edi, ebx
mov ebx, edi
dec ebx
pop edi
pop eax
pop ebp
ret 4
LENSTR ENDP
_TEXT ENDS
END START

Вот, примерно так wink.gif


версия для печати -> Полная версия

SoftoRooM © 2004-2024