1 / 37

第三章 微控制器寻址方式 与指令系统

第三章 微控制器寻址方式 与指令系统. §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

diella
Download Presentation

第三章 微控制器寻址方式 与指令系统

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. 第三章 微控制器寻址方式与指令系统 §3.1 寻址方式 §3.2 SPCE061A指令分类

  2. 符号约定

  3. 指令的格式 1、与操作数有关 • 无操作数指令 • 一操作数指令 • 两操作数指令 2、指令的长度-与指令的使用频度有关,由此确定。

  4. §3.1 寻址方式

  5. 为什么要设置不同的寻址方式? 例、将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条加法指令

  6. 寻址方式 一、立即数寻址 二、寄存器寻址 三、直接寻址 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

  7. §3.2指令分类 • 数据传送类 • 算术运算类 • 逻辑操作类 • 控制转移类及设置类 • 1、装载数据 • Rd=源操作 • 2、存储数据 [RAM地址]=Rs • 3、堆栈操作 1、加法运算 2、减法运算 Rd=Rx±源操作数 [,Carry] 3、乘法运算 4、求补 Rd= -源操作数 5、比较 CMP Rx,源操作数 • 逻辑与 • 逻辑或 • 逻辑异或 • 测试 • 移位 • 循环 • 软中断 • 程序转移 • 子调用 • 功能设置

  8. 一、 数据传送类指令 • 数据装载类 • Rd=源操作 //影响N、Z标志。 • 存储数据类 • [RAM地址]=Rs //不影响任何标志。 • 堆栈操作类

  9. 1、压栈指令: • PUSH Rx,Ry to [SP] • 堆栈是在内存中开辟的部分空间。 • 将Rx~Ry中的数据压入以SP的内容为起始地址的存储器中。高序号寄存器内容先压入。x~y为连续ID号。 • 单个寄存器压入堆栈 PUSH Rx to [SP] 或 PUSH Rx,Rx to [SP] • 先压栈,后修改SP,其内容自动减量。 • 不影响标志位。

  10. 例1、执行指令 PUSH R3,R7 to [SP] 高地址 SP 低地址 SP

  11. 2、出栈指令 POP Rx,Ry from [SP] • 将以SP的内容为起始地址的一组存储器中的内容送到Rx~RyID号有序寄存器中。先传送低序号寄存器。 • 弹出到单个寄存器 POP Rx,Rx from [SP] • SP内容先自动增量,再出栈。 • 影响标志位N、Z。

  12. 例2、执行指令 POP R3,PC from [SP] 高地址 SP PC SR R5 R4 R3 SP 当执行完出栈后,内存是什么状态? 低地址

  13. 堆栈应用要注意的问题 由于单片机内存空间狭小,内存空间的使用要特别小心,要精打细算,以避免出现下述问题。 • 空间冲突-堆栈空间与其它用户空间相交引起的冲突。这是用户空间估计不足引起的。 • 堆栈溢出-堆栈使用超出其分配范围,这是堆栈空间分配太少或子程序嵌套太深引起的。

  14. 二、 算术运算类指令 • 加法运算 • 减法运算 • 乘法运算 • 求补指令 • 比较指令 Rd=Rx±源操作数[,Carry] • MR=Rd*Rs,MR=[Rd]*[Rs] • Rd= - 源操作数 • CMP Rx,源操作数

  15. 内积指令: • 符号数内积 • 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必须注明。其它同符号数内积。

  16. 例 、MR=[Rd]*[Rs] ,4 当FIR_MOV ON : Rd Rd Rs Rs (R4R3)=X1*C1+X2*C2+X3*C3+X4*C4

  17. [例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

  18. 求补指令与比较指令 例:R1=-0x28 R2=-0xFFFF R4=-R1 • 求补指令 是一种将正数变负数,负数变正数的补码运算。 • 比较指令 作减法,仅影响N、Z、S、C标志。目标单元不变。 例:R1=-0x28 R2=-0xFFFF CMP R1,R2 条件转移指令

  19. 三、 逻辑操作类指令 • 由于SPCE无位控指令,在开关量控制中,可用这些指令来进行位操作: • 将控制字中的某些位置0,其余位不变。 • 将控制字中的某些位置1,其余位不变。 • 将控制字中的某些位取反,其余位不变。 • 以实现对这些位的控制与测试。 • 逻辑与 • 逻辑或 • 逻辑异或 • 测试指令 • 移位指令 • 循环指令 “与”操作,仅影响N、Z标志。结合条件转移指令使用。 在开关量控制中,可用于测试目标字的某些位是否为0或1。

  20. 例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

  21. 例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:……

  22. 移位指令 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

  23. 循环指令 • 左循环 ROL • 右循环 ROR

  24. 四、控制转移设置类指令 • 软中断 • 程序转移 • 子程序调用 • 功能设置 ——中断向量 = 00FFF5H ——条件转移和无条件转移 指令周期:(满足条件)转移为5,否则为3。

  25. 程序延时多长时间?修改延时,修改程序的什么地方?本子程序最多延时时间是多少?程序延时多长时间?修改延时,修改程序的什么地方?本子程序最多延时时间是多少? 应用举例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个指令周期

  26. 应用举例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

  27. 作业 一、已知:(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]

  28. 小结 • 处理器的寻址方式 • 处理器的指令分类 • 如何看指令表 • 指令功能 • 指令对标志位的影响 • 指令周期

  29. §3.3 伪指令 使程序: 层次清晰, 阅读方便, 指导编译。

  30. 伪指令分类

  31. 段切换伪指令 常数及一些不变的量。 建立的是一个共享空间!

  32. 数据定义伪指令

  33. 宏汇编与条件汇编 • 宏汇编:汇编具有宏处理功能的高级汇编技术 • 条件汇编:源程序在汇编过程中,当特定条件为真时,才对源程序的一组语句进行汇编

  34. 宏指令的定义与调用 宏定义: 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

  35. 段切换伪指令与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单元。

  36. 作业 三、试将R1中,D5、D9、D11、D14,清0,取反,其余位不变。 四、试写出判断R2中的D12=1时转移到LAB1去执行,否则顺序执行的程序。

  37. 小结 • 伪指令是用来指导编译器编译用户程序的。本身不产生目标代码。 • 在伪指令的指导下,汇编语言程序会变得简单易读。 • 伪指令中的符号地址,免除了程序员管理存储器物理地址的痛苦。指令前的标号是该指令的符号地址,VAR定义的标号是数据的符号地址。

More Related