112

凌阳 16 位单片机

Embed Size (px)

DESCRIPTION

凌阳 16 位单片机. u ’ nSP 指令介绍. 主要内容. 16 位 u ’ nSP 内核架构 指令系统  ’ nSP ™ 汇编伪指令. 一、 16 位 u’nSP 内核架构. 16 位 u’nSP 内核架构. 16 位数据总线 / 22 位地址总线 a: 4M 字寻址空间 b: 64 页,每页 64K 字 .  ’ nSP™ 存储器地址映射. 13 个 16 位寄存器 a: 4 个通用寄存器 (R1-R4) b: 4 个二级寄存器 (SR1-SR4) c: 1 个基址寄存器( BP ) d : 4 个系统寄存器 - PowerPoint PPT Presentation

Citation preview

Page 1: 凌阳 16 位单片机
Page 2: 凌阳 16 位单片机

2

凌阳凌阳 1616 位单片机位单片机

u’nSP 指令介绍

Page 3: 凌阳 16 位单片机

3

主要内容主要内容

16 位 u’nSP 内核架构指令系统’ nSP™ 汇编伪指令

Page 4: 凌阳 16 位单片机

4

一、 16 位 u’nSP 内核架构

Page 5: 凌阳 16 位单片机

5

1616 位位 u’nSP u’nSP 内核架构 内核架构 SP

R1

R2

R3

R4

R5(BP)

SR

PC

MUX

SHI FTER

BRSB

NZSCALU

DS NZSC CS05691015

DR16

ADDR

GEN22

DATA

BUS

ADDR

ESS

BUS

BR

User Regi ster

PC: Program Counter

SP: Stack Poi nter

SB: Shi f t Buff er

NZSC: Fl ag

DS: Data Segment Regi ster

CS: Code Segment Regi ster

Internal Regi sters

AddrGen: Address Generator

DR: Data Regi ster

BR: B-Regi ster

SR1

SR2

SR3

SR4

Page 6: 凌阳 16 位单片机

6

16 位数据总线 /

22 位地址总线

a: 4M 字寻址空间b: 64 页,每页 64K 字

0x000000

0x000800

0x007000

0x008000

0x3FFFFF

I/O 端口系统端口

零Ò³ROM

0x010000

外部 SRAM

0x004000

0x00FFFF

0x0007FF

0x003FFF

0x006FFF

0x007FFF

SRAM

第1页ROM

第63Ò³ROM

0x00FBFF保留空间

保留空间

中断向量0x00FFF5

’nSP™存储器地址映射

Page 7: 凌阳 16 位单片机

7

13个 16 位寄存器a: 4 个通用寄存器 (R1-R4)b: 4 个二级寄存器 (SR1-SR4)c: 1 个基址寄存器( BP )d : 4 个系统寄存器 SP :堆栈指针 SR :状态寄存器 PC :程序指针 FR :标志寄存器

SECBANK ON/OFF

SPR1R2R3R4BPSRPC

FR

SPSR1SR2SR3SR4BPSRPC

FR

PRI BANK SECBANK

000

111110101100011010001

000

111110101100011010001

Page 8: 凌阳 16 位单片机

8

寄存器号

Page 9: 凌阳 16 位单片机

9

状态寄存器

CS:代码段 DS:数据段 条件标志 N :负数标志 Z :零标志 S :符号位 C :进位标志

Page 10: 凌阳 16 位单片机

10

标志寄存器

AQ:DIVS/DIVQ 执行的条件判别标志( 0 ) BNK :第二寄存器组使用标志( 0 ) [Primary (0) / Secondary (1)] FRA: FRACTION模式( 0 ) [Off (0) / On (1)] FIR: FIR_MOVE 模式( 0 ) [On (0) / Off (1)] SFT BUF :移位缓冲器或 FIR 运算保护位( 0000 )

Page 11: 凌阳 16 位单片机

11

标志寄存器 ( 续 )

F :快速中断使能标志( 0 ) I :普通中断使能标志( 0 ) INE:中断嵌套模式( 0 ) [IRQNEST ON( 1) /IRQNEST OFF( 0) ] IRQ PRI:普通中断优先级寄存( 1000 ) IRQ0>IRQ1>IRQ2>IRQ3>IRQ4>IRQ5>IRQ6>IRQ7

Page 12: 凌阳 16 位单片机

12

10 个中断源 a: 1 个快速中断 b: 8 个一般中断 c: 1 个软件中断

支持中断嵌套模式 IRQNEST ON/OFF

在中断嵌套模式被启用时,如果在中断过程有更高优先级的中断发生,将发生中断嵌套。

Page 13: 凌阳 16 位单片机

13

二、指令系统

Page 14: 凌阳 16 位单片机

14

符号约定符号约定

为了便于说明格式,在指令介绍前要先了解一些符号约定。 Rd 目标寄存器或目标存储器指针 Rs 源寄存器或源存储器指针 R1,R2,R3,R4,R5(BP) NZSC SR 寄存器中的 4 个标志位 PC 程序指针 SP 堆栈指针 BP 基指针

Page 15: 凌阳 16 位单片机

15

SR 段寄存器→ 数据传送符号MR 由 R4,R3 组成的 32 位结果寄存器 ( R4 为高字节 ,R3 为低字节)FIR 有限冲击响应( Finite Impulse Response ) 指数字信号处理中的一种具有线性相位及任 意幅度特性的数字滤波器算法。{} 可选项[] 寄存器间接寻址标志

Page 16: 凌阳 16 位单片机

16

// 注释符RW 读等待态SW 存储等待态SRW 存储 / 读等待态ss 两个有符号数之间的操作, us 无符号数与有符号数之间的操作Label 程序标号

Page 17: 凌阳 16 位单片机

17

++,- - 指针单位字增量,字减量 IM6/IM16 6 位立即数 /16 位立即数 A6/A16 6 位地址码 /16 位地址码

+ , - , × 加法符号,减法符号,乘法符号& , | , ^ , ~ 逻辑与符号,逻辑或符号,

逻辑异或符号,逻辑取反符号

Page 18: 凌阳 16 位单片机

18

6 种寻址方式 a: 立即数寻址:操作数以立即数的形式出现 例: R1 = 0x28; b: 存储器直接寻址:通过存储器地址来访问存储器

中的数据 例: [0x30] = R4; R4 = [0X30]; c: 寄存器寻址:操作数在寄存器中 例: R3 = R1d: 寄存器间接寻址:操作数的地址由寄存器给出 例: R2 = [R3];

Page 19: 凌阳 16 位单片机

19

6 种寻址方式

e: 变址寻址:操作数的地址由基址和偏移量 (6位 ) 共同给出

例: R3 = [BP + 0x08]; f: 多重间接寻址 ( 入栈 / 出栈 ) :可以将多个寄存

器的值一次压入堆栈,或从堆栈中弹出 例: PUSH R1, R3 TO [SP]

Page 20: 凌阳 16 位单片机

20

数据传送类 算逻运算类 程序转移控制类 其它控制类 位操作指令

指令分类指令分类

Page 21: 凌阳 16 位单片机

21

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

立即数寻址 / 寄存器寻址 / 直接地址寻址变址寻址 / 寄存器间接寻址压栈出栈

Page 22: 凌阳 16 位单片机

22

11 、立即数寻址、立即数寻址 // 寄存器寻址寄存器寻址 // 直接地址寻址直接地址寻址 这组指令会执行 Rd = X 的数据传送操作,

即将源操作数 X 或源操作单元 X 中的字数据存入目标寄存器 Rd 。依据寻址方式的不同, X 将有不同的意义。

Page 23: 凌阳 16 位单片机

23

应用举例应用举例R1=0x28 //IM6 R2=0x2400 //IM16R3=[BP + 0x08] //[BP+IM6]R4=[0x30] //A6R5=[0x2480] //A16SR=R2 //R

CPU 内部标志访问指令: FR = Rs ; Rs = FR ;

Page 24: 凌阳 16 位单片机

24

22 、变址寻址、变址寻址 // 寄存器间接寻址寄存器间接寻址

这组指令会执行 X = Rd 的数据传送操作,即将寄存器 Rd 的内容存入目标操作单元X 。依据寻址方式的不同 , X 将有不同的意义;

Page 25: 凌阳 16 位单片机

25

应用举例应用举例

[BP+0x08]=R3 // 写入 [BP+IM6][0x30]=R4 // 写入 [A6][0x2480]=R5 // 写入 [A16][R2++] = 0x25

[R2++] = R1 //R1 的值存于 0x25 单元

//R2=R2 +1

Page 26: 凌阳 16 位单片机

26

33 、压栈、压栈 PUSH Rx, Ry to [Rs] PUSH Rx to [Rs] 将 n( n=1~ 7, SIZE )个序列寄存器

Rx~ Ry( Rx~ Ry≠SP )中的数据压入Rs 指出地址偏移量初值的存储器中 , 且总是将序号高的寄存器内容先压入

Page 27: 凌阳 16 位单片机

27

应用举例应用举例

Page 28: 凌阳 16 位单片机

28

44 、出栈、出栈

POP Rx, Ry from [Rs] POP Rx from [Rs] 将一组由 Rs 指出地址偏移量初值的存储

器中的数据拷贝到 n( n = 1~7, SIZE )个序列寄存器 Rx~ Ry( Rx~ Ry≠SP )中,且总是先拷贝数据到序号低的寄存器内。

Page 29: 凌阳 16 位单片机

29

应用举例应用举例

Page 30: 凌阳 16 位单片机

30

二、算逻运算类指令二、算逻运算类指令

顾名思义这类指令就是用来完成一些算术逻辑运算的,基本是执行 Rd = X # Y的算术逻辑运算。依据寻址方式的不同, X、 Y 将有不同的意义。

Page 31: 凌阳 16 位单片机

31

11 、加法运算、加法运算

这组指令会执行 Rd = X+Y 的算术运算,即将源操作数 X、 Y 或源操作单元 X、 Y中的字数据进行不带进位的加法运算,结果存入 Rd 寄存器。

Page 32: 凌阳 16 位单片机

32

应用举例应用举例

R1+=0x28 //IM6R2=R1+0x2400 //IM16R3+=[BP + 0x08] //[BP+IM6]R4+=[0x30] //[A6]BP=R4+[0x2480] //[A16]SR+=R2 //R

Page 33: 凌阳 16 位单片机

33

22 、带进位的加法运算、带进位的加法运算

这组指令会执行 Rd = X+Y+C 的算术运算,即将源操作数 X、 Y 或源操作单元X、 Y 中的字数据进行带进位的加法运算,结果存入 Rd 寄存器。

Page 34: 凌阳 16 位单片机

34

应用举例应用举例

R1=0x28, Carry // R1 = R1 +IM6 + 进位 CR2=R1+0x2400, Carry // R2 = R1 +IM16 + 进位 CR3+=[BP + 0x08], Carry // R3 = R3 +[BP+IM6] + 进位 CR4+=[0x30] // R4 = R4 +[A6] + 进位 CBP=R4+[0x2480], Carry // BP = R4 +[A16] + 进位 CSR+=R2, Carry // SR=SR+R2+ 进位 CPC+=D:[BP++], Carry // 写入 PC,

Page 35: 凌阳 16 位单片机

35

33 、减法运算、减法运算

这组指令会执行 Rd = X - Y 的算术运算,即将源操作数 X、 Y 或源操作单元 X、 Y中的字数据进行不带借位的减法运算,结果存入 Rd 寄存器。

Page 36: 凌阳 16 位单片机

36

应用举例应用举例

R1-=0x28 // R1 = R1 - IM6R2=R1-0x2400 // R2 = R1 - IM16R3-=[BP + 0x08] // R3 = R1 - [BP+IM6]R4-=[0x30] // R4 = R4 - [A6]BP=R4-[0x2480] // BP = R4 - [A16]SR-=R2 // SR = SR - R2PC-=D:[R5++] // 写入 PC,

Page 37: 凌阳 16 位单片机

37

44 、不带借位的减法运算、不带借位的减法运算

这组指令会执行 Rd = X - Y - C = X + (~ Y) + C 的算术运算,即将源操作数X、 Y 或源操作单元 X、 Y 中的字数据进行带借位的减法运算,结果存入 Rd 寄存器。

Page 38: 凌阳 16 位单片机

38

应用举例应用举例

R1-=0x20, Carry // R1 = R1 -IM6 - 进位 CR2-=R1+0x2400+ Carry // R2 = R1 -IM16 - 进位 CR3-=[BP + 0x08], Carry // R3 = R3 -[BP+IM6] - 进位 CR4-=[0x30] // R4 = R4 -[A6] - 进位 CBP=R4-[0x2480], Carry // BP = R4 -[A16] - 进位 CSR-=R2, Carry // SR = SR - R2 - 进位 CPC-=D:[BP++], Carry // 写入 PC,

Page 39: 凌阳 16 位单片机

39

55 、取补运算、取补运算

这组指令会执行 Rd = -X = (~ X) + 1 的算术运算,结果存入 Rd 寄存器。

Page 40: 凌阳 16 位单片机

40

应用举例应用举例

R1=-0x27 // R1 = R1 -IM6R3=-[BP+0x08] // R3 = R3 -[BP+IM6]R4=-[0x30] // R4 = R4 -[A6]BP=-[0x2480] // BP = BP - [A16]SR=-R2 // SR = SR - R2PC=-D:[R5++] // 写入 PC

Page 41: 凌阳 16 位单片机

41

66 、比较运算、比较运算

这组指令会执行 X-Y 的算术运算,但只影响 NZSC 标志,而不将结果存储。

Page 42: 凌阳 16 位单片机

42

应用举例应用举例

CMP R1, 0x27 // 比较 R1, IM6CMP R3, [BP+0x08] // 比较 R3,[BP+IM6]CMP R4, [0x30] // 比较 R4, [A6]CMP BP, [0x2480] // 比较 BP, [A16]CMP SR, R2 // 比较 SR, R

Page 43: 凌阳 16 位单片机

43

77 、乘法运算指令、乘法运算指令 Rd 中字数据与 Rs 中字数据相乘,积存入 MR(R4,

R3) 。如果 Fraction mode 是使能的,这个结果会向左移一位 。

ss 表示为两个有符号数相乘, us 则表示无符号数与有符号数相乘; 缺省表示为两个有符号数相乘。

Page 44: 凌阳 16 位单片机

44

MR = Rd * Rs; // 默认情况为有符号乘有符号 MR = Rd * Rs,uu; // 无符号乘无符号MR = Rd * Rs, ss; // 有符号乘有符号MR = Rd * Rs, us; // Rd 为无符号数 , Rs 为有符号 //数 . 第一个寄存器总是无符号 // 的,第二个寄存器是有符号的

Page 45: 凌阳 16 位单片机

45

应用举例应用举例 ::

MR=R2*R1; // 两个有符号数相乘

MR=R1*R2, us; // R1 中是无符号数, // R2 中为有符号数,

Page 46: 凌阳 16 位单片机

46

88、、 nn 项内积运算指令项内积运算指令

指针 Rd与 Rs 所指存储器地址内有符号字数据之间或无符号与有符号字数据之间进行n 项内积运算,结果存入 MR 。

Page 47: 凌阳 16 位单片机

47

应用举例应用举例

MR=[R2]*[R1], 8; // 两个有符号数之内积运算

MR=[R1]*[R2], us, 2; //R1 中是无符号数, R2 中为有符号数

Page 48: 凌阳 16 位单片机

48

99 、除法( 、除法( DIVSDIVS、、 DIVQDIVQ ))除法运算可以是有符号或者是无符号的,但分子分母必需是同类型的数据。请将 32 位的被除数放到MR(R4, R3) 中, 16 位的除数放到 R2 中,并清掉AQ 标志,然后就可以进行除法运算。

对于有符号除法,首先应执行 DIVS 一次,从而得到商的符号位,然后多次执行 DIVQ得到商;

对于无符号除法,通过多次执行 DIVQ得到商。

运算结果的商在 R3 中。

Page 49: 凌阳 16 位单片机

49

1010 、逻辑与、逻辑与

这组指令会执行 Rd = X & Y 的逻辑与操作,结果存入 Rd 寄存器。

Page 50: 凌阳 16 位单片机

50

1111 、逻辑或、逻辑或

这组指令会执行 Rd = X | Y 的逻辑或操作,结果存入 Rd 寄存器。

Page 51: 凌阳 16 位单片机

51

1212 、逻辑异或、逻辑异或

这组指令会执行 Rd = X ^ Y 的逻辑异或操作,结果存入 Rd 寄存器。

Page 52: 凌阳 16 位单片机

52

1313 、测试指令、测试指令

这组指令会执行 X&Y 的逻辑操作,但只影响 NZ 标志,而不将结果存储。

Page 53: 凌阳 16 位单片机

53

1414 、移位操作、移位操作

包括逻辑左移、逻辑右移、循环左移、循环右移、算术右移等操作,移位的同时还可进行其他运算,如加、减、比较、取负、与、或、异或、测试等

Page 54: 凌阳 16 位单片机

54

移位操作—Ⅰ

ASR :算术右移LSL : 逻辑左移 LSR :逻辑右移 ROL :循环左移 ROR :循环右移

用法:( 1) Rd = Rd shift-op Rs ( Rs 值范围: 0——

15 )( 2) Rd = Rd shift-op Imm ( Imm 值范围: 0

——4 )

Page 55: 凌阳 16 位单片机

55

R1 = R1 ASR 3 //R1 算术右移 3 位

R2 = 2

R3 = R3 ROL R2 //循环左移 2 位

应用举例应用举例

Page 56: 凌阳 16 位单片机

56

移位操作—Ⅱ

ASR-OR :算术右移 - 或 LSL-OR :逻辑左移 - 或 LSR-OR :逻辑右移 - 或

用法:( 1)MR |= R4 shift-op Rs ( Rs 值范围: 0——15

)( 2) Rd |= Rd shift-op Imm ( Imm 值范围: 0——4)

Page 57: 凌阳 16 位单片机

57

R2 =4R4 = 0x1234R3 = 0x5678 //MR=0x12345678

R3 = R3 LSR R2 MR |= R4 LSR R2 //MR=0x01234567

应用举例应用举例

Page 58: 凌阳 16 位单片机

58

三、转移控制类指令三、转移控制类指令 软件中断 子程序调用指令 有条件 / 无条件跳转 无条件长跳转 利用 MR 寄存器执行长跳转指令 子程序返回 中断返回 无条件长跳转

Page 59: 凌阳 16 位单片机

59

11 、软件中断、软件中断

功能描述:产生一个由指令控制的软件中断, CPU 会跳到中断向量 [0x00FFF5] 处执行软中断服务子程序。

应用举例 : BREAK; //产生一个软件中断

Page 60: 凌阳 16 位单片机

60

22 、子程序调用指令、子程序调用指令

功能描述:这是在 64页 CODE 段绝对地址范围内的子程序调用指令。在指令执行期间,程序指针PC 和段寄存器 SR都会被自动压入栈中。

应用举例 : Call sub_1;

Page 61: 凌阳 16 位单片机

61

33 、有条件、有条件 // 无条件跳转无条件跳转

这是一组程序条件 / 无条件近转移指令。通过检测 SR 寄存器中各标志位作为程序转移的条件。若条件满足则程序跳转到与 PC 相关的地址上,跳转范围限制为 PC+63 个字;条件不满足则程序继续执行条件转移指令后面的指令。

Page 62: 凌阳 16 位单片机

62

应用举例应用举例 : :

CMP R1, R2; JNE label1; //若不相等,跳转到 label2 JMP labe2; // 无条件跳转到 label1

Page 63: 凌阳 16 位单片机

63

44 、无条件长跳转、无条件长跳转

功能描述:无条件跳转到用户指定地址。

应用举例:GOTO loop; // 程序无条件跳转到 loop 标号地址上。

Page 64: 凌阳 16 位单片机

64

调用以 MR 寄存器内容为入口地址的程序 .

F_Sub: r2 = 0x5555 r3 = 0x5555 mr = r2*r3 //r2乘 r3 retf

_main: r1 = 0xefff; r2 = 0x1713;

// 调用 F_Sub 子程序 r3 = OFFSET F_Sub r4 = SEG F_Sub call mr

L_MainLoop: jmp L_ MainLoop

55 、利用、利用 MRMR 寄存器执行长跳转指令寄存器执行长跳转指令

Page 65: 凌阳 16 位单片机

65

66 、子程序返回、子程序返回

功能描述:从子程序返回时须用 RETF 指令从栈中弹出状态寄存器 SR 和程序指针 PC 的值。由于弹栈动作发生在本指令执行之后,故弹栈后 SR和 PC 的值应分别与调用子程序之前二者的值相同。

应用举例: F_Sub1:

... RETF; // return from sub1

Page 66: 凌阳 16 位单片机

66

77 、中断返回、中断返回功能描述:

从中断服务子程序返回时须用 RETI 指令从栈中弹出状态寄存器 SR 和程序指针 PC 的值。由于弹栈动作发生在本指令执行之后,故弹栈后 SR和 PC 的值应分别与进入中断服务子程序之前二者的值相同。

应用举例 :.TEXT

.PUBLIC _IRQ1 _IRQ1: ... RETI; // return from IRQ1

Page 67: 凌阳 16 位单片机

67

四、其它控制类指令四、其它控制类指令 FIR_MOV ON/OFFFIQ 中断使能 /屏蔽 IRQ 中断使能 /屏蔽允许 /禁止 FIQ和 IRQ 中断设置Fraction ON/OFFSECBANK ON/OFF空操作

Page 68: 凌阳 16 位单片机

68

11 、 、 FIR_MOV ON/OFFFIR_MOV ON/OFF

功能描述:这组指令用来控制允许 /禁止 FIR 滤波器运算过程中数据的自动移动。由于这会影响到 FIR 滤波器运算的状态,且此状态具有全局性质,故用在中断服务子程序时要格外小心。

Page 69: 凌阳 16 位单片机

69

.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 // 使能 FIR 操作数据自动搬移 r1 = NO_2 // 将地址“ NO_2” 赋给‘ r1’ r2 = NO_5 // 将地址“ NO_5” 赋给‘ r2

Loop_Muls: mr = [r1]*[r2],us,2 // 操作结果存入 r4: r3 中[NO_7] =r3 // 将结果 ( 低 16位 ) 读入 NO_7 中[NO_8] = r4 // 将结果 ( 高 16位 ) 读入 NO_8 中nop jmp Loop_Muls

应用举例应用举例 : :

Page 70: 凌阳 16 位单片机

70

22、、 FIQ FIQ 中断使能中断使能 // 屏蔽屏蔽

FIQ ON FIQ OFF

功能描述:这组指令用来开通 /关断 FIQ 中断。

Page 71: 凌阳 16 位单片机

71

33、、 IRQ IRQ 中断使能中断使能 // 屏蔽屏蔽

IRQ ON IRQ OFF

功能描述 :这组指令用来开通 /关断 IRQ 中断。

Page 72: 凌阳 16 位单片机

72

44 、允许、允许 // 禁止禁止 FIQFIQ和和 IRQIRQ 中断中断设置设置功能描述:

这组指令用来设置允许 /禁止 FIQ和 IRQ 中断的标志。 应用举例 : INT FIQ; // 允许 FIQ 中断,禁止 IRQ 中断 INT FIQ, IRQ; // 允许 FIQ与 IRQ 中断 INT OFF; // 禁止 FIQ与 IRQ 中断

Page 73: 凌阳 16 位单片机

73

55、、 Fraction ON/OFFFraction ON/OFF

如果 Fraction mode 是使能的,乘法结果会向左移一位。例 :

R1 = 0x0002

R2 = 0x2244

FRACTION OFF

MR = R1 * R2 // MR = 0x00004488

FRACTION ON

MR = R1 * R2 // MR = 0x00008910

Page 74: 凌阳 16 位单片机

74

切换二级寄存器 .

例 : SECBANK ONR1 = 0x1234 // 0x1234 放入 SR1, 而不是 R1R2 = 0x5678 // 0x5678放入 SR2, 而不是 R2

SECBANK OFFR1 = 0x0F0F // 0x0F0F放入 R1, 而不是SR1R2 = 0x0505 // 0x0505放入 R2, 而不是 SR2

66、、 SECBANK ON/OFF SECBANK ON/OFF

Page 75: 凌阳 16 位单片机

75

77 、空操作、空操作

NOP

功能描述:空操作,只是将 PC 指向下一个地址。

Page 76: 凌阳 16 位单片机

76

TEST : 位测试 SETB : 位置位CLRB : 位清除 INVB : 位取反

例子:SETB R1, 15 // R1 的第 15 位置 1CLRB R1, 15 // R1 的第 15 位清除R5 = 1INVB R1, R5 // R5 =1, 因此对 R1第 1 位

取反TEST [R1], 8 // 只改变” Z” 标志

五、位操作指令五、位操作指令

Page 77: 凌阳 16 位单片机

77

它不会被编译,而仅被用来控制汇编器的操作。伪指令可以写在程序文件中的任意位置,但在其前面必须用一个小圆点引导 。

三、’ nSP™ 汇编伪指令

Page 78: 凌阳 16 位单片机

78

Page 79: 凌阳 16 位单片机

79

【语法格式 】 .DEFINE variable [value][,… ]

【功能描述】定义常量符号【举 例】

.DEFINE BODY 1 ;

.DEFINE IO_PORT 0x7016 ;

.IFDEF BODY ;R1=0xFFFF ;[IO_PORT] = R1 ;

.ENDIF

Page 80: 凌阳 16 位单片机

80

【语法格式 】 .PUBLIC label[, label][,… ]

【功能描述】声明将被引用在其它文件中的全局标号 【举 例】

.PUBLIC sym1 // 声明要引用在其它文件中的全局标号

.PUBLIC sym1, sym2 // 声明多个全局标号需用逗号将每一标号分开,空// 格会被忽略。

Page 81: 凌阳 16 位单片机

81

【语法格式 】 .EXTERNAL label[,label][,...]

【功能描述】在某文件中声明已在其它文件里定义过

的标号、变量或函数 【举 例】

.EXTERNAL num_var1; // 声明在其它文件中定义过的标号

.EXTERNAL int SACM_A2000_Initial(); // 声明在其它文件中定义过的函数

Page 82: 凌阳 16 位单片机

82

【语法格式 】 .RAM

【功能描述】切换定义预定义段 SRAM

【举 例】.RAMstart: .DW ? //申请一个整型数据单元.VAR num , max; // 定义变量 num、max

Page 83: 凌阳 16 位单片机

83

【语法格式 】 .SRAM

【功能描述】切换定义预定义段 SRAM

【举 例】.SRAMstart: .DW ? //申请一个 16 位整型数据单元

.VAR sum,name // 定义变量 sum、 name

Page 84: 凌阳 16 位单片机

84

【语法格式 】 .IRAM

【功能描述】切换定义预定义段 IRAM 【举 例】

.IRAM

.VSR sum=0x0001 // 定义变量,并赋初始值为 0x0001

Storage: .DW 0x20 // 在申请的整型数据单元中存放存 0x20

Page 85: 凌阳 16 位单片机

85

【语法格式 】 .ISRAM

【功能描述】切换定义预定义段 ISRAM

【举 例】.ISRAMStorage: .DW 0x20 // 在申请的整型数据单元中存放存 0x20

.VAR sum=0x0020 // 定义变量,并赋初始值为 0x0020

Page 86: 凌阳 16 位单片机

86

【语法格式 】 .ORAM

【功能描述】切换定义预定义段 ORAM

【举 例】.ORAM.VAR num // 定义变量 num

Buf1: .DW 10 DUP(?) //申请 10 个整型的数据单元

Page 87: 凌阳 16 位单片机

87

【语法格式 】 .OSRAM

【功能描述】切换定义预定义段 OSRAM

【举 例】.OSRAM.VAR num //申请一个变量Buf2: .DW ? //申请一个整型的数据单元

Page 88: 凌阳 16 位单片机

88

RAM:用来存放无初始值的变量

I RAM:用来存放具有初始值的变量,并同时被分配空间于ROM RAM及 中。

ORAM: 用来存放无初始值的变量,一个项目里的不同

ORAM目标文件中所有与段同名或同属性的各段会被重叠在一起。当编程者需要在不同的文件里使用相同的变量空间时,适合用本伪指令。(注意:请不要在这里定义全局变量)

2K SRAM

0x0000

0x003F

64字节

0x07FF

Ox0040

SRAM: RAM与 性质基本相同,区别在于链接时它只能在RAM 64中占有前面

0~63( )个字的数据单元

I RAM与 段的性质基本相I SRAM同。区别是 段在

RAM中只能被分配在前64(0~63)面 个字的数据单元

I SRAM:

OSRAM: ORAM与 段的性质基本相OSRAM同。区别是 段在

RAM中只能被分配在前面64(0~63)个字的数据单元

Page 89: 凌阳 16 位单片机

89

【语法格式 】 .VAR variable[=value]

【功能描述】定义变量并为变量置初始值 【举 例】

.RAM

.VAR s1, s2, s3 ; // 无初值

.VAR Flag = 0xFF ; // 有初值

Page 90: 凌阳 16 位单片机

90

【语法格式 】 .DATA

【功能描述】切换定义预定义段 DATA

【举 例】.DATAT _ToneTable: .DW 5,8,6,9,3,8,0 ;

Page 91: 凌阳 16 位单片机

91

【语法格式 】 .CODE

【功能描述】切换定义预定义段 CODE

【举 例】.CODE.PUBLIC _main;

Page 92: 凌阳 16 位单片机

92

【语法格式 】 .TEXT

【功能描述】切换定义预定义段 TEXT

【举 例】.TEXT. PUBLIC _IRQ0_IRQ0: // 中断子程序入口 PUSH R1,R5 TO [SP] NOP POP R1,R5 FROM [SP] RETI

Page 93: 凌阳 16 位单片机

93

32K FLASHROM

0xFFF5

0x8000

中断向量0xFFF6

0xFFFF

TEXT: CODE与 段的性质基本相同。区别是它只能被链接到零页ROM中,且所有与其同名或同属性的各段均会被合并在一起被定位到此。该段主要用于存放中断程序代码。

CODE:所有程序指令和数据都可CODE以存放在 段下

DATA: 程序中所有数据都可以存DATA放在 段的位置上。

Page 94: 凌阳 16 位单片机

94

【语法格式】 Label: .PROC

. ENDP

【功能描述】过程的定义 【举 例】

F_Test: .PROCPUSH BP,BP TO [SP] ;BP=SP+1 ;R1 = [0x7015] ;POP BP,BP FROM [SP] ;RETF ;.ENDP

Page 95: 凌阳 16 位单片机

95

【语法格式 】 Label: .STRUCT

.ENDS

【功能描述】结构的定义【举 例】Person: .STRUCT Xm: .DW ‘joe’

Nl: .DW 20 Xb: .DW ‘boy’

.ENDS

// 定义一个结构‘ Person’ ,它包含三个变量 Xm ,// Nl, Xb ,且分别被初始化为‘ joe’,20,‘boy’

Page 96: 凌阳 16 位单片机

96

【语法格式 】 Label: .MACRO args

.ENDM

【功能描述】宏的定义 【举 例】

Personal_info: .MACRO arg1,arg2,arg3 R1 = arg1+arg2;

.ENDM

Page 97: 凌阳 16 位单片机

97

【语法格式 】 Label: .EQU value

【功能描述】为标号赋值【举 例】

Label: .EQU 10

Page 98: 凌阳 16 位单片机

98

【语法格式 】 Lable: .VDEF value

【功能描述】为标号赋值 【举 例】

int0: .VDEF 0x005F

Page 99: 凌阳 16 位单片机

99

【语法格式 】 Label: .DW [value][,value][,...]

【功能描述】以 16 位整型数据的形式来存储常量或变量 【举 例】

.ISRAMLabel: .DW ‘Hello’,0x000D // 在申请的序列整型数据单元中存放字符串常量//‘Hello’ 的 ASCII 码和整型常量 0x000D

Page 100: 凌阳 16 位单片机

100

【语法格式 】 Label: .DD [value][, value][,… ]

【功能描述】以 32 位长整型数据的形式存储双字常 量或变量【举 例】

label1: .DD 0x0A10 // 存放一个十六进制数 0x0A10

label2: .DD‘High’ //以 4个 32 位长整型数据单元来存放字符串 ‘ High’//的 ASCII码 0x0048 ,

0x0069, 0x0067, 0x0068

Page 101: 凌阳 16 位单片机

101

【语法格式 】 Label: .DOUBLE value[,value][,…]

【功能描述】以双精度浮点型实数数据的形式存储实 数常量或变量 【举 例】

label1: .FLOAT 178.125//把数值 178.125 转换成 0x43322000 格式并存储

label2: .FLOAT 10, 125, -178.125 //把数值 100,125,-178.125 转换成 0x42C80000 ,//0x42FA0000 , 0x0C3322000 格式并存储。

Page 102: 凌阳 16 位单片机

102

【语法格式 】 Label: .DW number DUP(value)

【功能描述】本伪指令与 DW、 FLOAT、 DD 、 DOUBLE 存储类伪指令组合在一起用 于存放若干个具有相同数值的常量;或 者申请若干个备用的整型、单精度浮点 型、长整型以及双精度浮点型数据单元。 【举 例】

Label1: .DW 20 DUP(0) // 存储 20 个值为 0 的整型数据Label2: . FLOAT 7 DUP(0.521) // 存储 7 个值为 0.521 的单精度浮点数

Page 103: 凌阳 16 位单片机

103

【语法格式 】 .END

【功能描述】用来结束程序文件或结束包含文件【举 例】

.END

Page 104: 凌阳 16 位单片机

104

【语法格式 】 .IF value

【功能描述】引出在条件汇编结果为真时所要汇编 的程序指令 。【举 例】

.DEFINE var1 0x01

.IF var1 var2 = var1 + 0x10 ;.ENDIF

Page 105: 凌阳 16 位单片机

105

【语法格式 】 .ELSE

【功能描述】引出 IF 伪指令设置的条件汇编结果为假 时所要汇编的程序指令。 【举 例】

.IF (Cond1) [0x7016] = R1

// 条件表达式 Cond1 结果为真时的若干汇编指令

.ELSE [0x7016] = R2

// 条件表达式 Cond1 结果为假时的若干汇编指令

.ENDIF

Page 106: 凌阳 16 位单片机

106

【语法格式 】 .ENDIF

【功能描述】用来结束条件汇编组合的定义 【举 例】

.IF (Const1) R1 = Const1

.ENDIF // 结束条件汇编

Page 107: 凌阳 16 位单片机

107

【语法格式 】 .IFDEF variable

【功能描述】引出若某变量已被赋过值时所要汇编的 程序指令。【举 例】

.Define name0 = 1 ;

.IFDEF name0 [0x7010] = R1 ;

.ENDIF

Page 108: 凌阳 16 位单片机

108

【语法格式 】 .IFNDEF variable

【功能描述】引出某变量还未被赋值时所要汇编的 程序指令。【举 例】

.IFNDEF SPCE NOP ;

.ELSE [0x7010] = R1 ;

.ENDIF

Page 109: 凌阳 16 位单片机

109

【语法格式 】 .IFMA argument#

【功能描述】引出若指定的宏参量存在时所要汇编 的程序指令 。【举 例】

.IFMA 3 // 如果宏调用参量值表中的第三个参

// 量值存在,则条件结果为真

Page 110: 凌阳 16 位单片机

110

【语法格式 】 .INCLUDE filename

【功能描述】在汇编文件里包含某个文件 【举 例】

.INCLUDE hardware.inc

.INCLUDE key.h

.INCLUDE hardware.h

Page 111: 凌阳 16 位单片机

111

【语法格式 】 label: .SECTION.attribute

【功能描述】创建用户定义段【举 例】

section1: .SECTION .CODE // 定义一个段名为 section1 的段,其链接属性与预

// 定义段 CODE段相同

Page 112: 凌阳 16 位单片机

112

凌阳单片机推广中心竭诚为您服务凌阳单片机推广中心竭诚为您服务

凌阳单片机网站: http://www.sunplusMCU.com 凌阳单片机咨询邮箱: E_mail: [email protected] 凌阳单片机咨询电话: Tel: 010-62981668-2930