嵌入式(十九):指令集

1、指令集层面:
a、MCS51的6种寻址方法:
①、立即寻址(#),如mov a, #30H
②、寄存器寻址(R0-R7),如mov a,R3
③、寄存器间接寻址(只有@R0、@R1、@DPTR),如mov a,@R0
④、直接寻址,如mov a,30H
⑤、基址寄存器+变址寄存器间接寻址,如movc a,@a+DPTR
⑥、相对寻址,如cjne a,#30H,20H,将20H加入到当前地址。这条语句的意思是如果a=30H,就继续顺序进行,否则,跳转到当前地址(PC)+相对地址(PC+20H)的地方继续执行。
b、keil中MCS51汇编语言的“数字”以0-9开头(16进制不行),“变量”和“名称”用字母开头,所以即便是16进制数,也必须加一个0。
c、MCS51指令集:
①、111条指令
②、指令的一般格式:
操作码 [操作数1] [,操作数2] [,操作数3],
即目的/源 源 源
③、指令编码与指令长度:1字节、2字节、3字节
④、指令执行时间:1个机器周期、2个机器周期、4个机器周期
⑤、5大类:数据传送类(数据传送)、算术逻辑运算类(算术运算、逻辑运算)、跳转类(程序转移、位操作)
d、所有的MCS51指令中,只能出现一次“工作寄存器”
e、a(累加器)是时间、空间综合效率最高的,其次是“工作寄存器”
f、数据传送类:第二栏为机器码
①、以A为一方:

mov a,Ri E8-EF:E8=>把R0给a 1字节1周期
mov Ri,a F8-FF 1字节1周期
mov a,@Rj E6/E7:E6=>R0为地址给a 1字节1周期
mov @Rj,a F6/F7 1字节1周期
mov a,direct E5 direct:地址的值给a 2字节1周期
mov direct,a F5 direct 2字节1周期

Ri表示R0-R7,Rj表示R0或R1。间接寻址只能是R0或R1。
direct表示一个8位地址
②、不以A为一方

mov direct,Ri 88-8F direct 2字节2周期
mov Ri,direct A8-AF direct 2字节2周期
mov direct,@Rj 86-87 direct 2字节2周期
mov @Rj,direct A6-A7 direct 2字节2周期
mov direct1,direct2 85 direct2 direct1 3字节2周期

③、以立即数为一方,传送数字

mov A,#data 74 data 2字节1周期
mov Ri,#data 78-7F data 2字节1周期
mov @Rj,#data 76、77 data 2字节1周期
mov direct,#data 75 direct data 3字节2周期
mov DPTR,#data16 90 dataH dataL:给DPTR 3字节2周期

data为8bit数,data16为16bit数
④、访问片外RAM/IO

movx A,@Rj E2、E3 1字节2周期
movx @Rj,A F2、F3 1字节2周期
movx A,@DPTR E0 1字节2周期
movx @DPTR,A F0 1字节2周期

⑤、访问程序存储器ROM

movc A,@A+DPTR 93 1字节2周期
movc A,@A+PC 83 1字节2周期

PC是唯一没有地址的寄存器
⑥、数据交换

xch A,Ri C8-CF 1字节1周期
xch A,@Rj C6、C7 1字节1周期
xch A,direct C5 direct 2字节1周期
xchd A,@Rj D6、D7 1字节1周期
swap A D4 1字节1周期

xchd只对低半字节交换
swap是a的高、低半字节交换
⑦、堆栈操作

push direct C0 direct 2字节2周期
pop direct D0 direct 2字节2周期

push进栈:(sp)+1->(sp);(direct)->((sp))
先把sp的值+1,再把direct的值给以sp为地址所指向的空间
pop出栈:((sp))->(direct);(sp)-1->(sp)
先把以sp为地址所指向的空间给direct的值,再把sp的值-1
g、常用伪指令:
实际上就是假指令,不会产生机器代码,不会占用rom空间,只用于汇编过程中为汇编程序提供汇编信息,在汇编之后就消失了,是给编译器的。
①、起始伪指令,标号ORG nn,定义程序或数据块的起始地址,指示此语句后面的程序或数据块以nn为起始地址连续存放在程序存储器中。
②、字节定义伪指令,标号DB(字节常数或字符或表达式),指示在程序存储器中以标号为起始地址的单元里存放的数为字节数据(8位二进制数)。
③、字定义伪指令,标号DW(字常数或表达式),指示在程序存储器中以标号为起始地址的单元里存放的数为字数据(16位的二进制数)。
④、保留字节伪指令,标号DS (数值表达式),指示在程序存储器中保留以标号为起始地址的若干字节单元,其单元个数由数值表达式指定。
⑤、等值伪指令,(名字)标号EQU(数值表达式),表示 EQU 两边的量等值,用于为标号或标识符赋值。
⑥、位定义伪指令,(名字)标号BIT(位地址),同 EQU 指令,不过定义的是位操作地址。
⑦、片内地址赋予位指令,(名字)标号DATA(表达式),把片内的数据地址赋予所给定的符号名,如TS DATA 70H,把TS定义到位置70H
⑧、片外地址赋予指令,(名字)标号XDATA(表达式),把片外的数据地址赋予所给定的符号名
⑨、间接内部地址赋予指令,(名字)标号IDATA(表达式),把间接的内部数据地址赋予所给定的符号名
⑨、汇编结束伪指令,标号END,指示源程序段结束。 END 指令放在程序的最后。若将 END 放在程序中间,那么对于 END 后面的指令,汇编程序将不对其进行汇编。一个汇编语言源程序仅允许使用一个END 伪指令。
h、其他常用知识点:
①、DJNZ跳转指令与循环
②、条件跳转指令CJNE,不相等则跳转
③、位移运算:RR、RL、RRC、RLC
④、其他逻辑运算:ORL、ANL、XOR与清零、置位、取反
⑤、CALL、RET与子程序、堆栈、SP寄存器
⑥、MACRO、ENDM与宏,宏与子程序。宏是一种批量处理的称谓,计算机科学里的宏是一种抽象,它根据一系列预定义的规则替换一定的文本模式。解释器或编译器在遇到宏时会自动进行这一模式替换。对于编译语言,宏展开在编译时发生,进行宏展开的工具常被称为宏展开器。宏就是一些命令组织在一起,作为一个单独命令完成一个特定任务。
⑦、包含文件include

猜你喜欢

转载自blog.csdn.net/qq_40851744/article/details/106426535