- 牛云
-
一楼所言不对。
楼主要知道单片机的程序存储区和数据存储区是分开的,独立编址。
楼主所述的这个程序全部是在程序存储区里存放的!
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的寄存器里。
- 康康map
-
一、程序区,是指ANL等指令,编译后的代码的存储空间;
数据区,是指DB伪指令后面的数据,编译后的存储空间。
二、标号是代表地址的。
其地址号码,是由编译软件给它安排的,不是自己写成A1D5,地址就是A1D5了。
三、ROM中的数据区内容,写入芯片后便不可改动。
四、ANL 0D9H, #0BFH,中的D9H是单片机内部的特殊功能寄存器,但是对基本51单片机来说,D9H这个号码是空号。
MOV 5AH,SP,是把SP的内容,送到5AH单元。
- wio
-
很简单的问题给你问的那么乱,只要明白以下几点就看的明白了
1,标号“:” QA1FD:是地址标号,QA1FD只是地址名称,你想写ABCDB也可以的,只是名称。QA210:也是一样。也是地址标号
2,数据表区“DB”,DB是数据表的开始指令。表示后面的数都是它的数据区内容。
综合以上,可以看出,QA1D5: 到QA205: 地址中放的是数据区,QA210: 地址后是程序区。
- ardim
-
其实要理解并不难,你只要搞清楚程序存储区和数据存储区的区别就会一目了然
程序存储区存的是你编写的程序。
数据存储区存的是你运行过程中的各种变量。
程序存储区里面的数据是在编译时产生的,在烧录的时候写入的。运行过程中是只读的,不可以写,掉电不会丢失。
数据存储区的数据是在运行过程中产生的,可以读也可以写,丢电会丢失。
你定义的标号里面的数据全部是在程序存储区的,你就是说你可以引用这些数据但不能改变这现数据。
- 大鱼炖火锅
-
那位说错了。
DB单字节
DW双字节(或字)
DD四字节
A1D5=7AH,
A1D6=0CH
A1D7=79H
A1D8=0C6H
A1D9=7BH
A1Da=01H
A1Db=7DH
A1Dc=01H
A1Dd=8BH
A1De=61H
。。。
(地址是十六进制)
这段代码如果在ROM中是不能修改的,给出的程序段可能不是真正的程序入口 ,编程员为了防止反汇编,有时会在数据与程序间放一些无用的字符,反编译程序是不会识别出来的,那么你反编译的程序看起来就不知所云了。
- gitcloud
-
无论才能、知识多么卓著,如果缺乏热情,则无异纸上画饼充饥,无补于事。