CLR C CY=0
MOV R2,#3 R2=03H R2=02HR2=01H
LOOP:
MOV A,@R0 A=70H A=80H A=A0H
ADDC A,@R1CY=1,A=10H CY=0,A=F0HCY=1,A=16H
MOV @R0,A (20H)=10H (21H)=F0H (22H)=16H
INCR0 R0=21H R0=22HR0=23H
INCR1 R1=26H R1=27HR1=28H
DJNZ R2,LOOP
JNCNEXT
MOV @R0,#01H 23H=01H
SJMP $
NEXT: DECR0
SJMP $
结果:(20H)=10H ,(21H)=F0H ,(22H)=16H ,(23H)=01H ,(A)=16H ,(CY)=1 .
分析过程参照注释
DPTR是地址,是16位前两步DPTR=1234H,A=22H,是对的,第三步里把A的内容移动到DPTR所指的地址的存储空间,DPTR仍然是1234H没有变但(1234H)存储单元的内容改变了, 成了22H
你要访问外部存储器,除了有控制信号和数据信号外,还有要地址信号,DPTR就是负责产生地址信号的,对于51单片机P0和P2口就是地址线,但P0口是复用的,先输出低8位地址,后输出数据,期间要用锁存器锁住地址信号。
uint8_t *ptr uint8_t len 这是传入参数。 len可能是长度,ptr可能指向的是一个数组。^= 按位异或后赋值。
crc ^= *ptr++//首先将数组第一位异或后复制给Crc。之后ptr再向前一步,简单理解就是指向数组的下一位。
for(i = 0i <8i++){if(crc &0x01)crc = (crc >>1) ^ 0x8C elsecrc >>= 1 }
//将取到数组第一位值,与0x01上。如果非零,crc就需要右移一位,再与0x8C异或。否则右移1位。每位数组值要做8次。
while(len--) //表示要判断数组内len个值。或则说是取得数组内len长度的元素个数。
return crc//len个数组值都作完以后,将Crc返回。
我想你需要了解一下 0x01的意义,0x8C的意义。
0x01 = 0000 0001
0x8c = 1000 1100
没看到啊,已经有人答完了。哎,早知道就不写这么多字了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)