ST7汇编语言指令详细内容可参阅ST7 Programming User Manual,这里仅解释一些在编程过程中较容易被忽视的问题。
ST7 Core
ST7 MCU核有一个8位ALU,支持17种主要的寻址模式、63条指令;1个8位累加器(A);2个8位索引寄存器(X、Y);1个16位堆栈指针(SP);1个16位程序计数器(PC),1个状态寄存器(CC)。
状态寄存器(CC)含有四种标志位。
H(CC[4]): 半进位标志;
I (CC[5,3]): 中断屏蔽位;
N(CC[2]): 符号标志位;
Z(CC[1]): 零标志位;
C(CC[0]): 借位/进位标志位;
索引寄存器(X、Y)可作为一般的寄存器使用,在对变址模式下寻址时可指向相对索引的地址。需要注意的是在中断发生是自动压栈,X寄存器内容将会被自动压栈,但Y寄存器内容不会自动压栈!
堆栈指针(SP)总是指向堆栈的底部。当数据被压栈后,SP值减小;当数据出栈,SP值增加。对于ST7324,SP的高八位(SPH)始终为0x01H,低八位(SPL)在0x00H到0xFFH变化。因此ST72324的堆栈深度为256Bytes,堆栈指针复位为0x01FFH。需要注意ST7没有提供堆栈溢出的标志位,当SP指针超过地址的下限时(0x0100H),堆栈指针会重新覆盖堆栈地址上限(0x01FFH),用户应该在程序设计时确保堆栈不会溢出。
Memory Map
使用了冯.诺曼结构,线性地址,同一地址对应唯一空间。与51的地址数据复用模式不同(图2.12)。
图2.12 ST7 Memory Map
ST7系列MCU的中断向量都是安排在0xFFFFH~0xFFE0H,RAM[0x0080H~0x0480H]空间包含了短寻址RAM(0页)区、0x1000H~0x01FFH的256字节硬件堆栈空间、0x0200H~0x047FH的16位寻址RAM空间。
寻址模式
Inherent (隐含寻址)
Examples: NOP
Immediate (立即寻址)
Examples: LD A, #$55 ;将十六位立即数55送入A中
Direct(直接寻找)
Examples: LD A, $55 ;将十六位地址55中的立即数送入A
Indexed(索引寻址)
Examples: LD A, ($55, X) ;
Indirect(间接寻址)
Examples: LD A,([$55], X) ;
Relative(相对寻址)
Examples: JRNE Loop ;
Bit operation(位操作)
Examples: BEST Byte, #5 ;将Byte的第六位置一。
ST7 汇编语言格式
标号: 操作码 操作数 ;注释
LP: LD A,#20 ;20àA
1、 标号一定要顶格书写,标号后加“:”或“.”都可以,也可以不加,但一定要在标号后面加一空格;
2、 操作数之间一点需要加入“,”将源操作数与目的操作数分开;
ST7汇编指令集:
指令
描述
功能/例子
目标
源
影响标志位
H
I
N
Z
C
ADC
Add with Carry
A = A + Mem + C
A
Mem
H
N
Z
C
ADD
Addition
A = A + Mem
A
Mem
H
N
Z
C
AND
Logical And
A = A . Mem
A
Mem
N
Z
BCP
Bit compare A, Memory
TST (A . Mem)
A
Mem
N
Z
BRES
Bit Reset
BRES Byte, #3
Mem
BSET
Bit Set
BEST Byte, #3
Mem
BTJF
Jump if bit is false (0)
BTJF Byte, #3, Jmp1
Mem
C
BTJT
Jump if bit is true (1)
BTJT Byte, #3, Jmp1
Mem
C
CALL
Call subroutine
CALLR
Call subroutine relative
CLR
Clear
reg, Mem
0
1
CP
Arithmetic Compare
TST(Reg - Mem)
reg
Mem
N
Z
C
CPL
One Complement
A = FFH-A
reg, Mem
N
Z
1
DEC
Decrement
DEC Y
reg, Mem
N
Z
HALT
Halt
0
IRET
Interrupt routine return
Pop CC, A, X, PC
H
I
N
Z
C
INC
Increment
INC X
reg, Mem
N
Z
JP
Absolute Jump
JP [TBL.w]
JRA
Jump relative always
JRT
Jump relative
JRF
Never jump
JRF
JRIH
Jump if Port INT pin = 1
(no Port Interrupts)
JRIL
Jump if Port INT pin = 0
(Port interrupt)
JRH
Jump if H = 1
H = 1 ?
JRNH
Jump if H = 0
H = 0 ?
JRM
Jump if I = 1
I = 1 ?
JRNM
Jump if I = 0
I = 0 ?
JRMI
Jump if N = 1 (minus)
N = 1 ?
JRPL
Jump if N = 0 (plus)
N = 0 ?
JREQ
Jump if Z = 1 (equal)
Z = 1 ?
JRNE
Jump if Z = 0 (not equal)
Z = 0 ?
JRC
Jump if C = 1
C = 1 ?
JRNC
Jump if C = 0
C = 0 ?
JRULT
Jump if C = 1
Unsigned <
JRUGE
Jump if C = 0
Jump if unsigned >=
JRUGT
Jump if (C + Z = 0)
Unsigned >
JRULE
Jump if (C + Z = 1)
Unsigned <=
续ST7汇编指令集:
指令
描述
功能/例子
目标
源
影响标志位
H
I
N
Z
C
LD
Load
dst <= src
reg, Mem
Mem, reg
N
Z
MUL
Multiply
X,A = X * A
A, X, Y
X, Y, A
0
0
NEG
Negate (2's compl)
NEG $10
reg, Mem
N
Z
C
NOP
No Operation
OR
OR operation
A = A + Mem
A
Mem
N
Z
POP
Pop from the Stack
POP reg POP CC
reg CC
Mem Mem
H
I
N
Z
C
PUSH
Push onto the Stack
PUSH Y
Mem
reg, CC
RCF
Reset carry flag
C = 0
0
RET
Subroutine Return
RIM
Enable Interrupts
I = 0
0
RLC
Rotate left true C
C <= A <= C
reg, Mem
N
Z
C
RRC
Rotate right true C
C => A => C
reg, Mem
N
Z
C
RSP
Reset Stack Pointer
S = Max allowed
SBC
Subtract with Carry
A = A - Mem - C
A
Mem
N
Z
C
SCF
Set carry flag
C = 1
1
SIM
Disable Interrupts
I = 1
1
SLA
Shift left Arithmetic
C <= A <= 0
reg, Mem
N
Z
C
SLL
Shift left Logic
C <= A <= 0
reg, Mem
N
Z
C
SRL
Shift right Logic
0 => A => C
reg, Mem
0
Z
C
SRA
Shift right Arithmetic
A7 => A => C
reg, Mem
N
Z
C
SUB
Substraction
A = A - Mem
A
Mem
N
Z
C
SWAP
SWAP nibbles
A7-A4 <=> A3-A0
reg, Mem
N
Z
TNZ
Test for Neg & Zero
tnz lbl1
N
Z
TRAP
S/W trap
S/W interrupt
1
WFI
Wait for Interrupt
0
XOR
Exclusive OR
A = A XOR Mem
A
M
N
Z
ST7汇编文件格式
下列为ST7汇编文件格式参考:
st7/ ;(1)
TITLE "test.asm" ;(2)
MOTOROLA ;(3)
#INCLUDE "st72324.inc" ; Include st72324 registers and memory mapping file. ;(4)
#INCLUDE "userdef.inc" ;扩展外部定义文件
segment 'ram' ;RAM Segment ;(5)
#Define ;(6)
Data EQU 100
;************RAM0 SEGMENT************
WORDS ; following addresses are 16 bit length. ;(7)
segment 'rom' ;Program Code ;(8)
;------- Main Program Sub-Routine Section ----------
.main ;Initialization ;(9)
RSP ;Reset Stack Pointer
.Loop
NOP
JP Loop
.Dummy_rt ;(10)
IRET
;---------Interrupt & Reset Vectors-------------------
segment 'vectit' ;(11)
DC.W Dummy_rt ; FFE0-FFE1h location
DC.W Dummy_rt ; FFE2-FFE3h location
AVD:
DC.W Dummy_rt ; FFE4-FFE5h location
SCI:
DC.W Dummy_rt ; FFE6-FFE7h location
Timer_B:
DC.W Dummy_rt
Timer_A:
DC.W Dummy_rt
SPI:
DC.W Dummy_rt ; FFEC-FFEDh location
DC.W Dummy_rt ; FFEE-FFEFh location
Port_B_1:
DC.W PortB_INT ; FFF0-FFF1h location
Port_B_2:
DC.W Dummy_rt ; FFF2-FFF3h location
Port_F:
DC.W Dummy_rt ; FFF4-FFF5h location
Port_A:
DC.W Dummy_rt ; FFF6-FFF7h location
Time_RTC:
DC.W Dummy_rt ; FFF8-FFF9h location
DC.W Dummy_rt ; FFFA-FFFBh location
TRAP_1:
DC.W Dummy_rt ; FFFC-FFFDh location
Reset:
DC.W main ; FFFE-FFFFh location
END ;(12)
说明:
st7/ ;(1)
TITLE "test.asm" ;(2)
MOTOROLA ;(3)
代码中数字的表达方式。ST7汇编编译器提供下述四种格式的支持:
进制
INTEL
MOTOLORA
TEXAS
ZILOG
二进制
1010B
%1010
?1010
%(2)1010
八进制
175O
-175
-175
%(8)175
十六进制
45H or 0FFH
$45 or $FF
>45 or >FF
%45 or %FF
将MOTOROLA改为你习惯的格式代码即可。
#INCLUDE "st72324.inc" ; Include st72324 registers and memory mapping file. ;(4)
伪指令(Include)
用于包含外部定义文件。上述定义为提供给编译器的MCU特殊功能寄存器文件。可通过打开SDVP7安装路径下的“C:\Program Files\STMicroelectronics\st7toolset\include”找到(路径为默认定义路径)。
segment 'ram' ;RAM Segment ;(5)
伪指令(Segment)
用于定义可寻址空间的一个地址范围,具有可被定义的属性。一个程序模块中最多可以定义128个段,可允许的类型有:
名称
类型
ROM
只读存储器,用于程序存储区
RAM0
读写存储器,用于8位地址区
RAM1
读写存储器,用于16位地址区
STACK
读写存储器,用于堆栈
IO
用于IO寄存器(地址在0页)
VECTOR
中断矢量地址区
段允许将一段代码定义在以某一其实地址开始底空间,也允许定义一部分变量集中放置到某一个RAM范围内。
#Define ;(6)
Data EQU 100
伪指令(Define/EQU)
Define:给符号常量赋字符串值;
EQU: 对符号常数赋值,赋值后值不可跟改;
WORDS ; following addresses are 16 bit length ;(7)
起始地址是偶数
segment 'rom' ;Program Code ;(8)
段定义,表明一下代码内容在下一个“segment”之前均位于“ROM”区
.main ;Initialization ;(9)
标号,ST汇编编译器最大支持标号字符数为26。
.Dummy_rt ;(10)
异常中断函数入口。这里出于对系统的健壮性考虑,建议对于系统中并未使用的中断,都使用一个同样的异常中断函数,由于异常进入时,做中断退出。
segment 'vectit' ;(11)
段定义,表明下列代码为中断向量部分内容。
END ;(12)
汇编结束指令,这里需要注意的是在END之后请保留几个空格和一个回车符,否则编译会出错。 |
|