温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2022-04-21 10:28:55 来源:亿速云 阅读:258 作者:iii 栏目:开发技术

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

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

    写在前面:

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

    所有判断后缀

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

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

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

    来看看今天的问题

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

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

    1.编前准备

    1.1用C的伪代码表示

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

    C语言代码:

    #include<stdio.h>
    int 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; 
    }

    运行结果:

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

    1.2参照正向遍历的框架

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

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

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

    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 testfor
    loop:   
            ldr r2,[r5],#4
            cmp r2,#0
            addgt r7,#1
            addgt r9,r2
            addlt r8,#1
            addlt r10,r2
                
            add r4,#1
    testfor: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怎么用汇编判断数组中正负数个数

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

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    arm
    AI