单片机程序分析题

单片机程序分析题,第1张

设R0=20H,R1=25H,(20H)=70H,(21H)=80H,(22H)=A0H,(22H)=A0H,(25H)=A0H(26H)=6FH,(27H)=76H,下列程序执行后,

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

没看到啊,已经有人答完了。哎,早知道就不写这么多字了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11153817.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存