程序要求:
使用汇编语言设计一个产生随机数的函数,然后通过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工程代码