Assembly 多模块程序
多模块程序是由不止一个目标文件组成的程序。这里出现的所有程序都是多模块程序。它们由C驱动目标文件和汇编目标文件(加上C库目标文件)组成。回忆一下连接程序将目标文件组合成一个可执行程序。连接程序必须把在一个模块(也就是目标文件)中引用的每个变量匹配到定义该变量的模块。为了让模块A能使用定义在模块B里的变量,就必须使用extern(外部)指示符。在extern 指示符后面是用逗号隔开的变量列表。这个指示符告诉编译器把这些变量视为是模块外部的。也就是说,这些变量可以在这个模块中使用,但是却定义在另一模块中。asm_io.inc文件中就将read_int等程序定义为外部的。
在编译语言中,缺省情况下变量不可以由外部程序访问。如果一个变量可以被一个模块访问,而这个模块又不是定义它的,那么在定义它的模块中,它一定被声明为global(全局的)。global 指示符就可以用来做这件事情。图1.7的程序skeleton中的第13行定义了一个全局变量asm main。若没有这个声明,就可能会出错。为什么?因为C代码将会找不到内部的_asm_main变量。
下面是用两个模块重写的以前例子的代码。子程序(get_int和print_sum)在不同的源文件中,而不是在_asm_main程序中。
上面的例子只有全局的代码变量;同样,全局数据变量也可以使用一模一样的方法。