第4章 STM8指令系统.ppt
- 文档编号:1093916
- 上传时间:2022-10-16
- 格式:PPT
- 页数:209
- 大小:944KB
第4章 STM8指令系统.ppt
《第4章 STM8指令系统.ppt》由会员分享,可在线阅读,更多相关《第4章 STM8指令系统.ppt(209页珍藏版)》请在冰豆网上搜索。
第4章STM8指令系统,4.1ST汇编语言格式及其伪指令4.2STM8S寻址方式4.3STM8S指令系统,4.1ST汇编语言格式及其伪指令,4.1.1ST汇编常数表示法在缺省情况下,ST汇编语言数制表示方式与Motorola汇编语言格式相同,与Intel汇编语言表示方式不同。
其中,二进制、十六进制、十进制数表示方式如下:
%10100101二进制数表示方式(用“%”作前缀,指示随后的数为二进制数)。
$5A十六进制数表示方式(用“$”作前缀,指示随后的数为十六进制数)。
12十进制数表示方式(没有前、后缀指示符)。
*表示程序计数器PC的当前值。
不过,如果程序员习惯了Intel汇编语言数制表示方式,则可在程序中使用Intel伪指令,指示程序中随后的数据格式采用Intel汇编语言格式表示。
例如:
Intel;指示随后的指令系列采用Intel格式数制即10100101B二进制数表示方式(用“B”作后缀,指示该数为二进制数)。
5AH十六进制数表示方式(用“H”作后缀,指示该数为十六进制数)。
12十进制数表示方式(没有前、后缀指示符)。
$表示程序计数器PC的当前值。
4.1.2ST汇编语言格式ST汇编语言格式与Intel汇编语言格式基本相同,如下所示。
标号:
操作码助记符第一操作数,第二操作数,第三操作数;注释举例:
Next:
ADDA,$10;累加器A与10H单元内容相加,结果保存到A中BTJT$1000,#2,LOOP1;若1000H单元的b2位为1,则跳转到LOOP1标号处执行,操作码助记符是指令功能的英文缩写,必不可少。
例如,用“ADD”作为加法指令的操作码助记符;用“BTJT”作为“位测试为真”转移指令的操作码助记符,“BTJT”就是“BitTestandJumpifTrue”的英文缩写。
指令操作码助记符后是操作数,不同指令所包含的操作数个数不同:
有些指令,如空操作指令“NOP”就没有操作数;有些指令仅含有一个操作数,操作数与操作码之间用“空格”隔开,如累加器A内容加1指令,表示为“INCA”,其中INC为指令操作码助记符,是英文“Increase”的缩写,A是操作数;有些指令含有两个操作数,例如,将立即数55H传送到累加器A中的指令表示为“LDA,#$50”,其中LD是指令操作码助记符,第一操作数为累加器A,第二操作数为“$50”,#表示立即数;有些指令含有三个操作数,如“当某存储单元指定位为1时转移”指令,用“BTJT$1000,#2,LOOP1”表示,其中BTJT是指令操作码助记符,LOOP1是标号,即相对地址。
在多操作数指令中,各操作数之间用“,”(逗号)隔开。
在双操作数指令中,第一操作数有时称为目的操作数,第二操作数有时称为源操作数。
“;”(分号)后的内容是注释信息。
在指令后加注释信息是为了提高程序的可读性,以方便阅读、理解该指令或其以下程序段的功能。
汇编时,汇编程序不理会分号后的注释内容,换句话说,加注释信息不影响程序的汇编和执行,因此,注释信息可以加在指令行后,也可以单独占据一行。
标号是符号化了的地址码,在分支程序中经常用到。
标号由英文字母(大写、小写)、数字(09)及“_”(下划线)构成,最长为30个字符。
注意:
“数字”不能作为标号的第一个字符。
例如,“task1_next1”是合法标号;而“8ye_next1”不是合法标号,原因是首字符为数字8。
另外,在ST汇编中,要严格区分标号的大小写。
在ST汇编中,位于00段内的地址标号后可带“:
”(冒号),也可以不带冒号,且标号一律顶格书写。
标号分为三大类:
公共标号(Public),由本模块定义,在整个项目内有效,项目内另一个模块引用时须用Extern伪指令申明;局部标号,仅在本模块内有效;外部标号(Extern),由另一个模块定义且声明为公共标号。
此外,标号还具有长度属性字节,00页内的标号,带后缀.B;字标号,00段内的标号,带后缀.W;长标号,存放位置没有限制,带后缀.L。
不带后缀长度属性说明符的标号默认为字标号,即.W类型。
4.1.3ST汇编支持的关系运算符ST汇编指令中的常数可以是二进制、十六进制、十进制常数,也可以是表4-1所示的运算符及其组合。
表4-1关系运算符,在表4-1中:
(1)a、b均为非负整数。
(2)当指令中的常数为关系运算式的结果时,必须用“”(花括号)将关系运算符括起来。
例如:
LDA,#HIGH1234H;该指令的含义将1234H常数的高8位12H送ALDWX,#45MULT36;将4536送索引寄存器X(3)由于STM8S汇编指令中没有位赋值指令,因此“布尔运算符”仅出现在条件汇编伪指令中。
4.1.4ST汇编伪指令(Pseudoinstruction)在汇编语言源程序中,除了包含可以转化为特定计算机系统的机器语言指令所对应的汇编语言指令外,还可能包含一些伪指令,如“#define”、“EQU”、“END”等。
“伪”者,假也,尽管它不是计算机系统对应的指令,汇编时也不产生机器码,但汇编语言源程序中的伪指令并非可有可无。
伪指令的作用是:
指导汇编程序(或编译器)对源程序进行汇编。
伪指令不是CPU指令,汇编时不产生机器码。
显然,伪指令与CPU类型无关,而与汇编程序(也称为汇编器或编译器)的版本有关。
在汇编语言源程序中引用某一条伪指令时,只需考虑用于将“汇编语言源程序”转化为对应CPU机器语言指令的“汇编程序”是否支持所用的伪指令。
1)符号常数定义伪指令#define符号常数、寄存器、寄存器中指定位以及I/O引脚重命名等,均可用#define伪指令定义为某一字符串形式。
ST8汇编最多支持4096条#define指令,格式如下:
#define常量名值;位于程序头内,例如:
#defineVAR1$30;常量VAR1为30H如果在程序头中使用下列Define伪指令:
#DefineTELE_DDRPD_DDR,#3;“PD_DDR,#3”被定义为TELE_DDR字符串#DefineTELE_CR1PD_CR1,#3;“PD_CR1,#3”被定义为TELE_CR1字符串#DefineTELE_CR2PD_CR2,#3;“PD_CR2,#3”被定义为TELE_CR2字符串#DefineTELE_InPD_IDR,#3;“PD_IDR,#3”被定义为TELE_In字符串,对PD3引脚控制寄存器、数据输入寄存器进行重命名后,就可以在程序中直接引用,如下所示:
BRESTELE_DDR;与“BRESPD_DDR,#3”指令等效BSETTELE_CR1;与“BSETPD_CR1,#3”指令等效BRESTELE_CR2;与“BRESPD_CR2,#3”指令等效BTJTTELE_In,NEXT1;与“BTJTPD_IDR,#3,NEXT1”指令等效这种做法的好处非常明显,由于某种原因TELE_In信号不从PD3引脚输入,而是从其他引脚输入,则仅需更换程序头中Define指令所指的寄存器名与引脚编号即可。
不过,很少需要在程序中更改引脚输入/输出属性的情况,因此也可以不重定义Px_DDR、Px_CR1、Px_CR2寄存器位,而仅定义数据输出寄存器Px_ODR位(输出引脚)、数据输入寄存器Px_IDR位(输入引脚),如下所示:
;输出引脚BSETPD_DDR,#2;1(输出),输出允许OE/CE,在PD口的b2位BSETPD_CR1,#2;1,互补推挽方式BRESPD_CR2,#2;0,选择低速方式,#defineOE_HT9170PD_ODR,#2;将PD_ODR,#2定义为“OE_HT9170”BSETOE_HT9170;1,开始时OE置为1(允许HT9170解码输出);输入引脚BRESPD_DDR,#7;0(输入),解码有效DV,在PD口的b7位BSETPD_CR1,#7;1,带上拉输入方式BSETPD_CR2,#7;1(允许中断),#DefineDV_HT9170PD_IDR,#7;将“PD_IDR,#7”引脚定义为“DV_HT9170”可以用#define指令定义外设控制寄存器、状态寄存器中的位,提高源程序的可读性。
例如:
#defineRST_SR_IWDGFRST_SR,#1;将“RST_SR,#1”用“RST_SR_IWDGF”字符串取代#defineRST_SR_ILLOPFRST_SR,#2;将“RST_SR,#2”用“RST_SR_ILLOPF”字符串取代由#define定义的符号常量不支持重定义功能,既不能用另一条#define指令再定义同一字符常量,也不能用EQU伪指令再赋值。
2)EQU与CEQU伪指令用EQU(不支持重定义)以及CEQU(可重定义)伪指令可以定义标号常量与变量,按标号定义与书写。
在ST8汇编中,将EQU、CEQU定义的常量、变量视为标号。
例如:
var2EQU$30;把var2定义为30H,var2,既可以视为常量,也可以视为变量。
作变量时,是;RAM还是ROM存储单元,与EQU后指定的数值有关LDA,#var2;立即数寻址,作常量,LDA,var2;直接寻址,即存储单元地址,视为变量。
该指令与“LDA,$30”指令等效CEQU伪指令用法与EQU相似,唯一区别是用CEQU定义的标号常数、变量允许用另一条“CEQU”伪指令重新定义。
由EQU、CEQU伪指令定义的标号常量、变量可以放在RAM、ROM、EEPROM段中,不过最好放在程序头部分。
3)标号属性说明伪指令PUBLIC与EXTERN无论是常量、变量定义标号,还是程序中转移目标地址标号,均存在三个属性:
标号长度(字节标号、字标号、长标号)、作用范围(局部标号、全局标号以及外部标号)、关联性(绝对标号与相对标号)。
标号长度属性可用“.B”(字节标号)、“.W”(字标号)、“.L”(长标号,三个字节)后缀符逐一指定,如下所示:
Labe_2.bEQU$30;字节标号Labe_1.wEQU$30;等同于“Labe_1EQU$30”,字标号,Labe_2.LEQU$1230;长标号(三字节)也可以用“Bytes”、“Words”或“Longs”伪指令指定多个同一种长度类型标号,如下所示:
BytesR00DS.B1R01DS.B1R02DS.B1WordsR10DS.B1R11DS.B1R12DS.B1,凡是没有特别说明的标号,均属于局部标号,只在本模块内有效。
对于全局标号,须用“PUBLIC”伪指令说明或“.label”(带前缀.)声明。
例如:
PUBLICtask_1;用BUPLIC伪指令声明.task_1;直接用前缀点“.”定义全局标号task_1(推荐使用这种方式).task_2;直接用前缀点“.”定义全局标号task_2本模块调用另一个模块定义的全局标号,应在模块头用“EXTERN”伪指令说明该标号来自另一个模块。
例如:
EXTERNtask_1,task_2;说明这两个标号来自另一个模块绝对标号常用于定义常量,程序没有汇编时,标号的值是确定的,如用EQU或#define指令定义的常量标号。
相对标号包括转移指令中的标号、在RAM或EEPROM存储区内用DS(DS.B、DS.W、DS.L)伪指令定义的变量,相对标号的值,即对应的存储单元地址,必须经过编译、连接后才能确定。
4)标号长度定义伪指令位于特定段内的标号地址长度可以是Byte、Word、Long,缺省时标号地址长度为Word,可以重新指定标号的地址长度。
例如,在起始地址为0100的RAM段中,标号地址长度为16位,可以用Long指定为24位(3字节)。
例如:
segmentram1Variable.L;标号Variable的长度定义为long(后缀.L)dc.b$50不能在起始地址为0100H的段内将标号定义为Byte,原因是其物理地址至少为16位;同理,不能将位于10000H单元后的标号定义为.W类型,原因是其物理地址为24位,只能定义为.L类型。
3段定义伪指
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第4章 STM8指令系统 STM8 指令系统
![提示](https://static.bdocx.com/images/bang_tan.gif)