 
- UID
- 852722
|
在C和汇编混合编程的时候,存在C语言和汇编语言的变量以及函数的接口问题。
在C程序中定义的变量,编译为.Asm文件后,都被放进了.Bss区,而且变量名的前面都带了一个下划线。在C程序中定义的函数,编译后在函数名前也带了一个下划线。例如:
Extern Int Num就会变成 .Bss _num, 1
Extern Float Nums[5]就会变成.Bss _nums, 5
Extern Void Func ( )就会变成 _func,
一 汇编和C的相互调用可以分以下几种情况:
(1) 汇编程序中访问C程序中的变量和函数。
在汇编程序中,用_XX就可以访问C中的变量XX了。访问数组时,可以用_XX+偏移量来访问,如_XX+3访问了数组中的XX[3]。
在汇编程序调用C函数时,如果没有参数传递,直接用_funcname 就可以了。如果有参数传递, 则函数中最左边的一个参数由寄存器A给出,其他的参数按顺序由堆栈给出。返回值是返回到A寄存器或者由A寄存器给出的地址。同时注意,为了能够让汇编语言能访问到C语言中定义的变量和函数,他们必须声明为外部变量,即加Extern 前缀。
(2) C程序中访问汇编程序中的变量
如果需要在C程序中访问汇编程序中的变量,则汇编程序中的变量名必须以下划线为首字符,并用Global使之成为全局变量。
如果需要在C程序中调用汇编程序中的过程,则过程名必须以下划线为首字符,并且,要根据C程序编译时使用的模式是Stack-Based Model还是Register Argument Model来正确地编写该过程,使之能正确地取得调用参数。
(3) 在线汇编
在C程序中直接插入 Asm(“ *** ”),内嵌汇编语句,需要注意的是这种用法要慎用,在线汇编提供了能直接读写硬件的能力,如读写中断控制允许寄存器等,但编译器并不检查和分析在线汇编语言,插入在线汇编语言改变汇编环境或可能改变C变量的值可能导致严重的错误。 |
|