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之后请保留几个空格和一个回车符,否则编译会出错。