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