优快云话题挑战赛第1期
活动详情地址:话题PK赛
参赛话题:汇编知识分享
话题描述:我们的计算机知识就像一座金字塔,底层是数学,上面是数字电路,然后是汇编,再往上是操作系统、网络、数据库、高级编程语言、框架等等…我们不可能精通这个金子塔的每一层, 但是想走的更远就必须要了解这个金字塔的底层。因此,学习汇编并不是为了用汇编在应用层设计程序,而是为了深刻理解机器运行程序的机理。就像对于人来说不能没有常识一样,尽管常识不能直接挣钱吃饭,但它影响谈吐,影响你的判断力和决断力,决定着你接受新事物和新知识的程度。汇编就是计算机语言里面的常识和基础。
大家好,我是汤姆凯特。
☀️作者简介:大家好我是汤姆凯特,大家可以叫我汤姆
🐋个人主页:IM汤姆凯特的优快云博客
🎁系列专栏:【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对数据进行操作。
-
深入了解状态标志位的实际作用,帮助我们更好的实现想要的功能。
优快云话题挑战赛第1期
活动详情地址:话题PK赛