ST7 汇编

来源:互联网 发布:mac python开发环境 xp 编辑:程序博客网 时间:2024/06/05 19:34

       ST7汇编语言指令详细内容可参阅ST7 Programming User Manual,这里仅解释一些在编程过程中较容易被忽视的问题。

 

ST7 Core

       ST7 MCU核有一个8ALU,支持17种主要的寻址模式、63条指令;18位累加器(A)28位索引寄存器(XY)116位堆栈指针(SP)116位程序计数器(PC)1个状态寄存器(CC)

       状态寄存器(CC)含有四种标志位。

              H(CC[4])    半进位标志;

              I (CC[5,3]) 中断屏蔽位;

              N(CC[2])    符号标志位;

              Z(CC[1])    零标志位;

              C(CC[0])    借位/进位标志位;

 

索引寄存器(XY)可作为一般的寄存器使用,在对变址模式下寻址时可指向相对索引的地址。需要注意的是在中断发生是自动压栈,X寄存器内容将会被自动压栈,但Y寄存器内容不会自动压栈!

 

堆栈指针(SP)总是指向堆栈的底部。当数据被压栈后,SP值减小;当数据出栈,SP值增加。对于ST7324SP的高八位(SPH)始终为0x01H,低八位(SPL)0x00H0xFFH变化。因此ST72324的堆栈深度为256Bytes,堆栈指针复位为0x01FFH。需要注意ST7没有提供堆栈溢出的标志位,当SP指针超过地址的下限时(0x0100H),堆栈指针会重新覆盖堆栈地址上限(0x01FFH),用户应该在程序设计时确保堆栈不会溢出。

 

Memory Map

       使用了冯.诺曼结构,线性地址,同一地址对应唯一空间。与51的地址数据复用模式不同(2.12)

2.12   ST7 Memory Map

 

       ST7系列MCU的中断向量都是安排在0xFFFFH0xFFE0HRAM[0x0080H0x0480H]空间包含了短寻址RAM(0)区、0x1000H0x01FFH256字节硬件堆栈空间、0x0200H0x047FH16位寻址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之后请保留几个空格和一个回车符,否则编译会出错。

 

 

  

 
原创粉丝点击