ARM汇编指令学习(2) - C和汇编互相调用

时间:2020-12-27 01:05:52

程序要求:

使用汇编语言设计一个产生随机数的函数,然后通过C语言来调用该函数产生一系列随机数,并存放到数组中。

 

这个代码本身不难,但关键是在于ATPCS调用规范,下次再在另一篇文章中详细总结下ATPCS规范。

实验编译器:ADS 1.2

实验代码分3个部分:

1、用于启动时初始化、以及为调用C函数做准备的初始化代码init.s

2、主要的C函数代码randtest.c

3、产生随机数的汇编代码random.s

 

程序清单:

init.s

 1 ;==============================================================================
 2 ; Init.s: 工程入口
 3 ;==============================================================================
 4     AREA    Init, CODE, READONLY    
 5     CODE32                            
 6                                 
 7     ENTRY
 8 
 9 ; 异常向量表
10 START
11     B    RESET_HANDLER
12 
13 UNDEFINED_HANDLER
14     B    UNDEFINED_HANDLER
15 
16 SWI_HANDLER
17     B    SWI_HANDLER
18 
19 PREFETCH_HANDLER
20     B    PREFETCH_HANDLER
21 
22 ABORT_HANDLER
23     B    ABORT_HANDLER
24 
25 IRQ_HANDLER
26     B    IRQ_HANDLER    
27 
28 FIQ_HANDLER
29     B    FIQ_HANDLER
30 
31 
32 RESET_HANDLER
33     LDR    SP,    =0X00002000        ; 堆栈指针
34     IMPORT    main            
35     LDR    R0,    =main
36     MOV    LR,    PC                ; 保存PC指针值    
37     BX    R0                    ; 跳转到randtest.c中main函数
38 
39 END
40     B    END
41 
42     END

 

randtest.c

 1 /* randtest.c: 随机数产生测试例子,程序通过调用random.s中的
 2  * 函数randomnumber来产生随机数 
 3  */
 4 
 5 /* this function prototype is needed because 'randomnumber' is external */
 6 extern unsigned int randomnumber( void );
 7 
 8 int 
 9 main()
10 {
11       int i;
12       int nTemp;
13       unsigned int random[10];
14 
15       for(i = 0; i < 10; i++ ){ 
16               nTemp = randomnumber();
17               random[i] = nTemp;
18       }
19     
20       return 0;
21 }

 

random.s

 1  AREA    |Random$$code|, CODE, READONLY
 2         CODE32
 3 
 4         EXPORT  randomnumber
 5 
 6 randomnumber
 7 ; on exit:
 8 ;       a1 = low 32-bits of pseudo-random number
 9 ;       a2 = high bit (if you want to know it)
10         LDR     ip, |seedpointer|
11         LDMIA   ip, {a1, a2}
12         TST     a2, a2, LSR#1           ; to bit into carry
13         MOVS    a3, a1, RRX             ; 33-bit rotate right
14         ADC     a2, a2, a2              ; carry into LSB of a2
15         EOR     a3, a3, a1, LSL#12      ; (involved!)
16         EOR     a1, a3, a3, LSR#20      ; (similarly involved!)
17         STMIA   ip, {a1, a2}
18 
19         MOV     pc, lr
20 
21 
22 |seedpointer|
23         DCD     seed
24 
25 
26         AREA    |Random$$data|, DATA
27 
28         EXPORT  seed
29 seed
30         DCD     &55555555
31         DCD     &55555555
32 
33         END

 

附件ADS 1.2工程代码