在循环语句中加入键入,循环一次判断一次当前数是正数还是负数,然后计数处理。 #include<stdio.h>
int main()
{
int z = 0,f=0, n = 0, i ;
printf("输入数据:");
for (i=0;i<5;i++)
{
scanf("%d", &n);
if (n == 0) break;
else if (n > 0) z++;
else f++;
}
printf("正数有%d个,负数有%d个", z, f);
}
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,
addgt r7,
addgt r9,r2
addlt r8,
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,
addgt r7,
addgt r9,r2
addlt r8,
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,
mov r7,
mov r8,
mov r9,
mov r10,
ldr r5, =a
b testfor
loop:
ldr r0,=fmt
ldr r1,=a
bl scanf
ldr r2,[r5]
cmp r2,
addgt r7,
addgt r9,r2
addlt r8,
addlt r10,r2
add r4,
testfor:cmp r4,
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,
ldmfd sp!,{lr}
mov pc, lr
.end
7.运行验证
这里需要注意的是,当循环五次后,还得键入一个任意字符用于结束循环。我们后面讲到先将键入数据存到数组中就会避免这种事情发生。
总结
本期就结束了,如果对你有帮助,点赞+收藏支持一下博主再走吧
还没有关注汤姆的朋友,点个关注每天学一点汇编
下期预告:【ARM汇编】如何将键入的数据存到数组中?
|
评论(0)