某些指令说明
-“读引脚”和“读锁存器”指令的区别
关于并行I/O口的“读引脚”和“读锁存器”指令的区别
例如,当P1口的P1.0引脚外接一个发光二极管LED的阳极,LED的阴极接地。
若想查看一下单片机刚才向P1.x脚输出的信息是“0”还是“1”,如果直接读引脚,结果显然错误。
-“读引脚”和“读锁存器”指令的区别
正确做法是读D锁存器的Q端状态,那里储存的才是前一时刻送给P1.0的真实值。就是说,凡遇“读取P1口前一状态以便修改后再送出”的情形,都应当“读锁存器”的Q端信息,而不是读取引脚的信息。
当P1口外接输入设备时,要想P1口引脚上反映真实的输入信号,必须要 设法先让该引脚内部的场效应管截止才行,否则当场效应管导通时,P1口引 脚上将永远为低电平,无法正确反映外设的输入信号。让场效应管截止,就是用指令给P1口的相应位送一个“1”电平,这就是为什么读引脚之前,一 定要先送出“1”的原因。
-“读引脚”和“读锁存器”指令的区别
指令“MOV C,P1.0”读的是P1.0脚,同样,指令“MOV A,P1”也是读引脚指令,读引脚指令之前一定要有向P1.0写“1”的指令。而指令“CPL P1.0”则是“读锁存器”,也即“读-修改-写”指令,它会先读P1.0的锁存器的Q端状态,接着取反,然后再送到P1.0引脚上。而指令“ANL P1,A” 也是“读锁存器”命令。类似的“读-修改-写”指令举例如下:
INC P1
XRL P3,A
ORL P2,A
ANL P1,A
CPL P3.0
- 操作数的字节地址和位地址的区分问题
关于操作数的字节地址和位地址的区分问题
如何区别指令中出现的字节变量和位变量?
例如指令“MOV C,40H”和指令“MOV A,40H”两条指令中源操作数“40H”都是以直接地址形式给出的,“40H” 是字节地址还是位地址?对于助记符相同指令,观察操作数就可看出。显然前条指令中的“40H”肯定是位地址,因为目的操作数C是位变量。后条指令的“40H” 是字节地址,因为目的操作数A是字节变量。
- 累加器A与Acc的书写问题
关于累加器A与Acc的书写问题
累加器可写成A,或Acc,区别是什么?
Acc汇编后的机器码必有一个字节的操作数是累加器的字节地址E0H,A 汇编后则隐含在指令操作码中。例如: “INC A” 的机器码,查指令表是04H。如写成“INC Acc”后,则成了“INC direct”的格式,再查指令表,对应的机器码为“05H E0H”。
- 累加器A与Acc的书写问题
关于累加器A与Acc的书写问题
在对累加器A的直接寻址和累加器A的某一位寻址要用Acc,不能写成A。例如:
指令“POP Acc”不能写成“POP A”;
指令“SETB Acc.0”,不能写成“SETB A.0”。
- 书写两位16进制数据前要加“0"
书写两位16进制数据前要加“0”
经常遇到必须在某些数据或地址的前面多填一个“前导”0,否则汇编就通不过?这是汇编语言的严格性和规范性的体现。由于部分十六进制数是用字母来表示的,而程序内的标号也常用字母表示,为将标号和数据区分开,几乎所有的汇编语言都规定:凡是以字母开头(对十六进制数而言,就是A~F开头)的数字量,应当在前面添加一个数字“0”。至于地址量,它也是数据量的一种,前面也应该添加“0”。
例如:
MOV A,#0F0H ;“F0”以字母开头的数据量
MOV A,0F0H ;“F0”以字母开头的地址量
如不加“前导”0,就会把字母开头的数据量当作标号来处理,从而出错以及不能通过汇编。指令系统汇总
指令条数多,不宜死记硬背,应在程序的编写中,多加练习,在实践中不断掌握和巩固常用的指令。
下表为按功能排列的全部的指令助记符及功能简要说明,以及指令长度、执行时间和指令代码(机器代码)。读者应该熟练地查阅下表,正确理解指令的功能及特性,正确地使用指令。