51单片机将100个单字节有符号数连续存放在以2100H为首地址的存储区同时统计期中的正数负数和零的个数
以下是51单片机的代码实现:
ORG 0H
MOV DPTR, #2100H ;将存储区的首地址放入DPTR
MOV R0, #0 ;计数器清零
MOV R1, #0 ;正数计数器清零
MOV R2, #0 ;负数计数器清零
MOV R3, #0 ;零计数器清零
LOOP:
MOV A, @DPTR ;将DPTR指向的数据读入累加器A
CJNE A, #0, NOT_ZERO ;如果A不为零,跳转到NOT_ZERO
INC R3 ;否则零计数器加1
SJMP NEXT ;跳转到NEXT
NOT_ZERO:
MOV A, #0 ;将累加器A清零
MOV C, A ;将进位标志清零,用于判断A是否为负数
SUBB A, @DPTR ;将DPTR指向的数据与A相减
JNC POSITIVE ;如果没有进位标志,A为正数,跳转到POSITIVE
INC R2 ;否则负数计数器加1
SJMP NEXT ;跳转到NEXT
POSITIVE:
INC R1 ;正数计数器加1
NEXT:
INC DPTR ;DPTR指向下一个数据
INC R0 ;计数器加1
CJNE R0, #100, LOOP ;如果计数器不为100,跳转到LOOP
END
代码解释:
- 将存储区的首地址2100H存放在DPTR中。
- 初始化计数器和计数器清零。
- 进入循环,读取DPTR指向的数据并将其存放在累加器A中。
- 如果A为零,零计数器加1,跳转到NEXT。
- 如果A不为零,将A清零,并将DPTR指向的数据与A相减。
- 如果没有进位标志,说明A为正数,正数计数器加1,跳转到NEXT。
- 如果有进位标志,说明A为负数,负数计数器加1,跳转到NEXT。
- 指针DPTR指向下一个数据,计数器加1。
- 如果计数器不为100,回到LOOP,否则程序结束。
注意:这里假设存储的单字节有符号数是以补码形式存储的。
原文地址: https://www.cveoy.top/t/topic/bGxK 著作权归作者所有。请勿转载和采集!