Сбой программы при связывании смеси файлов 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 и файлы сборки в отдельные объектные файлы, а затем связывает их все вместе на последнем шаге.

Другие вопросы по тегам