单片机 汇编 程序区与数据区理解

单片机 汇编 程序区与数据区理解,第1张

一楼所言不对。

楼主要知道单片机的程序存储区和数据存储区是分开的,独立编址。

楼主所述的这个程序全部是在程序存储区里存放的!

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中跑程序以求获得更高的运行速度。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存