Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.129.211.87] |
|
Сообщ.
#1
,
|
|
|
Что за ошибка и как с ней бороться? Обьектный файл создаётся всё безпроблем, а вот линковщик ни ленкует и создаёт файл мап с такой ошибкой. Исходник вот
title .386 .model flat, stdcall std_output_handle equ -11 extrn getstdhandle@4:proc extrn exitprocess@4:proc extrn writeconsolea@20:proc .data mess db "FFFFF" endl equ <odh, 0ah> messagesize dd ($-mess) consolehandle dd 0 byteswritten db ? .code main proc push std_output_handle call getstdhandle@4 mov ecx,small offset mess mov consolehandle,ecx push 0 push offset byteswritten push messagesize push offset mess push consolehandle call writeconsoleA@20 push 0 call exitprocess@4 main endp end main Добавлено Поискала, нашла что нужно добавить ключ при линковке /3, но когда я его добовляю, то другие ошибки Start Stop Length Name Class 00000H 00030H 00031H _TEXT CODE 00034H 00042H 0000FH _DATA DATA Error: Undefined symbol GETSTDHANDLE@4 in module file.ASM Fatal: Bad object file record in module file.ASM near module file offset 0x000005F6 |
Сообщ.
#2
,
|
|
|
Привет rikitikitavi!
Для начала пройдемся по Цитата rikitikitavi @ Исходник вот Это полный исходник? А где точка входа? Какай асм используешь? Если Тасм, то можно сделать все гораздо проще и красивее: includelib "kernel32.lib" PROCDESC GetStdHandle WINAPI :DWORD PROCDESC ExitProcess WINAPI :HANDLE PROCDESC WriteConsoleA WINAPI :HANDLE, :LPVOID, :DWORD, :LPDWORD, :LPVOID ....... call WriteConsoleA, [consolehandle], offset mess, [messagesize],\ offset byteswritten, NULL Или я не прав? Цитата rikitikitavi @ mess db "FFFFF" endl equ <odh, 0ah> messagesize dd ($-mess) Небольшая оплошность, ты создала макрос ENDL, а вот вставить его забыла, делай так: endl equ <odh, 0ah> mess db "FFFFF", endl messagesize dd ($-mess) Цитата rikitikitavi @ byteswritten db ? Это должно быть DWORD, так как Цитата lpNumberOfCharsWritten Points to a 32-bit variable that receives the number of characters actually written. Есть еще одна небольшая ошибочка Цитата rikitikitavi @ push std_output_handle call getstdhandle@4 mov ecx,small offset mess mov consolehandle,ecx <--- ты наверное хотела написать EAX? То есть у тебя хэндл консоли уходит в "небо" Ну а теперь насчет компиляции: Цитата rikitikitavi @ Undefined symbol GETSTDHANDLE@4 in module file.ASM Судя по всему ты не указала опции различать регистр в глобальных именах, это обязательно нужно, тогда у тебя и объявления неправильные, посмотри как это у меня сделано А сами либрары указывала линкеру? Цитата rikitikitavi @ Bad object file record in module file.ASM near module file offset 0x000005F6 Честно говоря сам не знаю почему такая блаж появляется, встречался с этим и в тасме и в ваткомовском линкере Лечится просто - выравниванием кода и иногда данных. Best Regards! |
Сообщ.
#3
,
|
|
|
Цитата AndNot @ Привет rikitikitavi! Привет AndNot! Цитата AndNot @ Это полный исходник? да это весь. Цитата AndNot @ Если Тасм, то можно сделать все гораздо проще и красивее: да Тасм, ну уж извиняйте я ещё не сильна , да действительно проще и красивее Цитата AndNot @ Небольшая оплошность оплошала не спорю, если честно то здесь всё с масма, все куски кода, я соединила и перевела на тасм. Цитата AndNot @ То есть у тебя хэндл консоли уходит в "небо" мда Цитата AndNot @ различать регистр в глобальных именах да я это уже поняла. Цитата AndNot @ А сами либрары указывала линкеру? всмысле, какие либы? Цитата AndNot @ Best Regards! Спасибо |
Сообщ.
#4
,
|
|
|
Цитата rikitikitavi @ да Тасм, ну уж извиняйте я ещё не сильна И все же советую начать именно с режима IDEAL, он почти все синтаксические ошибки отлавливает, да и неоднозначностей не допускает. Твой пример будет примерно таким: IDEAL P586 MODEL FLAT ,STDCALL SMART LOCALS __ NOJUMPS includelib "import32.lib" std_output_handle equ -11 NULL equ 0 typedef HANDLE DWORD typedef LPVOID DWORD typedef LPDWORD DWORD typedef LPCSTR DWORD PROCDESC GetStdHandle WINAPI :DWORD PROCDESC ExitProcess WINAPI :HANDLE PROCDESC WriteConsoleA WINAPI :HANDLE, :LPCSTR, :DWORD, :LPDWORD, :LPVOID PROCDESC AllocConsole WINAPI PROCDESC SetConsoleTitleA WINAPI :LPCSTR DATASEG sztitle db "rikitikitavi console",0 mess db "FFFFF",13,10 messagesize dd ($- offset mess) consolehandle dd 0 UDATASEG byteswritten dd ? CODESEG proc main call AllocConsole or eax,eax jz __exit call SetConsoleTitleA, offset sztitle or eax,eax jz __exit call GetStdHandle, std_output_handle or eax,eax jz __exit mov [consolehandle],eax call WriteConsoleA, eax, offset mess, [messagesize],\ offset byteswritten, NULL __exit: call ExitProcess, NULL endp END main Цитата rikitikitavi @ всмысле, какие либы? Ну в примере выше это includelib "import32.lib" то есть библиотека импорта имен подключаемых API. Здесь либа подключается в тексте, поэтому ее можно не указывать линкеру Очень удобно. Цитата rikitikitavi @ Спасибо Да всегда пожалуйста |
Сообщ.
#5
,
|
|
|
Цитата AndNot @ И все же советую начать именно с режима IDEAL, он почти все синтаксические ошибки отлавливает, да и неоднозначностей не допускает. еслиб я это знала , вот теперь знаю , за совет и за пример спасибо Цитата AndNot @ Ну в примере выше это includelib "import32.lib" то есть библиотека импорта имен подключаемых API это я понимаю , теперь буду делать так. В этом я разобралась, вопрос решён .AndNot Премного благодарна! |
Сообщ.
#6
,
|
|
|
Цитата rikitikitavi @ В этом я разобралась, вопрос решён .AndNot Премного благодарна! Да ладно, обращайся если что Best Regards! |