? AR0(FP)
? AR1(SP)
? AR6
? AR7
其它的寄存器可以不用保护自由使用。
? 如果函数改变了状态寄存器某些有假定值的位,则必须在函数结束前恢复其原有值。尤其要注意ARP必须为AR1
。
? 中断服务程序必须保护所有其用到的寄存器。
? long型和float型变量在存储器中的存储方式为低有效位在低端地址。
? 函数返回值要通过累加器进行传递。
? 编译器会在所有对象的名称前面加下横线,_”,因此汇编语言模块定义对象名称时也要以下横线为前缀,才能使定义的对象可以被C代码访问。例如C语言对象x在汇编语言中就是_x。汇编语言可以使用任何不带下横线前缀的变量而不会和C语言对象冲突。
? 任何汇编语言定义的对象,如果要被C程序访问,则必须用.global修饰。同样任何C语言定义的对象,如果要被汇编语言访问,也必须以.global修饰。
C程序调用汇编语言函数实例
13.2.8 使用内嵌asm语句在C程序中可以用asm语句插入单行汇编语句,用来实现用C
语言很难实现的功能。但是如果使用这种语句,一定小心不要破坏C运行环境,因为C编译器不会对这种插入的汇编语句进行检查或分析。
? 不要插入跳转或标签,否则会破坏编译器的堆栈处理算法,造成无法预期的后果。
? 不要修改C变量,但可以任意读取C变量当前值。
? 不要在内嵌汇编语句中书写修饰性汇编代码(如.text、
.data等),否则会破坏汇编环境。
内嵌汇编语句可以用来在编译输出结果中添加注释。
asm(,***** this is an assembly language comment”);
13.2.9 C程序访问汇编语言变量有时候需要在C程序中访问汇编语言变量,这通常有两种方式:
? 访问.bss块中的变量:
? 将要访问的变量定义在.bss块中。
? 用.golbal修饰要访问的变量。
? 在汇编语言中以下横线,_”为前缀声明要访问的变量。
? 在C语言中将变量声明为外部变量(extern),就可以进行正常访问。
? 访问非.bss块中的变量:
要访问非.bss块中的变量,通常的办法是在汇编语言中定义一个查找表,然后在C语言中通过指针来访问。
? 首先定义变量,而且最好放在独立的初始化块中。
? 定义一个全局的标识指向对象的起始点,这样对象可以分配在存储器空间的任何位置。
? 在C程序中将这个对象定义为外部对象(extern),并且对象名称不带下横线,_”前缀,就可以对其进行正常访问。
13.2.10 修改编译器输出结果程序设计者可以检查和修改C编译器输出的汇编语言程序,然后再对其进行汇编编译和连接。
在C语言可以使用内嵌汇编语句在编译输出结果中添加注释,以改善编译器输出汇编程序的可读性。
/***************************************************/
asm(,***** this is an assembly language comment”);
/***************************************************/
13.2.11 系统初始化
C程序开始运行时,必须首先初始化C运行环境,这是通过
c_int0函数完成的,这个函数在运行支持库(rts,
runtime-support library)中。连接器会将这个函数的入口地址放置在复位中断向量处,使其可以在初始化时被调用。
c_int0函数进行以下工作以建立C运行环境:
?为系统堆栈产生.stack块,并初始化堆栈指针。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/ruanjian/article-29489-51.html
都比饮料一样的酒
应该说爱卿所言甚是
美国佬在叙利亚被普京把了脸跑到南海来撒野