【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
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 90
    评论
原作者:宛城布衣。 本文件已移除PDF签名,如内容有误,欢迎大家指正。 目录 前言 i 目录 I ARM7TDMI(-S)指令集及汇编1 ARM 处理器寻址方式2 寄存器寻址2 立即寻址2 寄存器偏移寻址2 寄存器间接寻址3 基址寻址3 多寄存器寻址4 堆栈寻址4 块拷贝寻址5 相对寻址5 指令集介绍7 ARM 指令集7 指令格式7 第 2 个操作7 #immed_8r 7 Rm8 Rm,shift8 条件码9 ARM 存储器访问指令 11 LDR 和 STR 11 LDM 和 STM14 SWP 17 ARM 据处理指令19 据传送指令20 MOV 20 MVN 20 算术逻辑运算指令20 ADD 20 SUB21 RSB 21 ADC 21 SBC 21 RSC 22 AND 22 ORR22 EOR22 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII BIC 23 第 I 页常用 ARM 指令集及汇编 Ver:1010 比较指令23 CMP 23 CMN23 TST24 TEQ24 乘法指令25 MUL25 MLA25 UMULL25 UMLAL26 SMULL 26 SMLAL 26 ARM 跳转指令27 B27 BL27 BX 27 ARM 协处理器指令28 CDP28 LDC29 STC 29 MCR30 MRC30 ARM 杂项指令31 SWI 31 MRS 32 MSR 33 ARM指令34 ADR 35 ADRL35 LDR36 NOP37 Thumb 指令集39 Thumb 指令集与 ARM 指令集的区别 39 Thumb 存储器访问指令 40 LDR 和 STR 41 PUSH 和 POP 43 LDMIA 和 STMIA 43 Thumb 据处理指令 45 据传送指令46 MOV 46 MVN 46 NEG47 算术逻辑运算指令47 ADD 47 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 第 II 页常用 ARM 指令集及汇编 Ver:1010 SUB48 ADC 49 SBC 49 MUL50 AND 50 ORR50 EOR51 BIC 51 ASR51 LSL52 LSR 52 ROR53 比较指令53 CMP 53 CMN54 TST54 Thumb 跳转指令 55 B 55 BL55 BX 55 Thumb 杂项指令 56 SWI 56 Thumb 伪指令 57 ADR 57 LDR57 NOP58 伪指令59 符号定义伪指令59 GBLA、GBLL、GBLS 59 LCLA、LCLL、LCLS60 SETA、SETL、SETS 61 RLIST61 CN 62 CP62 DN、SN62 FN63 据定义伪指令63 LTORG64 MAP64 FIELD 65 SPACE66 DCB 66 DCD 和 DCDU67 DCDO 67 IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII 第 III 页常用 ARM 指令集及汇编 Ver:1010 DCFD 和 DCFDU68 DCFS 和 DCFSU68 DCI69 DCQ 和 DCQU69 DCW 和 DCWU 70 报告伪指令70 ASSERT 70 INFO 71 OPT 71 TTL 和 SUBT 72 汇编控制伪指令73 IF、ELSE 和 ENDIF73 MACRO 和 MEND 74 WHIL 和 WEND 75 杂项伪指令76 ALIGN 77 AREA78 CODE16 和 CODE32 79 END 80 ENTRY80 EQU 81 EXPORT 和 GLOBAL 81 IMPORT 和 EXTERN 82 GET 和 INCLUDE 83 INCBIN83 KEEP83 NOFP 84 REQUIRE 84 PEQUIRE8 和 PRESERVE8 84 RN 84 ROUT85 ARM指令86 ADR 86 ADRL86 LDR86
引用中提到,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、付费专栏及课程。

余额充值