37
第第第 第第第第第第第第 第第第第§3.1 §3.1 第第第第 第第第第 §3.2 SPCE061A §3.2 SPCE061A 第第第第 第第第第

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

  • Upload
    diella

  • View
    188

  • Download
    0

Embed Size (px)

DESCRIPTION

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

Citation preview

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

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

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

§3.1 §3.1 寻址方式寻址方式§3.2 SPCE061A§3.2 SPCE061A 指令分类指令分类§3.1 §3.1 寻址方式寻址方式§3.2 SPCE061A§3.2 SPCE061A 指令分类指令分类

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

符号约定符号约定Rd 目的寄存器或存储器 { } 任选项Rs 源寄存器或存储器 NZSC SR 的标志位IM6 、 IM16

6 位、 16 位立即数 D 非零页数据段寻址

A6 、 A16

6 位、 16 位存储器地址 ss 、 us有符号数与无符号数之间、无符号数与有符号数之间的运算关系

Rx~Ry 序列寄存器, x 、 y 为 1~7 nn 寄存器移位位数

MRR4 、 R3 组成的 32 位结果寄存器 n 内积运算项数

+ 、 - 、* 、 ~

加、减、乘、求补 FIR 有限冲击响应算法

& 、 | 、^

逻辑与、或、异或 // 注释符

++ 、 -- 指针增量、减量 # 算术或逻辑操作符[ ] 寄存器间接寻址 () 寄存器或存储器单元的数据

IDID 号号 符号符号 功能名称功能名称00 (( 000000 ))

SPSP 堆栈指针计数器堆栈指针计数器

11 (( 000011 ))

R1R1 通用寄存器通用寄存器

22 (( 010100 ))

R2R2 通用寄存器通用寄存器

33 (( 010111 ))

R3R3 通用寄存器通用寄存器

44 (( 101000 ))

R4R4 通用寄存器通用寄存器

55 (( 101011 ))

BPBP (( R5R5))

基址指针寄存器基址指针寄存器

66 (( 111100 ))

SRSR (( R6R6))

程序状态寄存器程序状态寄存器

77 (( 111111 ))

PCPC (( R7R7))

程序指针计数器程序指针计数器

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

指令的格式指令的格式11 、与操作数有关、与操作数有关

• 无操作数指令无操作数指令• 一操作数指令一操作数指令• 两操作数指令两操作数指令

22 、指令的长度、指令的长度 -- 与指令的使用频度有与指令的使用频度有关,由此确定。关,由此确定。

11 、与操作数有关、与操作数有关• 无操作数指令无操作数指令• 一操作数指令一操作数指令• 两操作数指令两操作数指令

22 、指令的长度、指令的长度 -- 与指令的使用频度有与指令的使用频度有关,由此确定。关,由此确定。

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

§3.1 §3.1 寻址方式寻址方式

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

为什么要设置不同的为什么要设置不同的寻址方式寻址方式 ??

例、将例、将 1-1001-100 存储单元的内容求和,结果放在存储单元的内容求和,结果放在 101022 单元中。单元中。

R1=0R1=0R1+=[0]R1+=[0]R1+=[1]R1+=[1]R1+=[2]R1+=[2]R1+=[3]R1+=[3]R1+=[4]R1+=[4]…………[102]=R1[102]=R1

100 条加法指令

例、将例、将 1-1001-100 存储单元的内容求和,结果放在存储单元的内容求和,结果放在 101022 单元中。单元中。R1=0R1=0R2=0R2=0Sum_LoopSum_Loop ::

R2+=[++ R1] R2+=[++ R1] // // (( R1R1 )) +1 =>R1 +1 =>R1 ,, // // (( R2R2 )) ++ (((( R1R1 )))) ==>R2>R2

CMP R1CMP R1 ,, 100100JNA Sum_Loop JNA Sum_Loop // // 不大于转移不大于转移

[102]=R2[102]=R2

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

寻址方式寻址方式一、立即数寻址一、立即数寻址二、寄存器寻址二、寄存器寻址三、直接寻址三、直接寻址 11 、、 66 位地址直接寻址位地址直接寻址 22 、、 1616 位地址直接寻址位地址直接寻址 33 、、 2222 位地址直接寻址位地址直接寻址四、寄存器间接寻址四、寄存器间接寻址 11 、寄存器间接寻址、寄存器间接寻址 22 、寄存器前置增量间接寻址、寄存器前置增量间接寻址 33 、寄存器后置增量间接寻址、寄存器后置增量间接寻址 44 、寄存器后置减量间接寻址、寄存器后置减量间接寻址 55 、寄存器自动增减量间接寻址、寄存器自动增减量间接寻址五、变址寻址五、变址寻址六、六、 PCPC 相对寻址相对寻址

R1=0X25 //6R1=0X25 //6 位立即数位立即数

R1=R1+0X2400 // 16R1=R1+0X2400 // 16 位立即数位立即数

R1=0X25 //6R1=0X25 //6 位立即数位立即数

R1=R1+0X2400 // 16R1=R1+0X2400 // 16 位立即数位立即数R1=0X25R1=0X25

R2=R1+0X2400R2=R1+0X2400

R1=0X25R1=0X25

R2=R1+0X2400R2=R1+0X2400

11 、、 R1+=[0X30] //R1+=[0X30] // 零页零页 66 位直接地位直接地址址

22 、、 R2=R1+[0X2400] // 16R2=R1+[0X2400] // 16 位直接地位直接地址址

33 、、 2222 位直接地址主要用于子程序位直接地址主要用于子程序调用。调用。

11 、、 R1+=[0X30] //R1+=[0X30] // 零页零页 66 位直接地位直接地址址

22 、、 R2=R1+[0X2400] // 16R2=R1+[0X2400] // 16 位直接地位直接地址址

33 、、 2222 位直接地址主要用于子程序位直接地址主要用于子程序调用。调用。

11 、、 R1+=[R5] R1+=[R5] 22 、、 R2=D:[++R3] //(R3)+1=>R3,R2=D:[++R3] //(R3)+1=>R3, //((R3))=>R2//((R3))=>R2 。。33 、、 R2=D:[R3 ++] //((R3))=>R2,R2=D:[R3 ++] //((R3))=>R2, //(R3)+1=>R3//(R3)+1=>R3 。。44 、、 R2=D:[R3 - -] //((R3))=>R2,R2=D:[R3 - -] //((R3))=>R2, //(R3)-1=>R3//(R3)-1=>R3 。。55 、主要用于堆栈操作、主要用于堆栈操作

11 、、 R1+=[R5] R1+=[R5] 22 、、 R2=D:[++R3] //(R3)+1=>R3,R2=D:[++R3] //(R3)+1=>R3, //((R3))=>R2//((R3))=>R2 。。33 、、 R2=D:[R3 ++] //((R3))=>R2,R2=D:[R3 ++] //((R3))=>R2, //(R3)+1=>R3//(R3)+1=>R3 。。44 、、 R2=D:[R3 - -] //((R3))=>R2,R2=D:[R3 - -] //((R3))=>R2, //(R3)-1=>R3//(R3)-1=>R3 。。55 、主要用于堆栈操作、主要用于堆栈操作

R1=[BP+IM6] //((BP)+IM6)=>R1R1=[BP+IM6] //((BP)+IM6)=>R1R1=[BP+IM6] //((BP)+IM6)=>R1R1=[BP+IM6] //((BP)+IM6)=>R1

用于转移指令,(用于转移指令,( PCPC )) ±IM6±IM6 ;; IM6<=63IM6<=63用于转移指令,(用于转移指令,( PCPC )) ±IM6±IM6 ;; IM6<=63IM6<=63

用于短距离转移!用于短距离转移!

R1=R2[R1]=R2

目的地址在何处?如果已知:( R1 ) =1000H ,执行上述指令后,( R1 ) = ?

R1=R2[R1]=R2

目的地址在何处?如果已知:( R1 ) =1000H ,执行上述指令后,( R1 ) = ?

R1=[R5+63]R1=[BP+64]

R1=[R5+63]R1=[BP+64]

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

§3.2§3.2 指令分类指令分类

• 数据传送类数据传送类• 算术运算类算术运算类• 逻辑操作类逻辑操作类• 控制转移类及设置类控制转移类及设置类

11 、装载数据、装载数据 Rd=Rd= 源操作源操作

22 、存储数据、存储数据[RAM[RAM 地址地址 ]=R]=R

ss

33 、堆栈操作、堆栈操作

11 、装载数据、装载数据 Rd=Rd= 源操作源操作

22 、存储数据、存储数据[RAM[RAM 地址地址 ]=R]=R

ss

33 、堆栈操作、堆栈操作

11 、加法运算、加法运算22 、减法运算、减法运算 Rd=RxRd=Rx±± 源操作数源操作数 [[ ,, CarrCarr

y]y]33 、乘法运算、乘法运算44 、求补、求补 Rd= -Rd= - 源操作数源操作数55 、比较、比较 CMP RxCMP Rx ,源操作数,源操作数

11 、加法运算、加法运算22 、减法运算、减法运算 Rd=RxRd=Rx±± 源操作数源操作数 [[ ,, CarrCarr

y]y]33 、乘法运算、乘法运算44 、求补、求补 Rd= -Rd= - 源操作数源操作数55 、比较、比较 CMP RxCMP Rx ,源操作数,源操作数

1.1. 逻辑与逻辑与2.2. 逻辑或逻辑或3.3. 逻辑异或逻辑异或4.4. 测试测试5.5. 移位移位6.6. 循环循环

1.1. 逻辑与逻辑与2.2. 逻辑或逻辑或3.3. 逻辑异或逻辑异或4.4. 测试测试5.5. 移位移位6.6. 循环循环

1.1. 软中断软中断2.2. 程序转移程序转移3.3. 子调用子调用4.4. 功能设置功能设置

1.1. 软中断软中断2.2. 程序转移程序转移3.3. 子调用子调用4.4. 功能设置功能设置

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

一、 数据传送类指令一、 数据传送类指令 数据装载类

Rd= 源操作 // 影响 N 、 Z 标志。 存储数据类

[RAM 地址 ]=Rs // 不影响任何标志。 堆栈操作类

数据装载类 Rd= 源操作 // 影响 N 、 Z 标志。

存储数据类 [RAM 地址 ]=Rs // 不影响任何标志。

堆栈操作类

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

11 、压栈指令:、压栈指令: PUSH RxPUSH Rx ,, Ry Ry toto [SP] [SP]

堆栈是在内存中开辟的部分空间。堆栈是在内存中开辟的部分空间。 将将 Rx~RyRx~Ry 中的数据压入以中的数据压入以 SPSP 的内容为起始地址的的内容为起始地址的存储器中。高序号寄存器内容先压入。存储器中。高序号寄存器内容先压入。 x~yx~y 为连续为连续 IIDD 号。号。单个寄存器压入堆栈单个寄存器压入堆栈

PUSH Rx to [SP] PUSH Rx to [SP] 或 或 PUSH RxPUSH Rx ,, Rx to [SRx to [SP] P] 先压栈,后修改先压栈,后修改 SPSP ,其内容自动减量。,其内容自动减量。 不影响标志位不影响标志位。。

PUSH RxPUSH Rx ,, Ry Ry toto [SP] [SP]堆栈是在内存中开辟的部分空间。堆栈是在内存中开辟的部分空间。 将将 Rx~RyRx~Ry 中的数据压入以中的数据压入以 SPSP 的内容为起始地址的的内容为起始地址的存储器中。高序号寄存器内容先压入。存储器中。高序号寄存器内容先压入。 x~yx~y 为连续为连续 IIDD 号。号。单个寄存器压入堆栈单个寄存器压入堆栈

PUSH Rx to [SP] PUSH Rx to [SP] 或 或 PUSH RxPUSH Rx ,, Rx to [SRx to [SP] P] 先压栈,后修改先压栈,后修改 SPSP ,其内容自动减量。,其内容自动减量。 不影响标志位不影响标志位。。

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

例例 11 、执行指令 、执行指令 PUSH R3PUSH R3 ,, R7 to [SP]R7 to [SP]

X

X

SPSP

X

X

PCPC

SRSR

BPBP

R4R4

R3R3

SP

高高地地址址

低低地地址址

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

22 、出栈指令、出栈指令

POP RxPOP Rx ,, Ry from [SP]Ry from [SP] 将以将以 SPSP 的内容为起始地址的一组存储器中的内容的内容为起始地址的一组存储器中的内容

送到送到 Rx~RyIDRx~RyID 号有序寄存器中。先传送低序号寄号有序寄存器中。先传送低序号寄存器。存器。

弹出到单个寄存器弹出到单个寄存器POP RxPOP Rx ,, Rx from [SP]Rx from [SP]

SPSP 内容先自动增量,再出栈。内容先自动增量,再出栈。 影响标志位影响标志位 NN 、、 ZZ 。。

POP RxPOP Rx ,, Ry from [SP]Ry from [SP] 将以将以 SPSP 的内容为起始地址的一组存储器中的内容的内容为起始地址的一组存储器中的内容

送到送到 Rx~RyIDRx~RyID 号有序寄存器中。先传送低序号寄号有序寄存器中。先传送低序号寄存器。存器。

弹出到单个寄存器弹出到单个寄存器POP RxPOP Rx ,, Rx from [SP]Rx from [SP]

SPSP 内容先自动增量,再出栈。内容先自动增量,再出栈。 影响标志位影响标志位 NN 、、 ZZ 。。

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

例例 22 、执行指令 、执行指令 POP R3POP R3 ,, PC PC fromfrom [S [SP]P]

SPSP

X

X

PCPC

SRSR

R5R5

R4R4

R3R3

SP PCPC

SRSR

R5R5

R4R4

R3R3

X

X

PCPC

SRSR

R5R5

R4R4

R3R3

当执行完当执行完出栈后,内存出栈后,内存是什么状态?是什么状态?

当执行完当执行完出栈后,内存出栈后,内存是什么状态?是什么状态?

高地址高地址

低地址低地址

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

堆栈应用要注意的问题堆栈应用要注意的问题

• 空间冲突空间冲突 -- 堆栈空间与其它用户空间相交引堆栈空间与其它用户空间相交引起的冲突。这是用户空间估计不足引起的。起的冲突。这是用户空间估计不足引起的。

• 堆栈溢出堆栈溢出 -- 堆栈使用超出其分配范围,这是堆栈使用超出其分配范围,这是堆栈空间分配太少或子程序嵌套太深引起的。堆栈空间分配太少或子程序嵌套太深引起的。

由于单片机内存空间狭小,内由于单片机内存空间狭小,内存空间的使用要特别小心,要精打存空间的使用要特别小心,要精打细算,以避免出现下述问题。细算,以避免出现下述问题。

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

二、 算术运算类指令二、 算术运算类指令

• 加法运算加法运算• 减法运算减法运算• 乘法运算乘法运算• 求补指令求补指令• 比较指令比较指令

• 加法运算加法运算• 减法运算减法运算• 乘法运算乘法运算• 求补指令求补指令• 比较指令比较指令

Rd=RxRd=Rx±± 源操作数源操作数 [[ ,, Carry]Carry]

Rd= - Rd= - 源操作数源操作数CMP RxCMP Rx ,源操作数,源操作数

MR=Rd*RsMR=Rd*Rs ,, MR=[Rd]*MR=[Rd]*[Rs][Rs]

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

内积指令:内积指令:1.1. 符号数内积符号数内积

MR=[Rd]*MR=[Rd]* [Rs] {,ss} {,n}[Rs] {,ss} {,n}

MR=((Rd))χ((Rs))+ ((Rd+1))χ((Rs+1))+MR=((Rd))χ((Rs))+ ((Rd+1))χ((Rs+1))+

((Rd+2))χ((Rs+2))+……((Rd+2))χ((Rs+2))+……

选项选项 {,ss} {,ss} ,系统默认值,示为符号数运算。选项,系统默认值,示为符号数运算。选项 {,n}{,n} ,,n=1~16n=1~16 ,默认为,默认为 11 。。

MRMR 为为 R4R3R4R3

22.无符号数内积.无符号数内积

MR=[Rd]*MR=[Rd]* [Rs] [Rs] ,, usus {,n} {,n}

usus必须注明。其它同符号数内积。必须注明。其它同符号数内积。

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

X1X1 X2X2 X3X3 X4X4

C1C1 C2C2 C3C3 C4C4

RdRd

RsRs

X1X1 X1X1 X2X2 X3X3

C1C1 C2C2 C3C3 C4C4

RdRd

RsRs

(( R4R3R4R3 )) =X1*C1+X2*C2+X3*C3+X4*C4=X1*C1+X2*C2+X3*C3+X4*C4

例 、例 、 MR=[Rd]*[Rs] MR=[Rd]*[Rs] ,, 44

当当 FIR_MOV ON :FIR_MOV ON :

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

[[ 例例 3.25]3.25].IRAM.IRAM.VAR.VAR NO_1=0x0001, NO_2=0x0002, NO_3=0x0003, NO_4=0x0004NO_1=0x0001, NO_2=0x0002, NO_3=0x0003, NO_4=0x0004.VAR.VAR NO_5=0x0005, NO_6=0x0006, NO_7, NO_8NO_5=0x0005, NO_6=0x0006, NO_7, NO_8.CODE.CODE.PUBLIC _main.PUBLIC _main_main:_main:FIR_MOV ONFIR_MOV ON ////允许移位允许移位R1= NO_2R1= NO_2 //// 指向起始位指向起始位R2= NO_5R2= NO_5MR=[R1]*[R2], us, 2 MR=[R1]*[R2], us, 2 ////第第 11 次,次, 2*5+3*62*5+3*6 。 。 [NO_7]=R3[NO_7]=R3[NO_8]=R4[NO_8]=R4NOPNOPJMP _mainJMP _mainRETFRETF

NO_2NO_2 NO_3NO_3

0x00020x0002 0x00030x0003

NO_5NO_5 NO_6NO_6

0x00050x0005 0x00060x0006

NO_2NO_2 NO_3NO_3

0x00020x0002 0x00020x0002

第第 22 次:次: 2*5+2*62*5+2*6

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

求补指令与比较指令• 求补指令求补指令

是一种将正数变负数,负数变正数的补是一种将正数变负数,负数变正数的补码运算。码运算。

• 比较指令比较指令作减法,仅影响作减法,仅影响 NN 、、 ZZ 、、 SS 、、 CC 标志。标志。目标单元不变。目标单元不变。

例:例: R1=-0x28R1=-0x28 R2=-0xFFFFR2=-0xFFFF R4=-R1R4=-R1

例:例: R1=-0x28R1=-0x28 R2=-0xFFFFR2=-0xFFFF R4=-R1R4=-R1

例:例: R1=-0x28R1=-0x28 R2=-0xFFFFR2=-0xFFFF CMP R1CMP R1 ,, R2R2 条件转移指令条件转移指令

例:例: R1=-0x28R1=-0x28 R2=-0xFFFFR2=-0xFFFF CMP R1CMP R1 ,, R2R2 条件转移指令条件转移指令

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

三、 逻辑操作类指令三、 逻辑操作类指令

逻辑与逻辑与 逻辑或逻辑或 逻辑异或逻辑异或 测试指令测试指令 移位指令移位指令 循环指令循环指令

逻辑与逻辑与 逻辑或逻辑或 逻辑异或逻辑异或 测试指令测试指令 移位指令移位指令 循环指令循环指令

由于由于 SPCESPCE 无位控指令,在无位控指令,在开关量控制中,可用这些指令来开关量控制中,可用这些指令来进行位操作:进行位操作:

将控制字中的某些位置将控制字中的某些位置 00 ,,其余位不变。其余位不变。

将控制字中的某些位置将控制字中的某些位置 11 ,,其余位不变。其余位不变。

将控制字中的某些位取反,将控制字中的某些位取反,其余位不变。其余位不变。

以实现对这些位的控制与测试。以实现对这些位的控制与测试。

由于由于 SPCESPCE 无位控指令,在无位控指令,在开关量控制中,可用这些指令来开关量控制中,可用这些指令来进行位操作:进行位操作:

将控制字中的某些位置将控制字中的某些位置 00 ,,其余位不变。其余位不变。

将控制字中的某些位置将控制字中的某些位置 11 ,,其余位不变。其余位不变。

将控制字中的某些位取反,将控制字中的某些位取反,其余位不变。其余位不变。

以实现对这些位的控制与测试。以实现对这些位的控制与测试。

““与”与”操作,仅影响操作,仅影响 NN 、、ZZ 标志。结合条件转移指令使标志。结合条件转移指令使用。 用。

在开关量控制中,可用于在开关量控制中,可用于测试测试目标字目标字的某些位是否为的某些位是否为 00或或 11 。。

““与”与”操作,仅影响操作,仅影响 NN 、、ZZ 标志。结合条件转移指令使标志。结合条件转移指令使用。 用。

在开关量控制中,可用于在开关量控制中,可用于测试测试目标字目标字的某些位是否为的某些位是否为 00或或 11 。。

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

例例 44 、分别用指令表示,将、分别用指令表示,将 R1R1 中的中的 D2D2 、、 D6D6 、、D13D13 置置 11 ,清,清 00 ,取反,其余位不变的操作。,取反,其余位不变的操作。

置置 11

将置将置 11 的位“或”的位“或” 11 ,不变的位“或”,不变的位“或” 00 。。所以有,所以有, R1|=0x2044 //0010000001000100R1|=0x2044 //0010000001000100

清清 00

将清将清 00 的位“与”的位“与” 00 ,不变的位“与”,不变的位“与” 11 。。所以有,所以有, R1&=0xDFBB //1101 1111 1011 1011R1&=0xDFBB //1101 1111 1011 1011

取反取反将取反的位“异或”将取反的位“异或” 11 ,不变的位 “异或”,不变的位 “异或” 00 。。

所以有,所以有, R1^=0x2044 //0010000001000100R1^=0x2044 //0010000001000100

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

例例 55 、假设、假设 R2R2 中的内容是交换机的用户摘挂机状态字,中的内容是交换机的用户摘挂机状态字,每一位对应一个用户摘挂机状态,每一位对应一个用户摘挂机状态, 00挂机,挂机, 11摘机。用摘机。用TESTTEST 指令测试用户摘挂机状态。摘机时作指令测试用户摘挂机状态。摘机时作 HH 处理,否处理,否则继续测试下一个用户状态。则继续测试下一个用户状态。

例例 55 、假设、假设 R2R2 中的内容是交换机的用户摘挂机状态字,中的内容是交换机的用户摘挂机状态字,每一位对应一个用户摘挂机状态,每一位对应一个用户摘挂机状态, 00挂机,挂机, 11摘机。用摘机。用TESTTEST 指令测试用户摘挂机状态。摘机时作指令测试用户摘挂机状态。摘机时作 HH 处理,否处理,否则继续测试下一个用户状态。则继续测试下一个用户状态。

TEST R2TEST R2 ,, 0x00010x0001

JZ d1JZ d1

CALL H0CALL H0

d1d1 : : TEST R2TEST R2 ,, 0x00020x0002

JZ d2JZ d2

CALL H1CALL H1

d2 : TEST R2d2 : TEST R2 ,, 0x00040x0004

JZ d3JZ d3

CALL H2CALL H2

d3d3 :……:……

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

• 逻辑逻辑 // 算术左移 算术左移 LSLLSL• 逻辑右移 逻辑右移 LSRLSR• 算术右移 算术右移 ASRASR

移位指令移位指令Rd=RS LSL Rd=RS LSL nnnn //nn=1~4 //nn=1~4Rd=RS LSR Rd=RS LSR nnnn //nn=1~4 //nn=1~4Rd=RS ASR Rd=RS ASR nnnn //nn=1~4 //nn=1~4

多功能移位指令: 多功能移位指令: ——先移位后运算——先移位后运算R1+=R2 LSL 2, Carry //(R1)+(R2)R1+=R2 LSL 2, Carry //(R1)+(R2) 左移左移 22 位位 +C+C R1 R1

R1= -R2 LSR 2, // (R2)R1= -R2 LSR 2, // (R2) 右移右移 22 位后求补位后求补 R1R1

例:例: R1=0xFF00R1=0xFF00

R2=0x0001R2=0x0001

R2+=R1 ASR 1 //R2+=R1 ASR 1 // 执行这条指令后,(执行这条指令后,( R2R2 )) =FF81=FF81HH

多功能移位指令: 多功能移位指令: ——先移位后运算——先移位后运算R1+=R2 LSL 2, Carry //(R1)+(R2)R1+=R2 LSL 2, Carry //(R1)+(R2) 左移左移 22 位位 +C+C R1 R1

R1= -R2 LSR 2, // (R2)R1= -R2 LSR 2, // (R2) 右移右移 22 位后求补位后求补 R1R1

例:例: R1=0xFF00R1=0xFF00

R2=0x0001R2=0x0001

R2+=R1 ASR 1 //R2+=R1 ASR 1 // 执行这条指令后,(执行这条指令后,( R2R2 )) =FF81=FF81HH

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

循环指令循环指令• 左循环 左循环 ROLROL

• 右循环 右循环 RORROR

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

四、四、控制转移设置类指令四、四、控制转移设置类指令

• 软中断软中断• 程序转移程序转移• 子程序调用子程序调用• 功能设置功能设置

• 软中断软中断• 程序转移程序转移• 子程序调用子程序调用• 功能设置功能设置

—— —— 中断向量 中断向量 = 00FFF5H= 00FFF5H

———— 条件转移和无条件转条件转移和无条件转移移

指令周期:指令周期: ((满足满足条件条件 )) 转移为转移为 55 ,否则,否则为为 33 。。

指令周期:指令周期: ((满足满足条件条件 )) 转移为转移为 55 ,否则,否则为为 33 。。

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

应用举例应用举例 11例例 11 、软件延时子程序设计。、软件延时子程序设计。Delay_x:Delay_x:

R1=0R1=0

Delay_LoopDelay_Loop ::R1=R1+1R1=R1+1

CMP R1CMP R1 ,, 0x03E80x03E8

JNAE Delay_LoopJNAE Delay_Loop

Exit_Loop:Exit_Loop:

RETFRETF

例例 11 、软件延时子程序设计。、软件延时子程序设计。Delay_x:Delay_x:

R1=0R1=0

Delay_LoopDelay_Loop ::R1=R1+1R1=R1+1

CMP R1CMP R1 ,, 0x03E80x03E8

JNAE Delay_LoopJNAE Delay_Loop

Exit_Loop:Exit_Loop:

RETFRETF

// 3// 3 个指令周期个指令周期// 8// 8 个指令周期,个指令周期, 3E83E8 :: 10001000

//// 顺序为顺序为 3,3, 转移为转移为 55 个指令周个指令周期期

// 12// 12 个指令周期个指令周期

程序延时多程序延时多长时间?修改延时,长时间?修改延时,修改程序的什么地修改程序的什么地方?本子程序最多方?本子程序最多延时时间是多少?延时时间是多少?

5mS

S 0.00520832

103.2552100016

3.072MHz

110005)8(3

3.072MHz824.5768fCPUCLK

7-

OSC

延时时间

5mS

S 0.00520832

103.2552100016

3.072MHz

110005)8(3

3.072MHz824.5768fCPUCLK

7-

OSC

延时时间

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

应用举例应用举例 22例例 1010 、编写计算、编写计算 1~1001~100所有整数和,且结果存于所有整数和,且结果存于 R1R1 中的函数。中的函数。F_Calculate_SumF_Calculate_Sum ::

R1=0R1=0

R2=1R2=1

L_SumLoopL_SumLoop ::R1+=R2R1+=R2

R2+=1R2+=1

CMP R2CMP R2 ,, 0x650x65

JB L_SumLoopJB L_SumLoop //// 小于转移小于转移RETRET

例例 1010 、编写计算、编写计算 1~1001~100所有整数和,且结果存于所有整数和,且结果存于 R1R1 中的函数。中的函数。F_Calculate_SumF_Calculate_Sum ::

R1=0R1=0

R2=1R2=1

L_SumLoopL_SumLoop ::R1+=R2R1+=R2

R2+=1R2+=1

CMP R2CMP R2 ,, 0x650x65

JB L_SumLoopJB L_SumLoop //// 小于转移小于转移RETRET

计算计算 1~1001~100单元中所有整数单元中所有整数和和 ,, 如何修改如何修改 ??

Page 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]

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

处理器的寻址方式处理器的寻址方式处理器的指令分类处理器的指令分类如何看指令表如何看指令表

指令功能指令功能指令对标志位的影响指令对标志位的影响指令周期指令周期

小结小结

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

§3.3 §3.3 伪指令伪指令

使程序: 层次清晰,阅读方便,指导编译。

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

伪指令分类伪指令分类指令类型指令类型 伪指令伪指令 用途用途

定义类定义类(各程序段)(各程序段)

PROC…ENDPPROC…ENDP 、、 MACRO…MACRO…ENDMENDMDEFINEDEFINE 、、 VARVAR 、、 PUBLICPUBLIC、、 EXTERNALEXTERNAL 、、 STRUCT…STRUCT…ENDSENDSCODECODE 、、 TEXTTEXT 、、 DATADATA 、、 IIRAMRAM 、、 OSRAM…OSRAM…

子程序、宏子程序、宏程序中的数据、范围、程序中的数据、范围、结构结构程序、数据的存储属性程序、数据的存储属性

存储类存储类DWDW 、、 DDDD 、、 FLOATFLOAT 、、 DOUBDOUBLELE

ORGORG 、、 ENDEND

说明数据类型存储数据说明数据类型存储数据设定程序地址设定程序地址

重复存储类重复存储类 DUPDUP 重复定义指定数据类型重复定义指定数据类型的若干数据单元的若干数据单元

条件类条件类IF …ELSE…IF …ELSE…ENDIFENDIF 、、 IFMAIFMA 、、 IFDEFIFDEF 、、 IIFNDFFFNDFF

条件汇编条件汇编

汇编方式类汇编方式类 INCLUDEINCLUDE 、、 SECTIONSECTION 包含文件、用户定义段包含文件、用户定义段

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

段切换伪指令段切换伪指令类别类别 语法格式语法格式 功能说明功能说明切换预定切换预定义代码段义代码段

.CODE.CODE

.TEXT.TEXT

程序和程序和数据数据存放在所定义的存放在所定义的 CODECODE 段或段或 TEXTTEXT 段,段,TEXTTEXT 段只能被连接到零页段只能被连接到零页 ROMROM 中。中。

切换预定切换预定义数据段义数据段

.DATA.DATA 数据段。数据段。

.RAM.RAM RAMRAM 段用来存放无初值的变量,不能跨段用来存放无初值的变量,不能跨 bankbank 连接。连接。SRAMSRAM 连接时,只分配连接时,只分配 6464 (( 0~630~63 )个字的数据单)个字的数据单元。其它与元。其它与 RAMRAM同。同。.SRAM.SRAM

.IRAM.IRAM IRAMIRAM 段用来存放有初值的变量,不能跨段用来存放有初值的变量,不能跨 bankbank 连接。连接。可连接到可连接到 RAMRAM 或或 ROMROM 中。中。 ISRAMISRAM 连接时,只分连接时,只分配配 6464 (( 0~630~63 )个字的数据单元。其它与)个字的数据单元。其它与 IRAMIRAM 同。同。.ISRAM.ISRAM

.ORAM.ORAM ORAMORAM 段用来存放无初值的变量,不能跨段用来存放无初值的变量,不能跨 bankbank 连连接。同一目标文件,所有各段同名或同属性变量合接。同一目标文件,所有各段同名或同属性变量合并;在同一项目不同文件使用相同变量重叠使用的并;在同一项目不同文件使用相同变量重叠使用的存储空间。存储空间。 OSRAMOSRAM 连接时,只分配连接时,只分配 6464 (( 0~630~63 ))个字的数据单元。其它与个字的数据单元。其它与 ORAMORAM 同。同。

.OSRAM.OSRAM

用户定义段用户定义段 LabelLabel :: .SECTION .SECTION attributeattribute 创建用户定义段。创建用户定义段。

常数及一些不变的量。建立的是一

个共享空间!

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

数据定义伪指令数据定义伪指令类别类别 语法格式语法格式 功能说明功能说明

定义数据及存定义数据及存储类型储类型

.DEFINE.DEFINE constant[value][,…] constant[value][,…] 定义常数符号。定义常数符号。

.VAR.VAR variable[=value] variable[=value] 定义变量并及初值。定义变量并及初值。Label: Label: .EQU.EQU value value 为标号赋值。为标号赋值。[label:] [label:] .DW.DW value[,…] value[,…] 1616 位整型数常数。位整型数常数。[label:] [label:] .DD.DD value[,…] value[,…] 3232 位整型数常数。位整型数常数。label: label: .FLOAT.FLOAT value[,…] value[,…] 单精度浮点数常数。单精度浮点数常数。label: label: .DOUBLE.DOUBLE value[,…] value[,…] 双精度浮点数常数。双精度浮点数常数。

定义结构类型定义结构类型 label: label: .STRUCT/.ENDS.STRUCT/.ENDS

数据范围数据范围PUBLIC PUBLIC label[,label][,…]label[,label][,…] 引用在其它文件中的全局标号。引用在其它文件中的全局标号。.EXTERNAL.EXTERNAL label[,…] label[,…] 声明已在其它文件中定义过的声明已在其它文件中定义过的

标号。标号。重复存储重复存储 Number Number DUPDUP (value) (value) 存放相同数据或预留空间。存放相同数据或预留空间。

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

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

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

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

在源程序中用一个宏名在源程序中用一个宏名取代一系列源语句行,从而取代一系列源语句行,从而简化程序,增加程序的可读简化程序,增加程序的可读性。在编译的时候,编译器性。在编译的时候,编译器会将其展开在目标代码中。会将其展开在目标代码中。

宏指令的定义与调用宏指令的定义与调用

宏定义:宏定义:macro_name : MACRO [macro_name : MACRO [形参表形参表 ]] CPU CPU 指令 指令 //// 宏定义宏定义体体 [.MACEXIT][.MACEXIT] …… …… .ENDM .ENDM 宏指令宏指令 :: macro_name [macro_name [实参表实参表 ]]

宏定义:宏定义:macro_name : MACRO [macro_name : MACRO [形参表形参表 ]] CPU CPU 指令 指令 //// 宏定义宏定义体体 [.MACEXIT][.MACEXIT] …… …… .ENDM .ENDM 宏指令宏指令 :: macro_name [macro_name [实参表实参表 ]]

宏定义举例宏定义举例 11 ::M_instruction : MACRO argM_instruction : MACRO arg,, valval argarg Lab#Lab#: : .DW val.DW val .ENDM .ENDM 宏调用宏调用 :: M_instruction M_instruction nop, 87nop, 87宏展开宏展开 : : nopnop .DW .DW 8787

宏定义举例宏定义举例 11 ::M_instruction : MACRO argM_instruction : MACRO arg,, valval argarg Lab#Lab#: : .DW val.DW val .ENDM .ENDM 宏调用宏调用 :: M_instruction M_instruction nop, 87nop, 87宏展开宏展开 : : nopnop .DW .DW 8787

宏定义举例宏定义举例 22 :雇员信息:雇员信息 employee : MACRO arg1employee : MACRO arg1 , , arg2arg2 , , arg3 arg3 name : .DW arg1 name : .DW arg1 department : .DW arg2 department : .DW arg2 date_hired : .DW arg3date_hired : .DW arg3 .ENDM .ENDM 宏调用宏调用 :: employeeemployee ‘john‘john doe’ doe’, sales, 022098, sales, 022098

宏展开宏展开 : : name: .DW name: .DW ‘john‘john doe’ doe’ department: .DW department: .DW salessales date_hired: .DW date_hired: .DW 022098022098

宏定义举例宏定义举例 22 :雇员信息:雇员信息 employee : MACRO arg1employee : MACRO arg1 , , arg2arg2 , , arg3 arg3 name : .DW arg1 name : .DW arg1 department : .DW arg2 department : .DW arg2 date_hired : .DW arg3date_hired : .DW arg3 .ENDM .ENDM 宏调用宏调用 :: employeeemployee ‘john‘john doe’ doe’, sales, 022098, sales, 022098

宏展开宏展开 : : name: .DW name: .DW ‘john‘john doe’ doe’ department: .DW department: .DW salessales date_hired: .DW date_hired: .DW 022098022098

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

段切换伪指令与段切换伪指令与 SPCESPCE061A061A 存储器空间存储器空间RAMRAM :存放无初值:存放无初值

的变量。的变量。IRAMIRAM :存放具有初:存放具有初值的变量。并分配值的变量。并分配 RROMOM 及及 RAMRAM 空间。空间。

ORAMORAM :存放无初:存放无初值的变量。一个项目值的变量。一个项目的不同文件中与的不同文件中与 RARAMM 段同名同属性的段同名同属性的各段会被重叠在一起。各段会被重叠在一起。这适合于不同文件需这适合于不同文件需要使用相同的变量空要使用相同的变量空间。间。

SRAMSRAM :与:与 RAMRAM 同,同,但只能连接到但只能连接到 0~630~63单元。单元。

ISRAMISRAM :与:与 IRAMIRAM同,但只能连接到同,但只能连接到 00~63~63 单元。单元。

OSRAMOSRAM :与:与 ORAORAMM 同,但只能连接同,但只能连接到到 0~630~63 单元。单元。

CODECODE :所有程序和:所有程序和数据都可以存放在该数据都可以存放在该段。段。

DATADATA :程序中的数:程序中的数据(常数)都可以存据(常数)都可以存放在该段。放在该段。

TEXTTEXT :与:与 CODECODE基本相同,只是它只基本相同,只是它只能连接到零页能连接到零页 ROMROM中,且所有同名同属中,且所有同名同属性的各段会被合并在性的各段会被合并在一起。一起。 SPCE061ASPCE061A只有零页只有零页 ROMROM 。该。该段主要用来存放中断段主要用来存放中断程序代码。程序代码。

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

作业作业三、试将 R1 中, D5 、 D9 、 D11 、 D14 ,清清 00 ,取反,,取反,

其余位不变。其余位不变。四、试写出判断 R2 中的 D12=1时转移到 LAB1去执行,否则顺序执行的程序。

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

伪指令是用来指导编译器编译用户程伪指令是用来指导编译器编译用户程序的。本身不产生目标代码。序的。本身不产生目标代码。

在伪指令的指导下,汇编语言程序会在伪指令的指导下,汇编语言程序会变得简单易读。变得简单易读。

伪指令中的符号地址,免除了程序员伪指令中的符号地址,免除了程序员管理存储器物理地址的痛苦。指令前管理存储器物理地址的痛苦。指令前的标号是该指令的符号地址,的标号是该指令的符号地址, VARVAR定义的标号是数据的符号地址。定义的标号是数据的符号地址。

伪指令是用来指导编译器编译用户程伪指令是用来指导编译器编译用户程序的。本身不产生目标代码。序的。本身不产生目标代码。

在伪指令的指导下,汇编语言程序会在伪指令的指导下,汇编语言程序会变得简单易读。变得简单易读。

伪指令中的符号地址,免除了程序员伪指令中的符号地址,免除了程序员管理存储器物理地址的痛苦。指令前管理存储器物理地址的痛苦。指令前的标号是该指令的符号地址,的标号是该指令的符号地址, VARVAR定义的标号是数据的符号地址。定义的标号是数据的符号地址。

小结小结小结小结