千家信息网

ARM怎么用汇编判断数组中正负数个数

发表于:2024-09-24 作者:千家信息网编辑
千家信息网最后更新 2024年09月24日,这篇文章主要介绍"ARM怎么用汇编判断数组中正负数个数"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"ARM怎么用汇编判断数组中正负数个数"文章能帮助大家解决问
千家信息网最后更新 2024年09月24日ARM怎么用汇编判断数组中正负数个数

这篇文章主要介绍"ARM怎么用汇编判断数组中正负数个数"的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇"ARM怎么用汇编判断数组中正负数个数"文章能帮助大家解决问题。

    【ARM汇编】如何判断数组中正负数个数?

    写在前面:

    在很多算法中都必须要用到if语句进行判断,前面我们提到了数组,也练习了用汇编的循环框架遍历数组,但当我们运用数组时,不可能仅仅用于遍历数组并求出数组的和。当我们对数组进行其他的一些操作时,就需要用到判断语句,那汇编中的判断语句是什么呢?

    所有判断后缀

    在x86中我们只能在跳转指令`"B"`后加上判断符,而在ARM中我们可以在任意指令后加上判断标识

    所有的判断后缀,我把常用的给做了标红:

    来看看今天的问题

    如何用汇编实现判断数组中正负数的个数?

    在汇编语言中程序的基本框架是不变的,我们之前写过循环的框架,这里我们可以直接把正向遍历的程序给贴过来,然后我们思考怎么运用判断后缀把数组中正数和负数分开,进行判断个数和分别求和。

    1.编前准备

    1.1用C的伪代码表示

    先用C语言来实现这个功能,便于明确要实现功能的思路

    C语言代码:

    #includeint main(){    int ary[10] = {0,-1,2,3,4,5,-6,7,8,9};    int sum1=0,sum2=0, i;    int z=0,f=0;    for ( i = 0; i < 10; i++)    {             if(ary[i]>0){                     z=z+1;                     sum1 =sum1 +ary[i];                   }                else if(ary[i]<0){                        f=f+1;                        sum2 =sum2 +ary[i];                   }    }    printf("正数的个数为:%d\n负数的个数为:%d\n",z,f);    printf("正数的和为:%d\n负数的和为:%d\n",sum1,sum2);    return 0; }

    运行结果:

    1.2参照正向遍历的框架

    学习任何东西最快速的办法是,调取大脑中已有的知识,让新知识跟旧知识进行对比和延伸思考。

    把正向遍历的程序贴过来,发现实现整体功能的框架基本不变,只需要把循环中的这一部分操作改一下即可。把步骤拆开,详细细分为下面几步,我们一起来看一下。

    2.编写ARM汇编

    2.1先给定一串数组、输出格式

    这里要尝试输出正数的个数、负数的个数以及正数之和、负数之和;数组用ary自定义;通过地址长度计算出要循环的次数

    .data    fmt1:.asciz " The number of positive:%d\n The number of negative:%d\n"    fmt2:.asciz " The positive and:%d\n The negative and:%d\n"    ary:.word 0,-1,2,3,4,-5,6,7,8,-9    .equ counter,( . - ary)/4

    2.2在循环中加入判断、计数

    这一步就是核心步骤,用汇编写if判断语句。之前给出过所有的指令,其中CMP用来判断。与CMP紧密联系在一块的就是加判断后缀的指令,这个指令可以是跳转(B)可以是(ADD)也可以是(MOV)。

    要实现的功能:把数组中的第一个值取出来,然后与零进行判断,当大于零时,给正数的计数器加一,并且给正数的累加和加上当前数值。判断为负数时则相反。

    ARM汇编实现方法:

        ldr r2,[r5],#4        cmp r2,#0        addgt r7,#1        addgt r9,r2        addlt r8,#1        addlt r10,r2

    如果在x86中只能是CMP比较完用BLT跳转到子程序,执行完再跳转回来,ARM对于判断就方便很多,可以直接加在想要比较后想要执行的语句上。并且只需要一次比较。后面可以跟很多个,比较后想要执行的代码。

    2.3在主函数中初始化使用的寄存器

    一般定义寄存器都是在完成核心代码之后,查看核心代码中用到了哪些寄存器,然后给对应的寄存器赋初始值

    这里的寄存器分别表示:

    r7用来存放正数的个数

    r8用来存放负数的个数

    r9用来存放正数之和

    r10用来存放负数之和

    这里用到的R4和R5和之前一样没有变化依旧是:循环变量和数组首地址

     mov r4,#0    mov r7,#0    mov r8,#0    mov r9,#0    mov r10,#0    ldr r5, =ary

    2.4输出累计之和

    1. 想要打印输出肯定是用到printf,那就得先调用输出的格式串,格式串在最开始就已经定义好。

    2. printf是从R1开始输出的所以要把我们需要的值正负数个数、正负数和,传递给R1、R2。

    3. 下面部分由于已经打印出来,所以就可以把R1、R2覆盖,并且当用B跳转一次,R0~R3的值都会变化,最好都要重写。

    ldr r0,=fmt1        mov r1,r7        mov r2,r8        bl printf        ldr r0,=fmt2        mov r1,r9        mov r2,r10        bl printf

    2.5源代码

    .data    fmt1:.asciz " The number of positive:%d\n The number of negative:%d\n"    fmt2:.asciz " The positive and:%d\n The negative and:%d\n"    ary:.word 0,-1,2,3,4,-5,6,7,8,-9    .equ counter,( . - ary)/4.text.globl main main:    stmfd sp!,{lr}    mov r4,#0    mov r7,#0    mov r8,#0    mov r9,#0    mov r10,#0    ldr r5, =ary        b testforloop:           ldr r2,[r5],#4        cmp r2,#0        addgt r7,#1        addgt r9,r2        addlt r8,#1        addlt r10,r2                    add r4,#1testfor:cmp r4,#counter        blt loop        ldr r0,=fmt1        mov r1,r7        mov r2,r8        bl printf        ldr r0,=fmt2        mov r1,r9        mov r2,r10    mov r0, #0    ldmfd sp!,{lr}    mov pc, lr.end

    这里我们值需要判断正负计数即可,因为零既不属于正数也不属于负数

    2.6运行结果

    可以看到结果是正确的!

    关于"ARM怎么用汇编判断数组中正负数个数"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注行业资讯频道,小编每天都会为大家更新不同的知识点。

    数组 负数 个数 正数 循环 输出 用汇 中正 之和 代码 寄存器 指令 框架 语句 功能 知识 后缀 核心 格式 程序 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 2021年网络安全会议召开时间 泰拉瑞亚1.3多人服务器存档 数据库维护教程 竹溪智能软件开发服务保障 手游大话西游新服务器 乡宁租房软件开发 本科学软件开发哪个专业好考 多服务器碎片管理 天津微信扫码点餐软件开发 如何攻击网站服务器的方法 网络安全可以到电厂工作吗 普陀区一站式数据库服务商价钱 网络安全活动证书 工控网络安全注意事项 医院就诊软件开发计划书 新手机怎么倒微信数据库 数据库火车票务系统er图 中国史上重大网络安全事件 国家法律法规数据库如何应用 文科生可以选软件开发吗 服务器功耗70w 战舰世界服务器即将维护 软件开发经济可行性分析范文 数据库最小关系怎么看 泰兴个性化网络技术诚信服务 乡宁租房软件开发 大行动连接服务器失败 汉威科技互联网应急管理 对大学生来说什么是网络安全 僵尸工程师怎么找服务器
    0