美图欣赏 | 设为首页 | 加入收藏 | 网站地图

当前位置:电脑中国 > 编程 > C语言 >

ARM中C语言和汇编语言的或者编程实例讲解

2018-01-28 15:12|来源:未知 |作者:dnzg |点击:

1.内联汇编

在C语言中内嵌汇编注意事项:

?

1

2

3

4

5

6

7

不能直接向PC寄存器赋值,程序跳转要使用B或者BL指令

 

在使用物理寄存器时,不要使用过于复杂的C表达式,避免物理寄存器冲突

 

 R12和R13可能被编译器用来存放中间编译结果,计算表达式值时可能将R0到R3、R12及R14用于子程序调用,因此要避免直接使用这些物理寄存器

 

一般不要直接指定物理寄存器,而让编译器进行分配

示例程序:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

#include <stdio.h deep="5">

void my_strcpy(const char *src, char *dest)

{

       char ch;

       __asm

       {

              loop:

              ldrb       ch, [src], #1

              strb       ch, [dest], #1

              cmp        ch, #0

              bne         loop

       }

}

int main()

{

       char *a = "forget it and move on!";

       char b[64];

       my_strcpy(a, b);

       printf("original: %s", a);

       printf("copyed:   %s", b); 

       return 0;

}</stdio.h>

在汇编语言中使用C语言中定义的全局变量

使用内联汇编不需要单独编译编译汇编文件使用起来非常方便,但是使用内联汇编有诸多的限制,当汇编文件较多的时候就需要使用专门的汇编文件编写汇编程序,在C语言和汇编语言进行数据传递的最简单的形式就是使用,全局变量。

?

1

2

3

4

5

6

7

8

9

10

11

12

#include <stdio.h>

int gVar_1 = 12;

extern        asmDouble(void);

 

int main()

 

{

       printf("original value of gVar_1 is: %d", gVar_1);

       asmDouble();

       printf("       modified value of gVar_1 is: %d", gVar_1);

       return 0;

}</stdio.h>

对应的汇编语言文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

;called by main(in C),to double an integer, a global var defined in C is used.

       AREA asmfile, CODE, READONLY

       EXPORT   asmDouble

       IMPORT   gVar_1

 

asmDouble

       ldr r0, =gVar_1

       ldr  r1, [r0]

       mov  r2, #2     

       mul  r3, r1, r2

 

       str  r3, [r0]

       mov  pc, lr

 

 

       END

(责任编辑:dnzg)
相关阅读