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

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

大家好,我是汤姆凯特。

文章目录
  • 【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

运行结果

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

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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/742478.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-28
下一篇 2022-04-28

发表评论

登录后才能评论

评论列表(0条)

保存