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

在这里插入图片描述

大家好,我是汤姆凯特。

每篇前言

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


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

写在前面:

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

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

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

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

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

  1. 循环框架
  2. 存入一个数后向后取地址
  3. 初始化用到的寄存器
    mov r4,#0
    ldr r5, =ary        

    b testfor
loop:   
        ldr r0,=fmt1
        mov r1,r5
        add r5,#4
        bl scanf

        add r4,#1
testfor: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 testfor2
loop2: 


        ldr r2,[r5],#4
        cmp r2,#0
        addgt r7,#1
        addgt r9,r2
        addlt r8,#1
        addlt r10,r2
        
        add r4,#1
testfor2: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 testfor
loop:   
        ldr r0,=fmt1
        mov r1,r5
        add r5,#4
        bl scanf

        add r4,#1
testfor:cmp r4,#5
        blt loop
    
    mov r4,#0
    mov r7,#0
    mov r8,#0
    mov r9,#0
    mov r10,#0
    ldr r5, =ary
    
    b testfor2
loop2: 


        ldr r2,[r5],#4
        cmp r2,#0
        addgt r7,#1
        addgt r9,r2
        addlt r8,#1
        addlt r10,r2
        
        add r4,#1
testfor2: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

运行结果

在这里插入图片描述

总结

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

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

在这里插入图片描述

评论 93
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IM汤姆凯特

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值