使用 Turbo-C++ 3.0 工具链接混合的 C 和汇编文件时程序失败

Program fails when linking a mix of C and assembly files with Turbo-C++ 3.0 tools

我有以下旨在将屏幕模式设置为模式 13 的汇编代码:

.model small
.code

public _func

_func proc
        mov al,13h
        int 10h
    ret
_func endp
END

已成功组装成目标文件main.obj 现在我正在尝试从以下 C 代码调用 public _func:

extern void func();

int main() {

    func();
    return(0);
}

但我不知道如何 link 这两个对象来生成一个可用的 exe 我在谷歌上搜索了很多,但大多数帖子都在 GCC 编译器中

我试过以下命令行: tcc cmain.c main.obj

我得到了exe文件CMAIN.EXE 但它不会将模式更改为模式 13 它只显示消息 "Abnormal program termination"

我正在使用 turbo c++ 3.0 编译器和 masm5.11 汇编器 让它工作的正确命令是什么?

我浪费了很多时间才看到的是你的代码有错误:

mov al,13h
int 10h
ret

您实际上并没有将 AHVideo Mode Set subfunction of INT 10h. Your code attempts to call Int 10h 设置为 0 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

为了达到 assemble 并使用 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\includec:\tcpp\lib 必须替换为适合您环境的目录,以便 TCC 和 TLINK 可以找到包含文件和库。 c0scs 是 SMALL 内存模型的 C 运行时启动对象和库。将最后一个字母替换为适合您需要构建的内存模型的字母。

  • c0tct 对于 tiny
  • c0scs
  • c0ccc 紧凑型
  • c0mcm
  • c0lcl
  • c0hch 巨大

TCC 命令行也为您编译的每个 C 文件设置内存模型 -ms 是针对 SMALL 内存模型。像上面一样更改最后一个字母。

有效地,此过程将 C 文件和程序集文件编译为单独的目标文件,然后在最后一步将它们链接在一起。