楼主要知道单片机的程序存储区和数据存储区是分开的,独立编址。
楼主所述的这个程序全部是在程序存储区里存放的!
QA1D5: DB 7AH, 0CH, 79H,0C6H, 7BH, 01H, 7DH, 01H
QA1DD: DB 8BH, 61H, 8AH, 62H, 89H, 63H,0E4H,0FFH
QA1E5: DB 0EFH,0C3H, 9DH, 50H, 25H,0ABH, 30H,0AAH
QA1ED: DB 31H,0A9H, 32H, 12H, 63H, 57H,0ABH, 61H
QA1F5: DB 0AAH, 62H,0A9H, 63H, 8FH, 82H, 75H, 83H
QA1FD: DB 00H, 12H, 64H, 04H, 74H, 01H, 25H, 32H
QA205: DB 0F5H, 32H,0E4H, 35H, 31H,0F5H, 31H, 0FH
前头是行号,后头是数据。这些数据是在程序存储区里的 !!前辈说错了。
分布是这样:QA1D5:标志首地址,所以第一个数据地址是QA1D5,但QA1D5只是一个标记,至于具体是多少,要根据编译器把所有汇编语言翻译成机器语言后安排。DB是双字节的意思,所以一个数据占两个字节,实际存放是这样:
00H 31H 00H 0A9H ..... (高位补零)
程序区的数据是不能更改的,烧进去就永远在里面了。
单片机里立即寻址、查表指令都是对程序区的数进行的。
ANL 0D9H,#0BFH
#0FBH是立即数,所以放在程序存储器里,是烧进去的,变不了,9DH是数据存储器的地址,假如9DH里放的数是F3H,就是BFH和F3H与运算,结果是B3H,放到9DH里。
MOV 5AH,SP
Sp是一个数据寄存器,存放的是堆栈的地址。此句意思是把堆栈的地址送给数据存储区地址为5AH的寄存器里。
你真难为答题者,明明有源程序,你贴上来就可以了,这种图片上来,别人怎么给你回答?\x0d\x0aORG 0000H程序入口\x0d\x0aLIMP MAIN 转移到MAIN \x0d\x0aORG 0100H程序开始运行地址\x0d\x0aMAIN:MOV R2,#00H送数据00到R2\x0d\x0aMOV R3,00H将R0中的数送R3(估计这里是错误的是不是应该#00)\x0d\x0aMOV R4,#20H将20H送R4\x0d\x0aMOV R5,#00H将00H送R5\x0d\x0aMOV R6,#1FH将1FH送R6\x0d\x0aMOV R7#0FFH将FFH送R7\x0d\x0aSE22:MOV DPH,R2将R2的值送DPH\x0d\x0aMOV DPL,R3将R3的值送DPL,以上两条组成数据指针\x0d\x0aMOVX A,@DPTR送外部存储器中取数\x0d\x0aMOV DPH,R4将R4的值送DPH\x0d\x0aMOV DPL,R5将R5的值送DPL\x0d\x0aMOVX @DPTR,A将A中的值送外部存储器\x0d\x0aCJNE R3,#0FFH,L042如果R3不等于FFH转L042\x0d\x0aINC R2工作寄存器R2加1\x0d\x0aL042:INC R5工作寄存器R5加1\x0d\x0aCJNE R7,#00H,L044如果R7不等于0转L044\x0d\x0aCJNE R6,#00H,L045如果R6不等于0转L045\x0d\x0aSJNP $原地循环\x0d\x0aNOP空 *** 作\x0d\x0aL044:DEC R7工作寄存器R7减1\x0d\x0aSJMP SE22转SE22\x0d\x0aL045:DEC R7工作寄存器R7减1\x0d\x0aDEC R6工作寄存器R6减1\x0d\x0aSJMP SE22转SE22\x0d\x0aEND程序结束对于普林斯顿架构,这种情况不会发生:数据区和程序区是分隔的总线,即使地址相同实际上也位于不同的空间。对于哈佛型架构,这种情况很常见,并且假定程序员对此心知肚明,例如在RAM中跑程序以求获得更高的运行速度。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)