【ARM汇编-TST详解】用汇编判断奇偶数

在这里插入图片描述

CSDN话题挑战赛第1期
活动详情地址话题PK赛
参赛话题:汇编知识分享
话题描述:我们的计算机知识就像一座金字塔,底层是数学,上面是数字电路,然后是汇编,再往上是操作系统、网络、数据库、高级编程语言、框架等等…我们不可能精通这个金子塔的每一层, 但是想走的更远就必须要了解这个金字塔的底层。因此,学习汇编并不是为了用汇编在应用层设计程序,而是为了深刻理解机器运行程序的机理。就像对于人来说不能没有常识一样,尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。汇编就是计算机语言里面的常识和基础。

大家好,我是汤姆凯特。

每篇前言

☀️作者简介:大家好我是汤姆凯特,大家可以叫我汤姆
🐋个人主页:IM汤姆凯特的CSDN博客
🎁系列专栏:【ARM嵌入式基础】
🌱每日一句:
鸡蛋,从外打破是食物,从内打破是生命,人生也是如此,从外打破是压力,从内打破是成长


对数组中奇数偶数求和?

汇编数组这一系列问题中,之前讲到了如何遍历数组,如何对数组求和,如何自定义数组,如何找出数组中的最大值最小值。今天用《对数组中奇数偶数求和》的例子给大家讲解用什么方式判断数组中的奇偶数。

伪代码

oddSum:奇数和

evenSum:偶数和

代码部分:

oddSum=0
evenSum=0
for(i=0;i<n;i++)
    if(a[i]%2!=0)
        oddSum=oddSum+a[i]
    if(a[i]%2==0)
        evenSum=evenSum+a[i]

汇编语言如何实现

由于ARM汇编中没有除号,更没有取余符号,所以只能另辟蹊径,找本质的东西。其实,在二进制中,最后一位数是0还是1就决定了这个数是偶数还是奇数。那么这样,我们就可以用按位与运算,让数值和1进行按位与运算(与运算,两数相等则为1,两数不等则为0),运算完之后为,满足NE为奇数,满足EQ为偶数。

TST指令详细介绍(非常重要!):

0.TST指令是按位与运算,只改变标志位Z,不回写结果。

1.先进行按位与运算

2.两数对应位上都为1,则与的结果为1

3.则标志位Z=0

4.则满足NE指令

5.两数对应位上不都为1,则与的结果为0

6.则标志位Z=1

7.则满足EQ指令

8.总结就是:两数都为1,满足NE;两数不都为1,满足EQ

CMP也可以这样理解

0.第一个数减去第二个数,只改变标志位Z,不回写结果。

1.相减结果为0,表示两个数相等

2.结果为0,状态标志位Z为1

3.则满足EQ指令

4.不相等,相减的结果也不为0,状态标志位Z为0

5.则满足NE指令


理解起来比较难,但代码实现起来很简单。

第一步、构建数组遍历框架

构建一个数组以及对数组进行遍历

  • r7依次存放数组中的每一个值
.data
    fmt:.asciz " evenSum=%d\n oddSum=%d\n"
    ary:.word 10,1,20,3,4,5,6,7,8,9,2,1
    .equ counter,( . - ary)/4
.text
.globl main
 main:
    stmfd sp!,{lr}
    mov r4,#0
    ldr r5, =ary
    b testfor
loop:      
        ldr r7,[r5],#4
		......
        add r4,#1
testfor:cmp r4,#counter
        blt loop

第二步、判断奇偶并输出

在循环中对每一个数做判断,如果是TST与1之后,Z标志位为1,结果是0,为偶数并满足EQ;如果与1之后,Z标志位为0,结果是1,为奇数并满足NE。

  • r6用来存放偶数和
  • r8用来存放奇数和
    mov r6,#0
    mov r8,#0
loop:      
        ldr r7,[r5],#4
        tst r7,#1
        addeq r6,r7
        addne r8,r7
        add r4,#1
testfor:cmp r4,#counter
        blt loop

        ldr r0,=fmt
        mov r1,r6
        mov r2,r8
        bl printf
    mov r0, #0
    ldmfd sp!,{lr}
    mov pc, lr
.end

汇编源码

.data
    fmt:.asciz " evenSum=%d\n oddSum=%d\n"
    ary:.word 10,1,20,3,4,5,6,7,8,9,2,1
    .equ counter,( . - ary)/4
.text
.globl main
 main:
    stmfd sp!,{lr}
    mov r4,#0
    ldr r5, =ary
    mov r6,#0
    mov r8,#0
    b testfor
loop:      
        ldr r7,[r5],#4
        tst r7,#1
        addeq r6,r7
        addne r8,r7
        add r4,#1
testfor:cmp r4,#counter
        blt loop

        ldr r0,=fmt
        mov r1,r6
        mov r2,r8
        bl printf
    mov r0, #0
    ldmfd sp!,{lr}
    mov pc, lr
.end

运行调试

在这里插入图片描述


总结

  • 汇编中判断奇偶数没有取余指令,只能用按位与运算进行判断。

  • TST指令的底层实现原理是改变标志位Z,然后用NE和EQ对数据进行操作。

  • 深入了解状态标志位的实际作用,帮助我们更好的实现想要的功能。


本期内容就结束了,如果内容有误,麻烦大家评论区指出!
如有疑问可以在评论区留言!
下期预告: 【ARM汇编】字符串大小写转换

CSDN话题挑战赛第1期
活动详情地址话题PK赛

  • 69
    点赞
  • 85
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 90
    评论
引用中提到,ARM汇编语言中有一个用于测试指令状态的指令叫做TSTTST指令实际上是ANDS指令的别名,它将第一个操作与第二个操作进行逻辑与运算,并更新程序状态寄存器中的标志位。与ANDS指令不同的是,TST指令不会修改目标寄存器的值,只会更新标志位。所以,TST指令用于判断某个寄存器的值与另一个操作的逻辑与结果是否为零。如果结果为零,则表示两者没有相同的位。如果结果不为零,则表示两者至少有一个相同的位。通过判断标志位的值,可以进行条件跳转或其他操作。 引用和给出了一些例子来说明如何使用CMP指令结合其他指令来实现条件判断和跳转。例如,CMP指令可以用来比较两个寄存器的值,并根据比较结果来执行不同的操作。BEQ指令可以用来判断CMP指令的比较结果是否相等,如果相等则跳转到指定的地址执行。类似地,BNE指令可以用来判断CMP指令的比较结果是否不相等,如果不相等则跳转到指定的地址执行。 综上所述,根据引用中的描述,TST指令ARM汇编语言中用于测试指令状态的指令。它将第一个操作与第二个操作进行逻辑与运算,并更新程序状态寄存器中的标志位。通过判断标志位的值,可以进行条件跳转或其他操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [ARM的一个空项目 学习的新手不会建可以参考](https://download.csdn.net/download/qq_65311741/88278105)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ARM汇编:BNE和TST和BEQ](https://blog.csdn.net/weibo1230123/article/details/84037170)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 90
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IM汤姆凯特

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

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

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

打赏作者

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

抵扣说明:

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

余额充值