Форум программистов, компьютерный форум CyberForum.ru Форум программистов | Компьютерный форум | Форум web-программистов | Форум по электронике и бытовой технике | Форум о софте | Научный форум | Карьера и бизнес
CyberForum.ru - форум программистов и сисадминов > Форум Форум программистов > Форум Низкоуровневое программирование > Форум Assembler, MASM, TASM
Восстановить пароль Регистрация

Ответ Создать новую тему
 
15.01.2011, 10:27   #1
Maksim_27_10
Новичок
Регистрация: 05.11.2009
Сообщений: 23
Репутация: 1 (1)
Правильная компоновка(символ подчёркивания). / Assembler, MASM, TASM

Существует набор файлов *.obj и один *.inc. Используются функции Win API. При компоновке возникают ошибки:

InitPool.obj : error LNK2001: unresolved external symbol _VirtualAllocEx
Destroy.obj : error LNK2001: unresolved external symbol _VirtualFreeEx
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
SGV.exe : fatal error LNK1120: 3 unresolved externals

Прототипы написаны так:
VirtualAllocEx PROTO NEAR C,
pvAddress : LPVOID,
dwSize : SIZE_T,
fdwAllocationType : DWORD,
fdwProtecf : DWORD

VirtualFreeEx PROTO NEAR C,
pvAddress : LPVOID,
dwSize : SIZE_T,
fdwFreeType : DWORD

Как переписать прототипы функций, чтобы работало? Пробовал алиасы, но что-то даже не компилирует с ними, тем более INVOKE требует прототип. Есть способ обойти ограничение компоновщика?
Включение всего в один файл не предлогать!

Заранее благодарен.
15.01.2011, 10:27
AdAgent
Объявления
15.01.2011, 10:29   #2
murderer
Форумчанин
Регистрация: 06.10.2010
Сообщений: 2,773
Репутация: 2991 (1293)
Лучшие ответы: 38
Правильная компоновка(символ подчёркивания).

может вместо "NEAR C" надо "NEAR STDCALL"?
Другие темы раздела
Supervisor Password на вход в BIOS Assembler
Добрый день, дали задание на асме расшифровать пароль. Я еще новичек, только начал изучение асма. В инете нашел адреса где хранится этот пароль. 11h - Первый бит определяет, включен или выключен пароль администратора (0 — выключен, 1 — включен). Нулевой бит определяет режим использования пароля...
Assembler Выравнивание по левой крайней границе
Создать текстовый файл. Выполнить выравнивание строк по левой крайней границе. После выполнения операций задать атрибут файла «только для чтения ». я здела почти все кроме выравнивания помогите напишыте как выровнять полевой границе!!!! .8086 .MODEL SMALL .STACK 100h .DATA Count EQU 5...
15.01.2011, 18:45  [ТС]   #3
Maksim_27_10
Новичок
Регистрация: 05.11.2009
Сообщений: 23
Репутация: 1 (1)
Правильная компоновка(символ подчёркивания).

Я сделал так(теперь только одна ошибка):
ASA.inc
EXTERNDEF _imp__VirtualAlloc@16 : PTR pr4
EXTERNDEF _imp__VirtualFree@12 : PTR pr3

VirtualAlloc EQU <_imp__VirtualAlloc@16>
VirtualFree EQU <_imp__VirtualFree@12>

Всё ошибки компоновки связанные с этими функциями исчесли, а NEAR C -> NEAR STDCALL даёт тот же результат.
--------------------------------------------------------------------------------------------------------

Меня смущает только одно(в сети пишут):
externdef imp__WriteFile@20:PTR pr5
WriteFile equ <_imp__WriteFile@20>

Также обратите внимание на символы прочерка. В первой строке "imp__func@XX" пишется вообще без знаков прочерка, во второй - с одним прочерком. Любые другие варианты не работают.
--------------------------------------------------------------------------------------------------------
Почему так? Ну, да, ладно. Компилирует и компонует - это хорошо.

Подскажите пожалуйста что делать с последней ошибкой компоновки(надеюсь):
LINK : error LNK2001: unresolved external symbol _mainCRTStartup
SGV.exe : fatal error LNK1120: 1 unresolved externals

Как её устранить(пробовал выполнять подстановку NEAR C -> NEAR STDCALL !)?
--------------------------------------------------------------------------------------------------------

Код:
.CODE
main PROC NEAR C

; <код>

INVOKE ExitProcess, 0
main ENDP
END main

Добавлено через 2 часа 58 минут
Я понял что нужно компоновщику - библиотека времени выполнения C.

Необходимо сделать так:
.CODE
start:
; Инициализация библиотеки.

call Main
INVOKE ExitProcess, 0

Main PROC NEAR C
; <code>
Main ENDP

END start
;-------------------------------------------------------------------------------------------------------

В сети советуют подать компоновщику на вход msvcrt.lib, но я его подавал - не находит _mainCRTStartup. Искал сам в этой библиотеки COFF указанную функцию - не нашёл.
Итак, два вопроса:
1) Как называется библиотека C(я использую MASM)?
2) Как я должен инициализировать эту библиотеку(лучше отошлите на какой-нибудь ресурс или дайте дельный совет по инициализации библиотеки)?

Добавлено через 9 минут
*MASM32.
15.01.2011, 18:47   #4
murderer
Форумчанин
Регистрация: 06.10.2010
Сообщений: 2,773
Репутация: 2991 (1293)
Лучшие ответы: 38
Правильная компоновка(символ подчёркивания).

Лучше избавься от этой _mainCRTStartup.

http://www.rsdn.ru/article/cpp/crt.xml
16.01.2011, 22:10  [ТС]   #5
Maksim_27_10
Новичок
Регистрация: 05.11.2009
Сообщений: 23
Репутация: 1 (1)
Правильная компоновка(символ подчёркивания). / Assembler, MASM, TASM

Я не решил эту проблему. Я думаю, что это из-за директивы .MODEL flat, C повсеместно, но эта директива должна быть, так как это всё пойдёт после тестирования в *.lib.
Может посоветуете что-то другое, не MASM32, только программы должны выполняться под Vista и в консоли.
16.01.2011, 22:10
Yandex
Объявления
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать новую тему

Похожие темы
Тема Раздел Автор Дата
Компоновка КА - Алгоритмы
Здравствуйте! Задача заключается в следующем: Имеется цилиндр(радиус цилиндра и его высота 2500мм) и имеется некоторое кол-во "коробок" с диапазоном длин сторон 200-500мм и диапазоном масс 5-25кг. Нужно написать программу на Delphi, которая загрузит наибольшее число "коробок" в цилиндр таким...
Алгоритмы g4mer 04.11.2012 11:52
HTML, CSS: изменяемый цвет нижнего подчёркивания!
есть горизонтальное меню, пункты подчёркиваются линией с изменяющейся окраской: от желтого к красному. как задать изменяющийся цвет? если бы был неизменный цвет, тогда border-bottom и вперёд. я предполагаю вариант картинки растянутой БГ в спане ниже пункта меню, правда всё как-то криво...
HTML, CSS .Lexx. 31.07.2012 15:02
C#: Как взять из строки все символы до первого разделителя (пробела, подчёркивания)
Есть строка "С245 20 22500 370000". Из этой строки могу убрать - С245 - и остаётся "20 22500 37000" не получается из этой строки взять 20 (на месте 20 может любое другое число). вижу код примерно таким string stal_; stal_ = stal.Text; try { string stal_vibor =...
C# для начинающих folkoru 21.03.2012 13:28
HTML, CSS: Цвет подчёркивания ссылки
Не могу сделать цвет подчёркивания красным так, чтоб цвет букв остался розовым. Пишу такое. Файл css: A.menu1:link{text-decoration:none; /*Убираем линию подчёркивания*/ color:blue; } A.menu2:visited{color:red; text-decoration:none;} /*Посещённая ссылка*/ A.menu4:hover{color:magenta;...
HTML, CSS Syltan 06.04.2010 14:51
C++ Builder: Записать функцию заменяющую в строке (массиве символов) знак пробела на знак подчёркивания
10) Написать условный оператор для увеличения j в 2 раза если j не равно i и j - нечётное число, в противном случае j умножить на 1 11) Напишите оператор switch печатающий знак подчёркивания, если символьная переменная ch равна пробелу, и саму переменную в противном случае 12) Написать цикл...
C++ Builder Zios 07.02.2010 18:09
Опции темы

Текущее время: 01:24. Часовой пояс GMT +4.

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.7 PL3
Copyright ©2000 - 2014, vBulletin Solutions, Inc.