嵌入式(七):什么是伪指令?&keil编写时遇到的地址冲突

伪指令(伪操作)不像机器指令那样是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作.它可以完成如处理器选择,定义程序模式,定义数据,分配存储区,指示程序结束等功能.伪指令在编译的时候并不生成代码.伪指令在编译之后就不存在了。
实际上就是假指令,不会产生机器代码,不会占用rom空间,只用于汇编过程中为汇编程序提供汇编信息,在汇编之后就消失了,是给汇编器来解释的。最常见的有:
1、起始伪指令,标号ORG nn,定义程序或数据块的起始地址,指示此语句后面的程序或数据块以nn为起始地址连续存放在程序存储器中。
2、字节定义伪指令,标号DB(字节常数或字符或表达式),指示在程序存储器中以标号为起始地址的单元里存放的数为字节数据(8位二进制数)。
3、字定义伪指令,标号DW(字常数或表达式),指示在程序存储器中以标号为起始地址的单元里存放的数为字数据(16位的二进制数)。
4、保留字节伪指令,标号DS (数值表达式),指示在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。
5、等值伪指令,标号EQU(数值表达式),表示 EQU 两边的量等值,用于为标号或标识符赋值。
6、位定义伪指令,标号BIT(位地址),同 EQU 指令,不过定义的是位操作地址。
7、汇编结束伪指令,标号END,指示源程序段结束。 END 指令放在程序的最后。若将 END 放在程序中间,那么对于 END 后面的指令,汇编程序将不对其进行汇编。一个汇编语言源程序仅允许使用一个END 伪指令。

如果想通过keil查看伪指令,可以通过伪指令的特性,即汇编之后不再存在,由此可以通过仿真模拟,再反汇编得到的机器指令,将反汇编得到的汇编代码与一开始的汇编代码进行比较即可,下面是反汇编得到的汇编代码:

但是,这个时候是有问题的。如果进行仿真的话(运行),会出现死循环,这是由于我们导入了.A51文件,但是.A51文件与我们的代码出现了地址冲突(5个warning,其中有两个是无关的<截断>),所以,我们尽管可以得出结论(因为反汇编是没有问题的,即我们的程序是正确的,只是程序无法执行),但是我们的仿真是错误的,所以需要将.A51文件移除,再进行编译仿真!!!这个很重要,注意注意!!!
去除之后得到的汇编指令主要是一条语句的参数发生了变化。这个时候我们就可以正常运行我们的程序,而不是像之前,会转到我们引入的.A51文件中而陷入死循环。!!!

你可能感兴趣的:(嵌入式计算机系统)