370 likes | 508 Views
第三章 微控制器寻址方式 与指令系统. §3.1 寻址方式 §3.2 SPCE061A 指令分类. 符号约定. 指令的格式. 1 、与操作数有关 无操作数指令 一操作数指令 两操作数指令 2 、指令的长度 - 与指令的使用频度有关,由此确定。. §3.1 寻址方式. 为什么要设置不同的 寻址方式 ?. 例、将 1-100 存储单元的内容求和,结果放在 102 单元中。 R1=0 R2=0 Sum_Loop : R2+=[++ R1] // ( R1 ) +1 =>R1 , // ( R2 ) + (( R1 )) =>R2
E N D
第三章 微控制器寻址方式与指令系统 §3.1 寻址方式 §3.2 SPCE061A指令分类
指令的格式 1、与操作数有关 • 无操作数指令 • 一操作数指令 • 两操作数指令 2、指令的长度-与指令的使用频度有关,由此确定。
为什么要设置不同的寻址方式? 例、将1-100存储单元的内容求和,结果放在102单元中。 R1=0 R2=0 Sum_Loop: R2+=[++ R1] // (R1)+1 =>R1 , // (R2)+((R1))=>R2 CMP R1,100 JNA Sum_Loop // 不大于转移 [102]=R2 例、将1-100存储单元的内容求和,结果放在102单元中。 R1=0 R1+=[0] R1+=[1] R1+=[2] R1+=[3] R1+=[4] …… [102]=R1 100条加法指令
寻址方式 一、立即数寻址 二、寄存器寻址 三、直接寻址 1、6位地址直接寻址 2、16位地址直接寻址 3、22位地址直接寻址 四、寄存器间接寻址 1、寄存器间接寻址 2、寄存器前置增量间接寻址 3、寄存器后置增量间接寻址 4、寄存器后置减量间接寻址 5、寄存器自动增减量间接寻址 五、变址寻址 六、PC相对寻址 R1=R2 [R1]=R2 目的地址在何处?如果已知:(R1)=1000H,执行上述指令后,(R1)=? 1、R1+=[0X30] //零页6位直接地址 2、R2=R1+[0X2400] // 16位直接地址 3、22位直接地址主要用于子程序调用。 1、R1+=[R5] 2、R2=D:[++R3] //(R3)+1=>R3, //((R3))=>R2。 3、R2=D:[R3 ++] //((R3))=>R2, //(R3)+1=>R3。 4、R2=D:[R3 - -] //((R3))=>R2, //(R3)-1=>R3。 5、主要用于堆栈操作 R1=0X25 R2=R1+0X2400 R1=0X25 //6位立即数 R1=R1+0X2400 // 16位立即数 R1=[R5+63] R1=[BP+64] 用于短距离转移! R1=[BP+IM6] //((BP)+IM6)=>R1 用于转移指令,(PC)±IM6;IM6<=63
§3.2指令分类 • 数据传送类 • 算术运算类 • 逻辑操作类 • 控制转移类及设置类 • 1、装载数据 • Rd=源操作 • 2、存储数据 [RAM地址]=Rs • 3、堆栈操作 1、加法运算 2、减法运算 Rd=Rx±源操作数 [,Carry] 3、乘法运算 4、求补 Rd= -源操作数 5、比较 CMP Rx,源操作数 • 逻辑与 • 逻辑或 • 逻辑异或 • 测试 • 移位 • 循环 • 软中断 • 程序转移 • 子调用 • 功能设置
一、 数据传送类指令 • 数据装载类 • Rd=源操作 //影响N、Z标志。 • 存储数据类 • [RAM地址]=Rs //不影响任何标志。 • 堆栈操作类
1、压栈指令: • PUSH Rx,Ry to [SP] • 堆栈是在内存中开辟的部分空间。 • 将Rx~Ry中的数据压入以SP的内容为起始地址的存储器中。高序号寄存器内容先压入。x~y为连续ID号。 • 单个寄存器压入堆栈 PUSH Rx to [SP] 或 PUSH Rx,Rx to [SP] • 先压栈,后修改SP,其内容自动减量。 • 不影响标志位。
例1、执行指令 PUSH R3,R7 to [SP] 高地址 SP 低地址 SP
2、出栈指令 POP Rx,Ry from [SP] • 将以SP的内容为起始地址的一组存储器中的内容送到Rx~RyID号有序寄存器中。先传送低序号寄存器。 • 弹出到单个寄存器 POP Rx,Rx from [SP] • SP内容先自动增量,再出栈。 • 影响标志位N、Z。
例2、执行指令 POP R3,PC from [SP] 高地址 SP PC SR R5 R4 R3 SP 当执行完出栈后,内存是什么状态? 低地址
堆栈应用要注意的问题 由于单片机内存空间狭小,内存空间的使用要特别小心,要精打细算,以避免出现下述问题。 • 空间冲突-堆栈空间与其它用户空间相交引起的冲突。这是用户空间估计不足引起的。 • 堆栈溢出-堆栈使用超出其分配范围,这是堆栈空间分配太少或子程序嵌套太深引起的。
二、 算术运算类指令 • 加法运算 • 减法运算 • 乘法运算 • 求补指令 • 比较指令 Rd=Rx±源操作数[,Carry] • MR=Rd*Rs,MR=[Rd]*[Rs] • Rd= - 源操作数 • CMP Rx,源操作数
内积指令: • 符号数内积 • MR=[Rd]*[Rs] {,ss} {,n} • MR=((Rd))χ((Rs))+ ((Rd+1))χ((Rs+1))+ • ((Rd+2))χ((Rs+2))+…… • 选项{,ss} ,系统默认值,示为符号数运算。选项{,n},n=1~16,默认为1。 • MR为R4R3 • 2.无符号数内积 • MR=[Rd]*[Rs] ,us {,n} • us必须注明。其它同符号数内积。
例 、MR=[Rd]*[Rs] ,4 当FIR_MOV ON : Rd Rd Rs Rs (R4R3)=X1*C1+X2*C2+X3*C3+X4*C4
[例3.25] .IRAM .VAR NO_1=0x0001, NO_2=0x0002, NO_3=0x0003, NO_4=0x0004 .VAR NO_5=0x0005, NO_6=0x0006, NO_7, NO_8 .CODE .PUBLIC _main _main: FIR_MOV ON //允许移位 R1= NO_2 //指向起始位 R2= NO_5 MR=[R1]*[R2], us, 2 //第1次,2*5+3*6。 [NO_7]=R3 [NO_8]=R4 NOP JMP _main RETF 第2次:2*5+2*6
求补指令与比较指令 例:R1=-0x28 R2=-0xFFFF R4=-R1 • 求补指令 是一种将正数变负数,负数变正数的补码运算。 • 比较指令 作减法,仅影响N、Z、S、C标志。目标单元不变。 例:R1=-0x28 R2=-0xFFFF CMP R1,R2 条件转移指令
三、 逻辑操作类指令 • 由于SPCE无位控指令,在开关量控制中,可用这些指令来进行位操作: • 将控制字中的某些位置0,其余位不变。 • 将控制字中的某些位置1,其余位不变。 • 将控制字中的某些位取反,其余位不变。 • 以实现对这些位的控制与测试。 • 逻辑与 • 逻辑或 • 逻辑异或 • 测试指令 • 移位指令 • 循环指令 “与”操作,仅影响N、Z标志。结合条件转移指令使用。 在开关量控制中,可用于测试目标字的某些位是否为0或1。
例4、分别用指令表示,将R1中的D2、D6、D13置1,清0,取反,其余位不变的操作。例4、分别用指令表示,将R1中的D2、D6、D13置1,清0,取反,其余位不变的操作。 • 置1 将置1的位“或”1,不变的位“或”0。 所以有,R1|=0x2044 //0010000001000100 • 清0 将清0的位“与”0,不变的位“与”1。 所以有,R1&=0xDFBB //1101 1111 1011 1011 • 取反 将取反的位“异或”1,不变的位 “异或”0。 所以有,R1^=0x2044 //0010000001000100
例5、假设R2中的内容是交换机的用户摘挂机状态字,每一位对应一个用户摘挂机状态,0挂机,1摘机。用TEST指令测试用户摘挂机状态。摘机时作H处理,否则继续测试下一个用户状态。例5、假设R2中的内容是交换机的用户摘挂机状态字,每一位对应一个用户摘挂机状态,0挂机,1摘机。用TEST指令测试用户摘挂机状态。摘机时作H处理,否则继续测试下一个用户状态。 TEST R2,0x0001 JZ d1 CALL H0 d1: TEST R2,0x0002 JZ d2 CALL H1 d2 : TEST R2,0x0004 JZ d3 CALL H2 d3:……
移位指令 Rd=RS LSL nn //nn=1~4 Rd=RS LSR nn //nn=1~4 Rd=RS ASR nn //nn=1~4 • 逻辑/算术左移 LSL • 逻辑右移 LSR • 算术右移 ASR 多功能移位指令: ——先移位后运算 R1+=R2 LSL 2, Carry //(R1)+(R2)左移2位+C R1 R1= -R2 LSR 2, // (R2)右移2位后求补 R1 例: R1=0xFF00 R2=0x0001 R2+=R1 ASR 1 //执行这条指令后,(R2)=FF81H
循环指令 • 左循环 ROL • 右循环 ROR
四、控制转移设置类指令 • 软中断 • 程序转移 • 子程序调用 • 功能设置 ——中断向量 = 00FFF5H ——条件转移和无条件转移 指令周期:(满足条件)转移为5,否则为3。
程序延时多长时间?修改延时,修改程序的什么地方?本子程序最多延时时间是多少?程序延时多长时间?修改延时,修改程序的什么地方?本子程序最多延时时间是多少? 应用举例1 例1、软件延时子程序设计。 Delay_x: R1=0 Delay_Loop: R1=R1+1 CMP R1,0x03E8 JNAE Delay_Loop Exit_Loop: RETF // 3个指令周期 // 8个指令周期,3E8:1000 //顺序为3,转移为5个指令周期 // 12个指令周期
应用举例2 计算1~100单元中所有整数和,如何修改? 例10、编写计算1~100所有整数和,且结果存于R1中的函数。 F_Calculate_Sum: R1=0 R2=1 L_SumLoop: R1+=R2 R2+=1 CMP R2,0x65 JB L_SumLoop //小于转移 RET
作业 一、已知:(R1)=100,(R2)=2000,分别指出下列指出指令执行的最终结果。 指令:1、R1=100。 2、R1=[R1]。 3、[R1]=R1。 4、R1=[R2]。5、[R1]=[R2]。6、[R1]=R2。 二、已知: (BP)=2400H,(2416H)=1000 ,指出指令执行的最终结果。 指令:R1= [BP+0x16]
小结 • 处理器的寻址方式 • 处理器的指令分类 • 如何看指令表 • 指令功能 • 指令对标志位的影响 • 指令周期
§3.3 伪指令 使程序: 层次清晰, 阅读方便, 指导编译。
段切换伪指令 常数及一些不变的量。 建立的是一个共享空间!
宏汇编与条件汇编 • 宏汇编:汇编具有宏处理功能的高级汇编技术 • 条件汇编:源程序在汇编过程中,当特定条件为真时,才对源程序的一组语句进行汇编
宏指令的定义与调用 宏定义: macro_name : MACRO [形参表] CPU 指令 //宏定义体 [.MACEXIT] …… .ENDM 宏指令: macro_name [实参表] 宏定义举例1: M_instruction : MACRO arg,val arg Lab#: .DW val .ENDM 宏调用: M_instruction nop, 87 宏展开: nop .DW 87 在源程序中用一个宏名取代一系列源语句行,从而简化程序,增加程序的可读性。在编译的时候,编译器会将其展开在目标代码中。 宏定义举例2:雇员信息 employee : MACRO arg1, arg2, arg3 name : .DW arg1 department : .DW arg2 date_hired : .DW arg3 .ENDM 宏调用: employee‘john doe’, sales, 022098 宏展开: name: .DW ‘john doe’ department: .DW sales date_hired: .DW 022098
段切换伪指令与SPCE061A存储器空间 RAM:存放无初值的变量。 IRAM:存放具有初值的变量。并分配ROM及RAM空间。 ORAM:存放无初值的变量。一个项目的不同文件中与RAM段同名同属性的各段会被重叠在一起。这适合于不同文件需要使用相同的变量空间。 CODE:所有程序和数据都可以存放在该段。 DATA:程序中的数据(常数)都可以存放在该段。 TEXT:与CODE基本相同,只是它只能连接到零页ROM中,且所有同名同属性的各段会被合并在一起。SPCE061A只有零页ROM。该段主要用来存放中断程序代码。 SRAM:与RAM同,但只能连接到0~63单元。 ISRAM:与IRAM同,但只能连接到0~63单元。 OSRAM:与ORAM同,但只能连接到0~63单元。
作业 三、试将R1中,D5、D9、D11、D14,清0,取反,其余位不变。 四、试写出判断R2中的D12=1时转移到LAB1去执行,否则顺序执行的程序。
小结 • 伪指令是用来指导编译器编译用户程序的。本身不产生目标代码。 • 在伪指令的指导下,汇编语言程序会变得简单易读。 • 伪指令中的符号地址,免除了程序员管理存储器物理地址的痛苦。指令前的标号是该指令的符号地址,VAR定义的标号是数据的符号地址。