打印
[其他ST产品]

ST7汇编语言【转】

[复制链接]
4484|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gxgclg|  楼主 | 2010-9-24 16:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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之后请保留几个空格和一个回车符,否则编译会出错。
沙发
秋天落叶| | 2010-9-24 21:26 | 只看该作者
还不错,就是编排的不够好,看起来有点费劲

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

177

主题

1653

帖子

1

粉丝