返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >ARM汇编判断之如何用汇编判断数组中正负数个数
  • 281
分享到

ARM汇编判断之如何用汇编判断数组中正负数个数

2024-04-02 19:04:59 281人浏览 八月长安
摘要

目录【ARM汇编】如何判断数组中正负数个数?写在前面:所有判断后缀如何用汇编实现判断数组中正负数的个数?1.编前准备1.1用C的伪代码表示1.2参照正向遍历的框架2.编写ARM汇编2

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

写在前面:

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

所有判断后缀

在x86中我们只能在跳转指令`“B”`后加上判断符,而在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; 
}

运行结果:

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 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运行结果

可以看到结果是正确的!

3.总结

  • 对给定数组进行操作时,要把操作放入循环中,并且通过寄存器向后寻址的方式循环。
  • 给出了所有的判断后缀,在ARM中可以把判断后缀放到任意的指令后,用于判断后的执行操作;一条CMP指令可以跟很多条判断执行操作。
  • 编写汇编时,先写出核心代码部分,再给主函数、全局变量、输出语句中添加支撑条件。

到此这篇关于ARM汇编判断之如何用汇编判断数组中正负数个数的文章就介绍到这了,更多相关汇编判断正负数内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: ARM汇编判断之如何用汇编判断数组中正负数个数

本文链接: https://lsjlt.com/news/146724.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • ARM汇编判断之如何用汇编判断数组中正负数个数
    目录【ARM汇编】如何判断数组中正负数个数?写在前面:所有判断后缀如何用汇编实现判断数组中正负数的个数?1.编前准备1.1用C的伪代码表示1.2参照正向遍历的框架2.编写ARM汇编2...
    99+
    2024-04-02
  • ARM怎么用汇编判断数组中正负数个数
    这篇文章主要介绍“ARM怎么用汇编判断数组中正负数个数”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ARM怎么用汇编判断数组中正负数个数”文章能帮助大家解决问题。【ARM汇编】如何判断数组中正负数个...
    99+
    2023-06-30
  • JavaScript如何判断正数还是负数
    本篇内容介绍了“JavaScript如何判断正数还是负数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • drupal常用判断函数汇总
    本文实例汇总了drupal常用判断函数。分享给大家供大家参考。具体如下: 判断是否为首页:复制代码代码如下:if( $is_front ){ } 判断用户是否登陆:复制代码代码如下:global $user;if ( $...
    99+
    2022-06-12
    drupal 常用 判断 函数 汇总
  • JS如何判断数组
    这篇文章主要为大家展示了“JS如何判断数组”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“JS如何判断数组”这篇文章吧。typeof运算符typeof会返回这个类...
    99+
    2024-04-02
  • JavaScript如何判断数组
    这篇文章主要介绍“JavaScript如何判断数组”,在日常操作中,相信很多人在JavaScript如何判断数组问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”JavaScript如何判断数组”的疑惑有所帮助!...
    99+
    2023-06-29
  • jquery如何判断正整数
    使用jquery判断是否为正整数的方法:1.新建html项目,引入jquery;2.创建input输入框,设置id属性;3.添加button按钮,绑定onclick点击事件;4.通过id获取input对象,使用val()方法获取输入值;5....
    99+
    2024-04-02
  • JavaScript判断是否为数组的各种方法汇总
    目录前言 Array.isArray constructor instanceof isPrototypeOf Object.prototype.toString typeof 总结...
    99+
    2024-04-02
  • php如何判断一个数是不是正整数
    这篇“php如何判断一个数是不是正整数”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“php如何判断一个数是不是正整数”文章吧...
    99+
    2023-07-05
  • php中如何判断数组为空
    在php中判断数组是否为空的方法使用empty()函数判断$arr = [];if (empty($arr)) {//为空} else {//不为空}如返回结果为true,则表示数组为空。使用count()函数判断$arr = [];if ...
    99+
    2024-04-02
  • PHP教程:如何判断数组中元素的个数
    PHP教程:如何判断数组中元素的个数 在PHP开发过程中,经常会遇到需要统计数组中元素个数的情况。比如我们需要知道一个数组中有多少个元素,以便进一步处理数据。在本教程中,我们将讨论如何...
    99+
    2024-03-14
    数组长度 计算数组项 统计数组长度
  • PHP教程:如何判断数组中元素的个数
    PHP教程:如何判断数组中元素的个数 在PHP开发过程中,经常会遇到需要统计数组中元素个数的情况。比如我们需要知道一个数组中有多少个元素,以便进一步处理数据。在本教程中,我们将讨论如何...
    99+
    2024-03-14
    数组长度 计算数组项 统计数组长度
  • Python编程判断一个正整数是否为素数的方法
    本文实例讲述了Python编程判断一个正整数是否为素数的方法。分享给大家供大家参考,具体如下: import string import math #判断是否素数的函数 def isPrime(n): ...
    99+
    2022-06-04
    素数 方法 正整数
  • php如何判断是不是正数
    这篇文章给大家分享的是有关php如何判断是不是正数的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php判断是不是正数的方法:1、通过正则表达式实现判断;2、结合floor函数实现判断;3、通过is_numeric...
    99+
    2023-06-25
  • javascript如何判断一个对象为数组
    这篇文章主要介绍javascript如何判断一个对象为数组,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!javascript 判断一个对象为数组的方法数组对象js的数组是无类型的:数...
    99+
    2024-04-02
  • jquery如何判断是否是一个数组
    这篇文章主要介绍了jquery如何判断是否是一个数组的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇jquery如何判断是否是一个数组文章都会有所收获,下面我们一起来看看吧。 ...
    99+
    2024-04-02
  • php如何判断一个数字是否在一个数组中
    本篇内容主要讲解“php如何判断一个数字是否在一个数组中”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php如何判断一个数字是否在一个数组中”吧!方法:1、用“in_array(值,数组)”,若...
    99+
    2023-06-30
  • c语言如何判断一个数是否在数组中
    在C语言中,可以使用循环结构和条件判断语句来判断一个数是否在数组中。具体步骤如下:1. 声明一个数组,并给数组赋值。2. 声明一个变...
    99+
    2023-10-10
    c语言
  • 用c语言编程实现素数判断(判断素数的c语言程序函数)
    以下是一个用C语言编写的判断素数的函数:```c#include #include bool isPrime(int n) {if ...
    99+
    2023-09-22
    c语言
  • es6如何判断是否为数组
    本篇内容主要讲解“es6如何判断是否为数组”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“es6如何判断是否为数组”吧! 在es6中,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作