Assembly 使用Turbo-C+;链接C和汇编文件组合时,程序失败+;3.0工具

Assembly 使用Turbo-C+;链接C和汇编文件组合时,程序失败+;3.0工具,assembly,x86,dos,masm,turbo-c++,Assembly,X86,Dos,Masm,Turbo C++,我有以下汇编代码,旨在将屏幕模式设置为模式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); } 但是我不知

我有以下汇编代码,旨在将屏幕模式设置为模式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);
}
但是我不知道如何链接这两个对象来生成一个工作的exe 我在谷歌上搜索了很多,但大多数帖子都是用GCC编译器写的

我尝试了以下命令行: 变矩器离合器主轴承

我得到了文件CMAIN.exe 但它不会将模式更改为模式13 它只显示消息“程序异常终止”

我使用Turbo C++ 3编译器和Mas5.5.汇编程序


什么是使它工作的正确命令?

直到我浪费了很多时间才发现代码中有错误:

mov al,13h
int 10h
ret
您实际上并没有将AH设置为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
为了使之与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可以找到include文件和库
c0s
cs
是小内存模型的C运行时启动对象和库。将最后一个字母替换为适合您需要构建的内存模型的字母

  • c0t
    ct
    用于微型
  • c0s
    cs
    适用于小型
  • 紧凑型的
    c0c
    cc
  • c0m
    cm
    用于中等
  • c0l
    cl
    用于大型
  • c0h
    ch
    用于大型
TCC命令行还为编译的每个C文件设置内存模型
-ms
用于小内存模型。更改与上面类似的最后一个字母


有效地,此过程将C文件和程序集文件编译为单个对象文件,然后在最后一步中将它们链接在一起。

不要使用TurboC++,它已经过时了。使用一些最近的、符合C++14标准的自由软件编译器(或…)谢谢你,Michael,在我做了你建议的更改之后,它现在工作了,但是仍然显示消息(“程序异常终止”)。怎么了?嗯,在使用mov-ah,4ch-int-21h之后,信息是disappeared@Howard:如果您仍然有一个异常程序终止,并且必须通过终止汇编函数来修复它,那么您仍然有一个严重的问题。除了一个不同的LIB和IInclude路径,你在答案中做了正确的步骤吗?在我看来,C库是错误的。我使用了MASM 5.10和TC++3.0。你说你正在使用MASM 5.11。你能通过运行你的MASM(版本应该显示在顶部)来确认吗?@Howard:如果你试图同时使用
tcc
来编译和链接,它可能不起作用,这就是为什么我要分开这些步骤的原因。当然,从我上面描述的版本来看,我肯定,就像我说的,我已经用mov-ah,4ch-int-21h解决了这个问题,它终止程序并退出dos。再次感谢您的关心。