ADS的简单使用-使用汇编语言对特定地址的数据进行冒泡排序

似乎还有几步没做,但我新开项目时不做也正常运行,所以跳过了,如果出错请留言。

目的

  • 为0x40009000起始的内存存放16个无符号的8位整数,
  • 并基于ARM汇编程序使用冒泡排序对其从大到小排序。

环境

  • 软件版本:ADS v1.2 (Metrowerks CodeWarrior for ARM Developer Suite v1.2)
  • 操作系统:Windows 10
  • 使用Windows XP(Service Pack 3)兼容模式,以管理员身份运行。如右侧图1所示。
图2:项目正确创建
图1:ADS兼容

创建项目并进入Debug

  1. 打开Metrowerks CodeWarrior for ARM Developer Suite v1.2
  2. 点击File-New打开新建窗口。
  3. 选择Project的ARM Executable Image,输入Project name项目名称并选择Location项目路径。
    • ARM Executable Image:ARM可执行映像,简单的程序选这个即可。
  4. 点击File-New打开新建窗口。
  5. 选择File的Text File,创建源文件
    • 填写File name
      • 如果是汇编,后缀.s
      • 如果是C,后缀.c
    • 勾选Add to Project
    • 选择刚刚创建的项目,并勾选Debug, DebugRel, Release
  6. 正确创建后如上方图2所示
  7. 将代码复制粘贴至work1.s中,ctrl s保存
  8. 点击Make,Compile,检测是否有跳出错误,如无,则点击Debug,如图3。
    • Make、Compile在Debug左侧。
  9. 如果打开Debug后没有进入项目:
    • 点击File-Open
    • 进入项目保存目录中,DebugRel文件夹下的axf文件,打开。
  10. 如果打开Debug后无法正常操作:
    • 点击Option-Configure Target,选择ARMUL,确定。
    • 提示出错也是选择Configure的选项,选择ARMUL,确定。
图3:Debug位置

逐步运行程序

  1. 点击Processor Views
  2. 点击Registers打开寄存器视图
    • 拉下寄存器视图。
    • 点击Current,以便后续观察寄存器变化。
  3. 点击Memory打开内存地址视图
    • 在Start Address处输入十六进制地址。
    • 切换到0x40009000地址区,以便后续观察地址变化,如图5所示。
  4. 添加运行断点:
    • 双击代码左侧序号,例如双击44行。
    • 表示接下来按GO后,一次性运行到第43行。
  5. 运行:
    • 执行按钮位置见图6。
    • Go:运行至结束/断点。
    • Step:下一步,跳过跳转指令。
    • Step in:下一步,可执行跳转指令。
  6. 在44行设置断点,按下Go后:
    • 程序执行到43行,寄存器与内存变化标红。
    • 如图7所示。
  7. 按下Step:
    • 执行第44行,游标指向45行。
    • 寄存器仅R1变化。
    • 如图8所示。
图4:寄存器与内存地址视图
图5:切换地址
图6:执行按钮
图7:按下Go后的寄存器与内存地址变化
图8:按下Step后的寄存器与内存地址变化

代码步骤

  1. 使用EQU将标签指向特定地址。
  2. 使用DCB设定一系列八位数据。
    • DCW,十六位数据
    • DCD,三十二位数据
  3. 存放数据:
    • 初始化:
      • R1加载待保存地址。
      • R2加载数据地址。
      • 计数器R0置0。
    • 开始循环DATA_LOAD:
      • 使用LDRB将R2所指地址的值,移向R3寄存器,并将R2自增指向下一位数据。
      • 使用STRB将R3寄存器的值保存至R1所指地址中,R1自增。
      • 计数器R0自增。
      • 比较R0与15的大小,如果小于则跳转值DATA_LOAD继续循环。
  4. 冒泡排序:
    • 初始化计数器。
    • 如存放数据一般,遍历十六次,在每次遍历中对十六个数据进行比较,置换。
  5. 部分命令释义:
    • STRB/LDRB:以八位存/取数据。
    • BLS:B跳转,LS条件判断,CMP比较后,小于则执行跳转。
    • STRLSB:CMP比较后,小于则以八位存数据。
    • BNE:CMP比较后,不等于则跳转。

代码

DATA_ADDR		EQU		0x40009000

				AREA	Exp1,CODE,READONLY
				ENTRY
				CODE32
			
START			MOV 	R0,#0			;	R0, Counter for data load times
				LDR		R1,=DATA_ADDR	;	R1, Address 0x40009000
				LDR		R2,=DATA		;	R2, Data address
				B		DATA_LOAD
				
DATA			DCB	5,10,15,20,25,30,35,34,33,32,13,12,65,70,75,80
			
DATA_LOAD		LDRB	R3,[R2],#1		;	R3, Data temp storage
				STRB	R3,[R1],#1		;	Save data to memory
				
				ADD		R0,R0,#1		;	Counter increasement
				CMP		R0,#15			;	Compare counter with 15
				BLS		DATA_LOAD		;	Stop data_load when counter == 15
			
				MOV		R0,#0			;	R0,	Counter1 for bubble sort outer loop
LOOP_1									
				LDR		R1,=DATA_ADDR	;	R1, Num1's address1
				ADD		R2,R1,#1		;	R2, Num2's address2
				MOV		R5,#0			;	R5,	Counter2 for bubble sort inner loop
				
LOOP_2			
				LDRB	R3,[R1]			;	R3, Num1
				LDRB	R4,[R2]			;	R4, Num2
				CMP		R3,R4			;	Compare Num1 with Num2 to judge swap condition
				STRLSB	R3,[R2]			;	Condition True, Swap [R1] with [R2]
				STRLSB	R4,[R1]			;	Condition True, Swap [R1] with [R2]
				ADD		R1,R1,#1		;	Address1 increasement
				ADD		R2,R2,#1		;	Address2 increasement
				
				ADD		R5,R5,#1		;	Counter2 increasement
				CMP		R5,#15			;	Loop2 15 times to continue next step
				BNE		LOOP_2			;	Loop2 15 times to continue next step
				
				ADD		R0,R0,#1		;	Counter1 increasement
				CMP		R0,#15			;	Loop1 15 times to continue next step
				BNE		LOOP_1			;	Loop1 15 times to continue next step
				
				MOV		R1,#6			;	Success when R1's value change to 6
				END
			
			

You may also like...

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注