文档介绍:1 / 11
电子系统综合设计报告
数可变的子程序参数传递规则
对于参数个数可变的子程序,当参数不超过 4 个时,可以使用寄存器 R0~ R3 来传递
参 数;当参数超过 4个时,还可以使用数据栈来传递参数。
在参数传递时, 将所有参数看作是存放在连续的内存字单元中的字数据。 然后,依次
将 各字数据传送到寄存器 R0、R1、R2、R3中,如果参数多于 4个,将剩余的字数据传送到数 据栈中,入栈的顺序与参数顺序相反, 即最后一个字数据先入栈。 按照上面的规则,一个浮 点数参数可以通过寄存器传递, 也可以通过数据栈传递, 也可能一半通过寄存器传递,另一 半通过数据栈传递。
(2)参数个数固定的子程序参数传递规则 对于参数个数固定的子程序,参数传递与
参数个数可变的子程序参数传递规则不同。
如果系统包含浮点运算的硬件部件,浮点参数将按照下面的规则传
递:
· 各个浮点参数按顺序处理。
· 为每个浮点参数分配 FP寄存器。
· 分配的方法是,满足该浮点参数需要的且编号最小的一组连续的 FP寄存器。第
一 个整数参数,通过寄存器 R0~R3来传递。其他参数通过数据栈传递。
(3)子程序结果返回规则 子程序
中结果返回的规则如下:
· 结果为一个 32 位的整数时,可以通过寄存器 R0 返回。
· 结果为一个 64 位整数时,可以通过寄存器 R0和 Rl返回,依次类推。
· 结果为一个浮点数时,可以通过浮点运算部件的寄存器 f0、 d0 或者 s0 来返回。
· 结果为复合型的浮点数 (如复数 )时,可以通过寄存器 f0~ fN 或者 d0~ dN 来返回。
· 对于位数更多的结果,需要通过内存来传递。
语言函数和 ARM 汇编语言函数间相互调用 高级语言函数与汇编语言函数的混合调用
也要遵循 ATPCS规则,保证程序调用时参数的正确传递。在汇编程序中使用 EXPORT
伪指令声明本子程序,使其它程序可以调用此子程 序,而在 C 语言程序中使用 ex
7 / 11
tern 关键字声明外部函数 (声明要调用的汇编子程序 ),即可调 用此汇编子程序。下面给出两个例子来介绍函数相互调用。
6、实验步骤
8 / 11
1. 编写一段程序,用 P1口作为控制端口,使 D1区的 LED 轮流点亮。原理图如下图。
11 / 11
图3-1 走马灯实验原理图
①仿照实验一的过程,编写程序、汇编、连接、软件仿真,基本达到功能要求。
ORG 0000H
LJMP
MAIN
ORG 0100H
MAIN:
MOV
A,#0FEH
;准备点亮第一只发光管
NEXT:
MOV
P1,A
ACALL
DELAY
RL
A
; 准备点亮下一只发光管
SJMP
NEXT
延时子程序
DELAY:
MOV
R2,#5
DELAY2: MOV
R3,#100
DELAY3: MOV
R4,#100
DJNZ
R4,$
DJNZ
R3,DELAY3
DJNZ
R2,DELAY2
RET
END
调试成功以后,将程序中的 ORG部分的偏移地址再加上 8000H,重新编译。
② 按照原理图,将 A1区 P1口的引线分别连接到 D1区 J52上。
③下载监控程序到实验仪上。短接 A1区的 JP15,连接实验仪串口和主机的串口,将
MOD-SW1拨到 LOAD一边, FLASH-E和 SRAM-E断开,运行主机上 DPFLASH,下载到实验仪上。
④在 Keil系统上,完成程序的动态调试。在主菜单 DEBUG下的 Options for Target ‘Target
1’,点击 Debug,选择 Use Keil Monitor-51 Driver ,并且设置其他参数,将 MOD-SW1拨到 RUN 一边,按复位键,再按 DEBUG下的全速运行命令运行监控程序后,就可以进行动态调试了。
观察和记录各个寄存器内容的变化, 端口 P