C与汇编互调实例

来源:互联网 发布:js数组删除 编辑:程序博客网 时间:2024/05/12 04:06

C语言调用汇编实例:

extern void strcopy(char *d, const char *s);  // 使用关键词extern声明strcopy  extern void strcopy(char *d,const char *s);
int casm_test1()
{
    const char *srcstr = "First string - source";
    char dststr[] = "Second string - destination";
    Uart_Printf("Before copying: \n");         
    Uart_Printf("%s\n %s\n", srcstr, dststr);
    strcopy(dststr, srcstr);                                         // 将源串和目标串地址传递给strcopy
    Uart_Printf("After copying:\n");
    Uart_Printf(" %s\n %s\n", srcstr, dststr);
    return (0);
}

在另一个汇编文件中:
 AREA SCopy, CODE, READONLY               
 EXPORT strcopy    ;使用EXPORT伪操作声明本汇编程序      
strcopy                      ; 寄存器R0中存放第1个参数,即dststr   目标字符串   
                                   ; 寄存器R1中存放第2个参数,即srcstr  源字符串    
 LDRB r2, [r1], #1  ;[r1]=[r1]+1 R1的值(地址)加1(1个字节)
 STRB r2, [r0], #1  ;[r1]=[r1]+1 R0的值(地址)加1(1个字节)
 CMP r2, #0
 BNE strcopy
 MOV pc, lr
 END

小结:在C中调用时,需要使用extern关键字进行调用声明;在相应的汇编程序中,需要使用EXPORT伪操作声明。

 

汇编调用C实例:

Stack_Size  EQU     0x00000400                                                          ;指定栈的大小

 AREA    STACK, DATA, NOINIT, READWRITE, ALIGN=3                 ;声明一个数据段,初始化为0 指定后边的指令为8字节对齐
Stack_Mem SPACE   Stack_Size                                                          ;分配一片内存单元用作栈空间

 PRESERVE8                                                                                            ;声明8字节对齐 
 
 AREA CAsm_Test2, CODE, READONLY
 ENTRY
 CODE32                                                                                                     ;通知编译器后边的指令是32对齐的arm指令
start
;初始化栈。注意栈只能先分配栈空间,并初始化后,才能使用SP指针
 LDR     R0, =Stack_Mem 
;  set its Stack Pointer
 MOV     SP, R0                                                                                                ;设置栈指定SP,指向Stack_Mem地址空间
 SUB     SL, SP, #Stack_Size  ;;;;;;;;;SL即R10

 BL call_g
 B stop

call_g  
 IMPORT g                  ;使用伪操作IMPORT声明C程序g()
 MOV R0, #0x1
 STR LR, [SP, #-4]!    ;保存返回地址

 ADD R1, R0, R0        ;假设进入程序f时,r0中值为i,r1值设为2*i
 ADD R2, R1, R0        ;r2值设为3*i
 ADD R3, R1, R2        ;r3值设为5*i
 STR R3, [SP, #-4]!    ;第五个参数5*i通过数据栈传递
 ADD R3, R1, R1        ;r3值设为4*i

 BL  g                           ;调用C程序g()
 NOP

 ADD SP, SP, #4        ;调整数据栈指针,准备返回
 LDR PC, [SP], #4      ;返回

stop
 B stop

 END

相应的C文件:

int g(int a, int b, int c, int d, int e)
{
    return (a+b+c+d+e);
}
小结:在汇编中使用使用伪操作IMPORT声明C程序g(),进而在相应位置使用  BL g 完成调用。