51 汇编和C的混用注意事项

1. 汇编代码的变量一般是自己定义地址空间, 而C是由编译器进行分配,分配空间在下面截图黑框分别设置code memory和xdata memory.注意避开汇编使用到的地址,可以忽略汇编代码部分和DB字段定义的部分,但是要注意EQU字段定义的宏,它可能是定义为地址空间使用,还有要注意之前汇编使用的地址段,用来存储变量,但是没有用DB字段进行初始化。

51 汇编和C的混用注意事项

2.小心局部变量,如果上图memory model选择的是in data,那将默认存储在内部存储器data区空间,下表示定义变量时加下述关键字,能定义变量到相应区域

存储类型 说明
data 直接访问内部数据存储器(128字节),访问速度最快
bdata 可位寻址内部数据存储器(16字节0x20-0x2f),允许位与字节混合访问
idata 间接访问内部数据存储器(256字节),允许访问全部内部地址
pdata 分页访问外部数据存储器(256字节),用MOVX  @Ri指令访问
xdata 外部数据存储器,用MOVC @DPTR指令访问
code

程序存储器,用MOVC @A+DPTR指令访问

 

 

 

 

 

 

 

 

3. 汇编调用C代码,当代码有传递参数时,在C函数名前加下划横杠,没有则为C函数名,传递给C的变量通过中间寄存器实现,      如下表:

传递参数用到的寄存器
参数 char int long/float 通用指针
第一个 R7 R6,R7 R4~R7 R1,R2,R3
第二个 R5

R4,R5

R4~R7 R1,R2,R3
第三个 R3 R2,R3 NULL R1,R2,R3

 

 

 

 

 

函数返回参数用到的寄存器
返回值类型 寄存器 说明
Bit C 由位运算器C返回
(unsigned)char

R7

在R7返回单个字节
(unsigned)int R6,R7 高位在R6低位在R7
(unsigned)long R4~R7 高位在R4低位在R7
float R4~R7 32位EEE格式
通用指针 R1,R2,R3 存储类型在R3高位在R2地位在R1

 

 

 

 

 

 

 

 

例子如下,

1.下面MACRO宏定义可以当作C函数调用的方式使用,很方便;

2. 注意 _UartPutx 需要在使用的.asm文件定义

extrn   code(_UartPutc):

PCHAR    MACRO    Tmp
        MOV        R7, Tmp
        CALL    _UartPutx               ;UartPutx为C代码,只有一个参数
ENDM