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

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

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的变量通过中间寄存器实现,      如下表:

传递参数用到的寄存器
参数charintlong/float通用指针
第一个R7R6,R7R4~R7R1,R2,R3
第二个R5

R4,R5

R4~R7R1,R2,R3
第三个R3R2,R3NULLR1,R2,R3

 

 

 

 

 

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

R7

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

 

 

 

 

 

 

 

 

例子如下,

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

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

extrn   code(_UartPutc):

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

4. 汇编中如果用了地址自增(DPTR自增),这在汇编代码是很常见的,因为这个能简化汇编操作.但是这里在C中存在很大问题,如果C中存在地址指针的操作,必定会存在问题,当C代码由编译器转化为汇编时,就会有对DPTR的使用.如果汇编里使能了地址自增,再调用了C代码,而C代码没有失能,那将会导致地址错乱.下面列举了几个C编译为汇编用到DPTR的情况,还会有其他情况,不一一列举:

   a.定义了一个外部变量,外部变量有使用到

       u16 xdata cmp_err_bits;

       cmp_err_bits = 200;

       编译为汇编代码:

       MOV      DPTR,#cmp_err_bits?747
       MOVX     @DPTR,A                        ;运算完自动递增一次
       INC      DPTR                                  ;这里又自增一次,本来只需要自增一次,但这里实际自增两次了
       MOV      A,#0C8H
       MOVX     @DPTR,A

  b.对地址指针的操作,这里不列举出汇编代码

     *((u8 xdata*)(CACHE+IndexSec)) = cmp_err_bits;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

祎猿

点赞

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值