要求汇编:用“与”运算判断某8位二进制数是奇数还是偶数个1。 (单片机作业……)
假设R3中存放待判数值,R4存放临时结果。如果寄存器不足,就用内存代替。 MOV R0,1,MOV R1,0 //1个数计数器,MOV R2,0 //循环次数,共循环8次。
LABEL_LOOP,CMP R2,8 //循环次数比较,BE LOOP_END //如果已经循环8次则跳转到LOOP_END。
AND R4,R3,R0 //R3,R0按位与运算,结果存入R4,CMP R4,0 //依次取出相应的位与0比较,BE LOOP_NEXT //若相等则跳转到LOOP_NEXT,否则计数器加1再跳转INC R1,B LOOP_NEXT//到这里结束了,R1如果等于1那么有奇数个“1”,否则偶数个“1”。
由于共有8位数,最多0b1000个"1",只有R1最低位为1时才是奇数个“1”,单片机中似乎没有三个操作数的指令。
扩展资料:
在以上的程序代码中,考虑到单片机系统的RAM限制,不能像一些实时OS那样将任务栈建立在RAM中。
将任务栈建立在代码的空间,因而不能在程序运行的时候,动态地加入任务,因此要求在程序编译时,任务栈已经确定。
同时,定义一组计数值旗标time_val,记录程序运行时的时间量,并在一个定时器中断中对其进行刷新。时间片刷新中断过程语句Time_Counter:=Time_Unit;中的Time_Unit,可以改变系统时间片的刷新粒度,一般这个值由系统的最小时间度量值确定。
同时,由任务的执行流程可知,此种系统构造并没有改变其前/后台系统的性质,只是对后台逻辑操作序列进行了有效管理。同时,如果将任务执行流程进行一些更改,并保证时间片小的任务前置。
二进制数只是正数的话,那百么只看末尾的数字就行了,如果是0,那么就是偶数,如果是1,那么就是奇数。
因为,除过末尾数字,其他数字都是当前位乘以2^n后的结果,那么不管是偶数还是奇数,只要乘了2,都会是偶数,偶数加度偶数还是偶数。因此,只要判问断末尾数字的奇偶就行了,当然,如果二进制数是负数的话,那么就得转化成原码再看。
扩展资料
常用的有二进制、八问进制、十进制、十六进制。任何数据在计算机内存中都是以二进制的形式存放的。二进制数是以2为计算单元,满内2进1位的数;八进制数是以8为计算单元,满8进1位的数。
对于任何一个数字,都可以用不同的容进制来表示,比如,十进制数12,用二进制表示为1100,用八进制表示为14,用十六进制表示为0xC。
以下是伪代码,翻译成单片机汇编即可。
//假设R3中存放待判数值,R4存放临时结果。如果寄存器不足,就用内存代替。
MOV R0,1
MOV R1,0 //1个数计数器
MOV R2,0 //循环次数,共循环8次
LABEL_LOOP:
CMP R2,8 //循环次数比较
BE LOOP_END //如果已经循环8次则跳转到LOOP_END
AND R4,R3,R0 //R3,R0按位与运算,结果存入R4
CMP R4,0 //依次取出相应的位与0比较
BE LOOP_NEXT //若相等则跳转到LOOP_NEXT,否则计数器加1再跳转
INC R1
B LOOP_NEXT
LOOP_NEXT:
INC R2
SHL R0 //R0左移一位,以便取出下一位
B LABEL_LOOP
LOOP_END:
AND R1,R1,1 //R1中存放了"1"的个数
CMP R1,1
...
//到这里结束了,R1如果等于1那么有奇数个“1”,否则偶数个“1”
由于共有8位数,最多0b1000个"1",只有R1最低位为1时才是奇数个“1”
大概单片机中似乎没有三个操作数的指令, 像AND R4,R3,R0,自己再单独实现以下吧
广告 您可能关注的内容 |