Сбой программы при связывании смеси файлов C и сборки с помощью инструментов Turbo-C++ 3.0
У меня есть следующий код сборки, который предназначен для установки режима экрана в режим 13:
.model small
.code
public _func
_func proc
mov al,13h
int 10h
ret
_func endp
END
он успешно собран в объектный файл main.obj. Теперь я пытаюсь вызвать открытый _func из следующего кода C:
extern void func();
int main() {
func();
return(0);
}
но я понятия не имею, как связать два объекта, чтобы получить рабочий exe, я много гуглил, но большинство постов в компиляторе GCC
Я пробовал следующую командную строку: tcc cmain.c main.obj
Я получил исполняемый файл CMAIN.EXE, но он не меняет режим на режим 13, он просто отображает сообщение "Аварийное завершение программы"
Я использую компилятор turbo C++ 3.0 и ассемблер masm5.11. Какая команда должна работать?
1 ответ
Пока я не потратил много времени, я не видел, что у вас есть ошибка в коде:
mov al,13h
int 10h
ret
Вы фактически не устанавливаете AH в 0 для подфункции Video Mode Set INT 10h. Ваш код пытается позвонить Int 10h
с произвольным значением в AH, оставшимся от более ранних инструкций. Код должен выглядеть так:
xor ah, ah ; AH=0 Set Video Mode
mov al,13h ; Video Mode 13h
int 10h
ret
Или просто:
mov ax, 0013h ; AH = 0h Video Mode Set, AL = Video Mode 13h
int 10h
ret
Чтобы собрать и скомпилировать это с помощью MASM и TCC, мне пришлось разделить компиляцию и соединение с:
masm main.asm;
tcc -Ic:\tcpp\include -ms -c cmain.c
tlink c0s cmain.obj main.obj,chgmode.exe,,cs -Lc:\tcpp\lib
c:\tcpp\include
а также c:\tcpp\lib
должны быть заменены каталогами, подходящими для вашей среды, чтобы TCC и TLINK могли найти включаемые файлы и библиотеки. c0s
а также cs
являются объектом запуска C и библиотекой для модели памяти SMALL. Замените последнюю букву буквой, соответствующей модели памяти, для которой вам нужно построить.
c0t
а такжеct
для крошечныхc0s
а такжеcs
для маленькихc0c
а такжеcc
для компактныхc0m
а такжеcm
для среднегоc0l
а такжеcl
для большогоc0h
а такжеch
для огромных
Командная строка TCC устанавливает модель памяти также для каждого файла C, который вы компилируете -ms
для маленькой модели памяти. Измените последнюю букву, аналогичную приведенной выше.
По сути, этот процесс компилирует файлы C и файлы сборки в отдельные объектные файлы, а затем связывает их все вместе на последнем шаге.