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...

发表评论

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