写一段 ARM汇编程序:循环累加队列myarray中的所有元素,直到碰上零值元素,结果放在r4中.

写一段 ARM汇编程序:循环累加队列myarray中的所有元素,直到碰上零值元素,结果放在r4中.,第1张

小学文化不懂啥是循环队列,也不懂C语言。

如果是一定地址之间循环的数组的话可以参照下我下面写的。

r4貌似要存不了这么大的数啊

汇编器 arm-none-eabi-as

equ myarray, 0x20000018

equ duiliechangdu, 40

ldr r0, = myarray

ldr r3, = duiliechangdu

mov r1, r3

mov r2, # 0

mov r4, # 0

dd1:

ldr r2, [r0, r1]

add r4, r4, r2

cmp r2, # 0

beq tiaochuqu

subs r1, # 4

bne dd1

mov r1, r3

b dd1

tiaochuqu:

b tiaochuqu

N

EQU

5

;定义N

代表5

AREA

Adding,

CODE,

READONLY

;定义段名Adding

读代码段

ENTRY

;指定程序入口

MOV

R0,#0

立即数0加载

R0

MOV指令

能加载8位立即数

MOV

R1,#1

立即数1加载

R1

#代表

立即数

REPEAT

设置标号

ADD

R0,R0,R1

R0

R1项加并存储

R0

ADD

R1,R1,#1

;;

R1

立即数1项加并存储

R1

CMP

R1,#N

;比较R1

立即数N

N前面定义代表5;

BLE

REPEAT

相等跳转

标号REPEAT

相等继续往

执行

LDR

R2,=RESULT

;加载表RESULT

R2

STR

R0,[R2]

R0存储

R2指向

HERE

B

HERE

B

条件跳转

标号HERE

AREA

DataSpace,

DATA,

READWRITE

;定义段名DataSpace

读写数据段

RESULT

DCD

0;定义表

END

;程序结束

;以下为六种中断堆栈大小定义

UND_Stack_Size EQU 0x00000000 ;EQU是汇编伪指令,可以将它代替为“=”

SVC_Stack_Size EQU 0x00000008

ABT_Stack_Size EQU 0x00000000

FIQ_Stack_Size EQU 0x00000000

IRQ_Stack_Size EQU 0x00000080

USR_Stack_Size EQU 0x00000400

ISR_Stack_Size EQU (UND_Stack_Size + SVC_Stack_Size + ABT_Stack_Size + \

FIQ_Stack_Size + IRQ_Stack_Size) ;同上解释

;定义段,名为STACK,未说明是代码段还是数据段,属性为读写,代码对齐方式为2的3次方字节

AREA STACK, NOINIT, READWRITE, ALIGN=3

;SPACE分配一段连续的的存储区域并初始化为0,USR_Stack_Size为要分配的字节数

Stack_Mem SPACE USR_Stack_Size

__initial_sp SPACE ISR_Stack_Size

1A,P1,P2,,P17,P18(以点定义面)

2AADD,NA1,NA2,NA8,NA9(面相加)

3AATT,MAT,REAL,TYPE,ESYS,SECN(指定面的单元属性)

注ESYS为坐标系统号、SECN为截面类型号。

4ABBR,Abbr,String(定义一个缩略词)

5ABBRES,Lab,Fname,Ext(从文件中读取缩略词)

6ABBSAVE,Lab,Fname,Ext(将当前定义的缩略词写入文件)

7ABS,IR,IA,--,--,Name,--,--,FACTA(取绝对值)

8ACCAT,NA1,NA2(连接面)

9ACEL,ACEX,ACEY,ACEZ(定义结构的线性加速度)

10ACLEAR,NA1,NA2,NINC(清除面单元网格)

11ADAMS,NMODES,KSTRESS,KSHELL

12ADAPT,NSOLN,STARGT,TTARGT,FACMN,FACMX,KYKPS,KYMAC

13ADD,IR,IA,IB,IC,Name,--,--,FACTA,FACTB,FACTC(变量加运算)

14ADELE,NA1,NA2,NINC,KSWP(删除面)

注KSWP=0删除面但保留面上关键点、1删除面及面上关键点。

15ADRAG,NL1,NL2,,NL6,NLP1,NLP2,,NLP6(将既有线沿一定路径拖拉成面)

16AESIZE,ANUM,SIZE(指定面上划分单元大小)

17AFILLT,NA1,NA1,RAD(两面之间生成倒角面)

18AFSURF,SAREA,TLINE(在既有面单元上生成重叠的表面单元)

19AFUN,Lab(指定参数表达式中角度单位)

20AGEN,ITIME,NA1,NA2,NINC,DX,DY,DZ,KINC,NOELEM,IMOVE(复制面)

21AGLUE,NA1,NA2,,NA8,NA9(面间相互粘接)

22AINA,NA1,NA2,,NA8,NA9(被选面的交集)

23AINP,NA1,NA2,,NA8,NA9(面集两两相交)

24AINV,NA,NV(面体相交)

25AL,L1,L2,,L9,L10(以线定义面)

26ALIST,NA1,NA2,NINC,Lab(列表显示面的信息)

注Lab=HPT时,显示面上硬点信息,默认为空。

27ALLSEL,LabT,Entity(选择所有实体)

注LabT=ALL(指定实体及其所有下层实体)、BELOW(指定实体及其下一层实体);

Entity=ALL、VOLU、AREA、LINE、KP、ELEM、NODE。

28AMESH,NA1,NA2,NINC(划分面生成面单元)

AMESH,AREA,KP1,KP2,KP3,KP4(通过点划分面单元)

29/AN3D,Kywrd,KEY(三维注释)

30ANCNTR,NFRAM,DELAY,NCYCL(在POST1中生成结构变形梯度线的动画)

31ANCUT,NFRAM,DELAY,NCYCL,QOFF,KTOP,TOPOFF,NODE1,NODE2,NODE3(在POST1中生成等势切面云图动画)

32ANDATA,DELAY,NCYCL,RSLTDAT,MIN,MAX,INCR,FRCLST,AUTOCNTRKY(生成某一范围内的结果数据的顺序梯度线动画)

33ANDSCL,NFRAM,DELAY,NCYCL(在POST1中生成结构变形的动画)

34ANFLOW,NFRAM,DELAY,NCYCL,TIME,SPACING,SIZE,LENGTH(生成粒子流或带电粒子运动的动画)

35/ANGLE,WN,THETA,Axis,KINCR(绕指定轴旋转视图)

36ANHARM,NFRAM,DELAY,NCYCL(生成谐波分析的动画)

37ANIM,NCYCL,KCYCL,DELAY(动画显示图形序列)

38ANISOS,NFRAM,DELAY,NCYCL(在POST1中生成等势面云图动画)

39ANMODE,NFRAM,DELAY,NCYCL,KACCEL(在POST1中生成结构变形模态的动画)

40/ANNOT,Lab,VAL1,VAL2(激活图形显示注释)

注Lab=OFF、ON、DELE、SAVE、SCALE、XORIG、YORIG、SNAP、STAT、DEFA、REFR、TMODE。

41ANORM,ANUM,NOEFLIP(重新定义面的法线方向)

注NOEFLIP=0、1。

42ANTIME,NFRAM,DELAY,NCYCL,AUTOCNTRKY,RSLTDAT,MIN,MAX(在指定时间段内生成动画)

43ANTYPE,Antype,Status,LDSTEP,SUBSTEP,Action(定义分析类型)

注Label=STATIC、BUCKLE、MODAL、HARMIC、TRANS;

Status=NEW、REST;

Action=CONTINUE、ENDSTEP、RSTCREATE。

44/ANUM,NUM,TYPE,XHOT,YHOT(指定注释的数目、类型和热点位置)

45AOFFST,NAREA,DIST,KNIC(偏移生成面)

46AOVLAP,NA1,NA2,,NA8,NA9(面搭接)

47APLOT,NA1,NA2,NINC,DEGEN,SCALE(显示所选面)

48APPEND,Lstep,SBSTEP,FACT,KIMG,TIME,ANGLE,NSET(读入载荷结果数据)

49APTN,NA1,NA2,,NA8,NA9(面间相互分割)

50AREFINE,NA1,NA2,NINC,LEVEL,DEPTH,POST,RETAIN(将面附近的单元网格细化)

注LEVEL:指定细化的程度(1、2、3、4、5);DEPTH:指定细化的深度;

POST=CLEAN(对细化区域进行光滑和清理工作)、SMOOTH(只作光滑工作)、OFF;

RETAIN=ON(对于全是四边形的网格,细化不会将三角形引入)、OFF(可能将三角形引入)

51AREVERSE,ANUM,NOEFLIP(将面的法线方向反向)

52AROTAT,NL1,NL2,NL3,NL4,NL5,NL6,PAX1,PAX2,ARC,NSEG(绕轴旋转生成面)

注PAX1,PAX2为定义轴的关键点;ARC为旋转角度。

53ARSCALE,NA1,NA2,NINC,RX,RY,RZ,KINC,NOELEM,IMOVE(面缩放)

54ASBA,NA1,NA2,SEPO,KEEP1,KEEP2(面减面)

55ASBL,NA,NL,SEPO,KEEP1,KEEP2(面减线)

56ASBV,NA,NV,SEPO,KEEP1,KEEP2(面减体)

57ASBW,NA,SEPO,KEEP(工作平面分离面)

58ASEL,Type,Item,Comp,VMIN,VMAX,VINC,KSWP(选择面)

注Item=HPT时,选择包含硬点的面。

59ASKIN,NL1,NL2,,NL8,NL9(通过引导线由蒙皮生成光滑曲面)

60ASUB,NA1,P1,P2,P3,P4(选择面的一部分生成新面)

61ARSYM,Ncomp,NA1,NA2,NINC,KINC,NOELEM,IMOVE(面镜像)

62ATRAN,KCNTO,NA1,NA2,NINC,KINC,NOELEM,IMOVE(将面转化到另一坐标系)

63/AUTO,WN(启动自动调整模式)

64AUTOTS,Key(设定自动时间步长)

65AVPRIN,KEY,EFFNU(指定在同一节点处先计算主应力或矢量和,再进行平均)

66/BATCH,Lab(进入批处理模式)

注Lab=LIST(批处理的输出包括输入文件列表)、black。

67BF,NODE,Lab,VAL1,VAL2,VAL3,PHASE(在节点上施加体载荷)

68BFA,AREA,Lab,VAL1,VAL2,VAL3,PHASE(在面上施加体载荷)

69BFADELE,AREA,Lab(删除面上的体载荷)

70BFALIST,AREA,Lab(列表显示面上的体载荷)

71BFCUM,Lab,Oper,FACT,TBASE(设置节点上体载荷的施加方式)

注Oper=REPL(后定义的值替换原值)、ADD(后定义的值与原值相加)、IGNO(忽略后值);

72BFDELE,NODE,Lab(删除节点上的体载荷)

73BFE,ELEM,Lab,STLOC,VAL1,VAL2,VAL3,VAL4(在单元上施加体载荷)

74BFECUM,Lab,Oper,FACT,TBASE(设置单元上体载荷的施加方式)

75BFEDELE,ELEM,Lab(删除单元上的体载荷)

76BFELIST,ELEM,Lab(列表显示单元上的体载荷)

77BFESCALE,Lab,FACT,TBASE(按比例缩放节单元上的体载荷)

78BFK,KPOI,Lab,VAL1,VAL2,VAL3,PHASE(在关键上施加体载荷)

79BFKDELE,KPOI,Lab(删除关键点上的体载荷)

80BFKLIST,KPOI,Lab(列表显示线关键点上的体载荷)

81BFL,LINE,Lab,VAL1,VAL2,VAL3,PHASE(在线上施加体载荷)

82BFLDELE,Line,Lab(删除线上的体载荷)

83BFLIST,NODE,Lab(列表显示节点上的体载荷)

84BFLLIST,LINE,Lab(列表显示线上的体载荷)

85BFSCALE,Lab,FACT,TBASE(按比例缩放节点上的体载荷)

86BFTRAN(将实体模型中的体载荷转换到有限元模型)

87BFUNIF,Lab,VALUE(在所有节点施加均匀的体载荷)

88BFV,VOLU,Lab,VAL1,VAL2,VAL3,PHASE(在体上施加体载荷)

89BFVDELE,VOLU,Lab(删除体上的体载荷)

90BFVLIST,VOLU,Lab(列表显示体上的体载荷)

91BLC4,XCORNER,YCORNER,WIDTH,HEIGHT,DEPTH(指定角点位置生成矩形或长方体)

92BLC5,XCENTER,YCENTER,WIDTH,HEIGHT,DEPTH(指定中心位置生成矩形或长方体)

93BLOCK,X1,X2,Y1,Y2,Z1,Z2(根据两角点生成长方体)

94BOPTN,Label,Value(对布尔运算进行设置)

注Label=KEEP,设定是否保留源图元,Value(YES、NO)

Label=PTOL,设定警告或错误信息,Value(0、2、-1)

Label=NWARN,设定布尔运算程序版本,Value(RV52、RV51)

Label=VERSION,设定运算公差,Value

95BSPLIN,P1,P2,P3,P4,P5,P6,XV1,YV1,ZV1,XV6,YV6,ZV6(拟合样条曲线)

ADD proc

arg_C equ 0xC

arg_8 equ 8

arg_4 equ 4

arg_0 equ 0

MOV R12, SP

STMFD SP!, {R0-R3} ;四个参数

STMFD SP!, {R4-R10,R12,LR}

SUB SP, SP, #0x10

LDR R0, [SP,#0x34+arg_0]

LDR R1, [SP,#0x34+arg_4]

LDR R2, [SP,#0x34+arg_8]

ADD R0, R0, R1

ADD R0, R0, R2

ADD SP, SP, #0x10

LDMFD SP, {R4-R10,SP,PC}

ENDP

如果参数传递大于 4 个,那么你在 BL 的地方应使用:

STR R0, [SP,#0x8] ;第七个

STR R0, [SP,#0x4] ;第六个

STR R0, [SP,#0x0] ;第五个

============================================

我理解你的意思了

LDR r0,=0x1

LDR r1,=0x2

LDR r2,=0x3

BL add

改为:

LDR r0,=0x1

STR R0, [SP,#0x0]

LDR r1,=0x2

STR R1, [SP,#0x4]

LDR r2,=0x3

STR R2, [SP,#0x8]

BL ADD

你是这个意思吧

------------

int a = R0

int b = R1

int c = R2

以上就是关于写一段 ARM汇编程序:循环累加队列myarray中的所有元素,直到碰上零值元素,结果放在r4中.全部的内容,包括:写一段 ARM汇编程序:循环累加队列myarray中的所有元素,直到碰上零值元素,结果放在r4中.、帮忙解释一下这段ARM汇编程序代码,谢谢!、关于ARM启动代码的简单问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10216766.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存