文章首发及后续更新:https://mwhls.top/2501.html 新的更新内容请到mwhls.top查看。 无图/无目录/格式错误/更多相关请到上方的文章首发页面查看。
似乎还有几步没做,但我新开项目时不做也正常运行,所以跳过了,如果出错请留言。
目的
- 为0x40009000起始的内存存放16个无符号的8位整数,
- 并基于ARM汇编程序使用冒泡排序对其从大到小排序。
环境
- 软件版本:ADS v1.2 (Metrowerks CodeWarrior for ARM Developer Suite v1.2)
- 操作系统:Windows 10
- 使用Windows XP(Service Pack 3)兼容模式,以管理员身份运行。如右侧图1所示。
创建项目并进入Debug
- 打开Metrowerks CodeWarrior for ARM Developer Suite v1.2
- 点击File-New打开新建窗口。
- 选择Project的ARM Executable Image,输入Project name项目名称并选择Location项目路径。
- ARM Executable Image:ARM可执行映像,简单的程序选这个即可。
- 点击File-New打开新建窗口。
- 选择File的Text File,创建源文件
- 填写File name
- 勾选Add to Project
- 选择刚刚创建的项目,并勾选Debug, DebugRel, Release
- 正确创建后如上方图2所示
- 将代码复制粘贴至work1.s中,ctrl s保存
- 点击Make,Compile,检测是否有跳出错误,如无,则点击Debug,如图3。
- 如果打开Debug后没有进入项目:
- 进入项目保存目录中,DebugRel文件夹下的axf文件,打开。
- 如果打开Debug后无法正常操作:
- 点击Option-Configure Target,选择ARMUL,确定。
- 提示出错也是选择Configure的选项,选择ARMUL,确定。
逐步运行程序
- 点击Processor Views
- 点击Registers打开寄存器视图
- 拉下寄存器视图。
- 点击Current,以便后续观察寄存器变化。
- 点击Memory打开内存地址视图
- 切换到0x40009000地址区,以便后续观察地址变化,如图5所示。
- 添加运行断点:
- 双击代码左侧序号,例如双击44行。
- 表示接下来按GO后,一次性运行到第43行。
- 运行:
- 执行按钮位置见图6。
- Go:运行至结束/断点。
- Step:下一步,跳过跳转指令。
- Step in:下一步,可执行跳转指令。
- 在44行设置断点,按下Go后:
- 程序执行到43行,寄存器与内存变化标红。
- 如图7所示。
- 按下Step:
- 执行第44行,游标指向45行。
- 寄存器仅R1变化。
- 如图8所示。
代码步骤
- 使用EQU将标签指向特定地址。
- 使用DCB设定一系列八位数据。
- 存放数据:
- 初始化:
- R1加载待保存地址。
- R2加载数据地址。
- 计数器R0置0。
- 开始循环DATA_LOAD:
- 使用LDRB将R2所指地址的值,移向R3寄存器,并将R2自增指向下一位数据。
- 使用STRB将R3寄存器的值保存至R1所指地址中,R1自增。
- 计数器R0自增。
- 比较R0与15的大小,如果小于则跳转值DATA_LOAD继续循环。
- 冒泡排序:
- 初始化计数器。
- 如存放数据一般,遍历十六次,在每次遍历中对十六个数据进行比较,置换。
- 部分命令释义:
- 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
|