> 文档中心 > 【ARM汇编数组】如何对键入的数据做判断?(下)

【ARM汇编数组】如何对键入的数据做判断?(下)

在这里插入图片描述

大家好,我是汤姆凯特。

文章目录

  • 【ARM汇编数组】如何对键入的数据做判断?(下)
    • 写在前面:
    • 如何对键入的数据做判断?
    • 第一步、用循环把数据键入数组
        • 循环框架
        • 存入一个数后向后取地址
        • 初始化用到的寄存器
    • 第二步、用循环对数组中的数据进行判断
        • 循环框架、定义新循环接口
        • 全部寄存器重新初始化
        • 向后取址且每次做判断并累加
        • 输出累加计数和
    • 第三步、定义全局变量
        • 在键入数组之前需要先有一个提示语句
        • 定义键入数组时的格式串格式
        • 定义输出语句时的格式串格式
        • 给出自定义长度的空数组
    • 源代码
    • 运行结果
    • 总结

每篇前言


☀️作者简介:大家好我是汤姆凯特,大家可以叫我汤姆
🐋个人主页:IM汤姆凯特的CSDN博客
🎁系列专栏:【ARM嵌入式基础】
🌱每日一句:
如果此刻你走的辛苦,就证明你正在走上坡路。


【ARM汇编数组】如何对键入的数据做判断?(下)

写在前面:

在这篇【如何对键入数据做判断】中提到了想要对键入的数据做判断有两种方式:1.把键入这个动作放到循环中,键入一次做一次判断。2.用循环把键入的数据全部放到数组中,然后再用循环对数组进行判断。

上篇给大家介绍了第一种方式,这里给大家介绍第二种方式。

如何对键入的数据做判断?

如果我们可以把键入的数据存放到数组中,那么就可以对数组中的数据遍历进行一系列操作。之前我们没有学到将数据键入到数组,所以只能实时判断意义不大,我们学了这篇《如何将键入的数据存到数组中?》后再来试着写一下第二种方式。

第一步、用循环把数据键入数组

  1. 循环框架

  2. 存入一个数后向后取地址

  3. 初始化用到的寄存器

    mov r4,#0    ldr r5, =ary     b testforloop:    ldr r0,=fmt1 mov r1,r5 add r5,#4 bl scanf add r4,#1testfor:cmp r4,#5 blt loop

第二步、用循环对数组中的数据进行判断

  1. 循环框架、定义新循环接口

  2. 全部寄存器重新初始化

  3. 向后取址且每次做判断并累加

  4. 输出累加计数和

    mov r4,#0    mov r7,#0    mov r8,#0    mov r9,#0    mov r10,#0    ldr r5, =ary b testfor2loop2:  ldr r2,[r5],#4 cmp r2,#0 addgt r7,#1 addgt r9,r2 addlt r8,#1 addlt r10,r2  add r4,#1testfor2:cmp r4,#5 blt loop2 ldr r0,=fmt2 mov r1,r7 mov r2,r8 bl printf ldr r0,=fmt3 mov r1,r9 mov r2,r10 bl printf

第三步、定义全局变量

通过前面两步,将用到的格式串和全局变量初始化定义
  1. 在键入数组之前需要先有一个提示语句

  2. 定义键入数组时的格式串格式

  3. 定义输出语句时的格式串格式

  4. 给出自定义长度的空数组

.data    fmt0:.asciz "Type five numbers into the array\n"    fmt1:.asciz "%d"    fmt2:.asciz " The number of positive:%d\n The number of negative:%d\n"    fmt3:.asciz " The positive and:%d\n The negative and:%d\n"    ary:.word 0,0,0,0,0

源代码

.data    fmt0:.asciz "Type five numbers into the array\n"    fmt1:.asciz "%d"    fmt2:.asciz " The number of positive:%d\n The number of negative:%d\n"    fmt3:.asciz " The positive and:%d\n The negative and:%d\n"    ary:.word 0,0,0,0,0.text.globl main main:    stmfd sp!,{lr}    mov r4,#0    ldr r5, =ary     ldr r0,=fmt0    bl printf    b testforloop:    ldr r0,=fmt1 mov r1,r5 add r5,#4 bl scanf add r4,#1testfor:cmp r4,#5 blt loop mov r4,#0    mov r7,#0    mov r8,#0    mov r9,#0    mov r10,#0    ldr r5, =ary b testfor2loop2:  ldr r2,[r5],#4 cmp r2,#0 addgt r7,#1 addgt r9,r2 addlt r8,#1 addlt r10,r2  add r4,#1testfor2:cmp r4,#5 blt loop2 ldr r0,=fmt2 mov r1,r7 mov r2,r8 bl printf ldr r0,=fmt3 mov r1,r9 mov r2,r10 bl printf    mov r0, #0    ldmfd sp!,{lr}    mov pc, lr.end

运行结果

在这里插入图片描述

总结

  • 汇编语言的实现的多个功能可以模块化使用
  • 在模块化使用完之后,全部寄存器的值一定要初始化
  • 汇编操作不是那么直观,一定要多动手实践,在试错中得到正确结论

本期就结束了,如果对您有帮助,点赞+评论支持一下博主再走吧 还没有关注汤姆的朋友,点个关注每天学一点汇编

在这里插入图片描述