使用 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
您实际上并没有将 AH 的 Video 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\include
和 c:\tcpp\lib
必须替换为适合您环境的目录,以便 TCC 和 TLINK 可以找到包含文件和库。 c0s
和 cs
是 SMALL 内存模型的 C 运行时启动对象和库。将最后一个字母替换为适合您需要构建的内存模型的字母。
c0t
和 ct
对于 tiny
c0s
和 cs
小
c0c
和 cc
紧凑型
c0m
和 cm
中
c0l
和 cl
大
c0h
和 ch
巨大
TCC 命令行也为您编译的每个 C 文件设置内存模型 -ms
是针对 SMALL 内存模型。像上面一样更改最后一个字母。
有效地,此过程将 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);
}
但我不知道如何 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
您实际上并没有将 AH 的 Video 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\include
和 c:\tcpp\lib
必须替换为适合您环境的目录,以便 TCC 和 TLINK 可以找到包含文件和库。 c0s
和 cs
是 SMALL 内存模型的 C 运行时启动对象和库。将最后一个字母替换为适合您需要构建的内存模型的字母。
c0t
和ct
对于 tinyc0s
和cs
小c0c
和cc
紧凑型c0m
和cm
中c0l
和cl
大c0h
和ch
巨大
TCC 命令行也为您编译的每个 C 文件设置内存模型 -ms
是针对 SMALL 内存模型。像上面一样更改最后一个字母。
有效地,此过程将 C 文件和程序集文件编译为单独的目标文件,然后在最后一步将它们链接在一起。