单片机程序烧入rom之后怎样执行
单片机程序编译后的.hex文件,烧入rom之后,程序怎样执行起来的?1、hex文件是包含了代码、数据吧?并由编译器(还是链接器)统一分配rom地址?2、程序中的全局变量、...
单片机程序编译后的.hex文件,烧入rom之后,程序怎样执行起来的?
1、hex文件是包含了代码、数据吧?并由编译器(还是链接器)统一分配rom地址?
2、程序中的全局变量、常量、局部变量等数据,是否要载入到ram里去并分配地址?是怎么载入ram的,由谁?何时载入?
3、堆栈如何分配?
4、代码始终是从rom的0x0000地址开始依次执行吗?我看到STC的单片机说中断向量表是存放在rom的0x0003开始,每8个bytes分配给一个中断源做ISR空间,那么程序顺序执行到0x0003这一段地址怎么办? 展开
1、hex文件是包含了代码、数据吧?并由编译器(还是链接器)统一分配rom地址?
2、程序中的全局变量、常量、局部变量等数据,是否要载入到ram里去并分配地址?是怎么载入ram的,由谁?何时载入?
3、堆栈如何分配?
4、代码始终是从rom的0x0000地址开始依次执行吗?我看到STC的单片机说中断向量表是存放在rom的0x0003开始,每8个bytes分配给一个中断源做ISR空间,那么程序顺序执行到0x0003这一段地址怎么办? 展开
2个回答
展开全部
1,HEX文件包含了代码数据。是由链接器统一分配ROM地址。
2. 程序中的变量,也是在编译连接时,分配了RAM地址。不存在载入的问题,程序指令对变量的操作,就是对RAM地址的操作,地址值存在在指令中。
3. 堆栈在程序初始化时设置堆栈指针。Keil C 会自动设置好。
4. 一般的51单片机代码是从 0000开始执行,这是它的复位地址。也有别的型号的单片机并不一定从0开始执行。程序从0开始执行,但它执行的第一句往往是一个跳转指令(这个Keil C也是自动写好的),跳到另一块地址去执行,而不会顺序执行到 中断的地址的。
你如果是用汇编写程序,这些都是要你自己去分配的,用C写程序,由编译器来完成这些底层操作。
2. 程序中的变量,也是在编译连接时,分配了RAM地址。不存在载入的问题,程序指令对变量的操作,就是对RAM地址的操作,地址值存在在指令中。
3. 堆栈在程序初始化时设置堆栈指针。Keil C 会自动设置好。
4. 一般的51单片机代码是从 0000开始执行,这是它的复位地址。也有别的型号的单片机并不一定从0开始执行。程序从0开始执行,但它执行的第一句往往是一个跳转指令(这个Keil C也是自动写好的),跳到另一块地址去执行,而不会顺序执行到 中断的地址的。
你如果是用汇编写程序,这些都是要你自己去分配的,用C写程序,由编译器来完成这些底层操作。
追问
程序中的变量,也是在编译连接时,分配了RAM地址。——链接器还会分配变量的ram地址?
追答
当然,每个变量名代表的就是一个地址。自然要为它分配地址。
简单如 a=5;
实际指令是 把5送入分配给 a 的地址里。MOV 34H,#5 这是汇编指令(比方分给 a 的地址是 34H)。
不知道a 的地址,这条指令就没法运行,应该说没法编译出来。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询