Go汇编语法和MatrixOne使用介绍
560
2022-05-29
每日一句:
“我们人生的意义是什么?人生的目的在哪里?对于这个人生最基本的问题,我认为必须从正面回答。我的答案是:提升心性,磨练灵魂。”——稻盛和夫
【ARM汇编练习】如何对键入数据做判断?
写在前面:
当我们从键盘上输入一串数据,如何用ARM汇编语言对它进行判断是正数还是负数,并输出正数的个数和负数的个数。通过这次实操你可以了解对键入数据判断的两种方式,更熟悉在汇编中调用scanf使用方式,加深对判断指令使用方法的学习。那就一起来看一下今天的问题吧!
如何对键入数据的正负数做判断?
今天带大家用第一种方式,把之前学过的scanf和判断语句结合起来练习一下
1先写出C语言的伪代码
#include
2.框架
上一篇我们实现了《对给定数组进行遍历,得出正负数的个数》
我们之前说过,学习新知识最快的办法是在已有的知识上迁移比对。因此《ARM嵌入式基础》这一专栏的内容是循序渐进的,每天学一点汇编加强对整体计算机结构的了解。
我们看一下,如果想要实现今天的功能,能用上一篇文章代码的哪一部分呢?
因为我们同《对给定数组进行遍历,得出正负数的个数》一样
也是要进行判断、计数、输出
,所以红框部分代码不需要变。
不同的是,我们这里没有数组,而是单独的一个数,需要做的就是
把这个数放到循环中,并且给出支撑这个数的指令和支撑scanf的指令
。
理清了思路我们来看一下具体怎么实现
3.修改全局变量
1.把数组改为单独的一个数即可
2.声明scanf的格式串
.data fmt:.asciz "%d\n" 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" a:.word 0
4.循环中调用scanf
调用scanf,必须给它获取到的值分配内存空间,在全局变量中已经声明a,这里我们需要把a的地址给r1,这样就可以将获取到的值传给a。
ldr r0,=fmt ldr r1,=a bl scanf
5.对获取到的值进行判断
先将获取到的值存到了a中,想要对它进行判断,就要先获取到地址然后获取到内容。
由于调用过一次B,因此易失寄存器的值会改变,所以这里需要重新获取一次地址。
b testfor loop: ldr r0,=fmt ldr r1,=a bl scanf ldr r1,=a ldr r2,[r1] cmp r2,#0 addgt r7,#1 addgt r9,r2 addlt r8,#1 addlt r10,r2
1.把分配内存的地址,先传给不易失寄存器。
2.scanf再用r1传到这个地址中。
3.所以就可以直接将不易失寄存器中的值取出来,用于判断。
ldr r5, =a b testfor loop: ldr r0,=fmt ldr r1,=a bl scanf ldr r2,[r5] cmp r2,#0 addgt r7,#1 addgt r9,r2 addlt r8,#1 addlt r10,r2
6.源代码
.data fmt:.asciz "%d\n" 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" a:.word 0 .text .globl main main: stmfd sp!,{lr} mov r4,#0 mov r7,#0 mov r8,#0 mov r9,#0 mov r10,#0 ldr r5, =a b testfor loop: ldr r0,=fmt ldr r1,=a bl scanf ldr r2,[r5] cmp r2,#0 addgt r7,#1 addgt r9,r2 addlt r8,#1 addlt r10,r2 add r4,#1 testfor:cmp r4,#5 blt loop ldr r0,=fmt1 mov r1,r7 mov r2,r8 bl printf ldr r0,=fmt2 mov r1,r9 mov r2,r10 bl printf mov r0, #0 ldmfd sp!,{lr} mov pc, lr .end
7.运行验证
这里需要注意的是,当循环五次后,还得键入一个任意字符用于结束循环。我们后面讲到先将键入数据存到数组中就会避免这种事情发生。
总结
对键入数据进行判断有两种方式,这里用到的是实时判断然后累计
练习了对C语言函数的调用和判断后缀使用
使我们产生一个疑问:输入结束需要键入一个随机字符才能结束循环,怎么产生的?怎么才能避免?
ARM 嵌入式 汇编语言
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。