如何使用Turbo C 2.01编写内联汇编?

时间:2017-11-30 18:56:34

标签: c assembly inline-assembly turbo-c

我想在DOS程序中编写一些内联汇编程序,该程序是使用Turbo C 2.01编译的。我写的时候

asm {
   nop
}

编译器声称in-line assembly is not allowed in function ...。请参阅:Inline assembly error Turbo C 2.01

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

请参阅Turbo C user manual第430页:

  

不允许内联汇编

     

您的源文件包含内联汇编语言语句,您正在从中编译它   综合环境。您必须使用TCC命令来编译它   源文件。

我认为您还需要将-B选项传递给TCC(第455页)。

或者,您可以使用__emit__(第103页)将相对简单的代码作为机器代码而不是汇编程序助记符输入。

在IDE中不允许内联汇编似乎是一个奇怪的限制。您可能会考虑升级"到Turbo C ++ 3.0,我相信它确实允许它。我想象TC ++在使用.c文件时会编译C代码,或者IDE可以设置为显式编译C.那也是manual

答案 1 :(得分:-1)

Turbo C将C代码直接转换为机器代码而不使用汇编程序阶段,因此不能在程序中包含汇编语言源。但它可以做的是使用__emit指令插入机器代码。最简洁的方法是使用一个单独的汇编程序(或者DEBUG)将自己感兴趣的代码自己处理成一个COM文件,然后将其中的字节值输入__emit指令。参数以从左到右的升序存储,从BP + 4(小型,小型或紧凑型)或BP + 6(中型,大型或大型)开始。局部变量存储在BP以下的地址。

使用Turbo Pascal时,可以使用名为"内联汇编程序的方便程序"将汇编语言源转换为Turbo Pascal文字代码指令。 Turbo Pascal的指令格式与C&C(我更喜欢Pascal更好)的格式不同,并且可以用Turbo C不能的方式容纳标签。尽管如此,使用__emit对构建时间的影响可能远小于尝试使用内联汇编代码。