STM8 汇编学习笔记2: 开发环境

发布者:石头上种庄稼最新更新时间:2020-06-20 来源: eefocus关键字:STM8  汇编学习  开发环境 手机看文章 扫描二维码
随时随地手机看文章

写在前面

  就我所知,STM8的开发平台有两种:意法官方的STVD和IAR for STM8. STVD没尝试过。反正IAR用的感觉还凑合,各种该有的功能都有,但界面不怎么友好。估计是低版本的缘故,由于我长时间盯着屏幕眼睛酸痛,所以没办法只能把编辑界面底色改成黑色,可TM怎么行号编程白色的了?根本看不清。看不清就不看了呗,反正也没啥用。但是就是感觉超不爽。而且字体显示不知道怎么搞的,在缩放的时候就变得特别奇怪,跟手写的一样。


相关资料

  如之前所述,官方的永远是最好的,没有谁比创造者更了解他的产品了。

在这里插入图片描述

环境设置

  俗话说,站在巨人的肩膀上能看得更远。学习汇编也是一样,先看代码。但是由于汇编对于不同的芯片差异很大,网络上也很难找到资源。怎么办呢?最好的办法是去看看编译环境是怎么把c语言转换成汇编的。但是默认情况下,编译结果是不会自动跑到workspace的。所以需要作如下设置:

1. workspace右键选’options…'或单击Project菜单选择’options…'打开工程选项

2. 选择 ‘C/C++ Compiler’,在 ‘List’ 选项卡中选择 ‘Output assembler file’,并选择其子选项 'Include source’

  ‘Output assembler file’ 是为了让编译器输出汇编的编译结果,‘Include source’ 可以把对应的C语言标在每段汇编前,这样有助于理解每段汇编的含义。如果想看到全部汇编信息,请将 ‘Include all call frame information’ 勾选。

3. 还是在 ‘Options…’ => ‘C/C++ Compiler’ 中,选择 ‘Optimization’ 选项卡,优化等级选择 ‘Low’ 或 'None’

  选择优化等级的原因是,在高等级的优化中,C语言和汇编的对应关系不是特别明显,有的时候会把十几行代码一起优化掉,虽然结果相同,但是你很难去用自己写的时候的思路去理解生成的代码,而且有的时候会把你的代码逻辑彻底变掉。之前就遇到过这种情况,初始化的时候本来想用查表法去对参数赋初值,结果发现改Flash里面的数据根本不会影响运行结果。把汇编打开之后,发现居然把从Flash取值的指令直接优化成立即数寻址。唉,不得不感慨编译器不懂我啊。当然还有其他更好的办法解决,之后会讲到。


  完成以上设置之后,去编译你的工程,你会发现在每个c文件下多了个Output文件夹,点开后,里面有一个 ‘.s’ 文件,这个里面就是编译得到的汇编结果。 

在这里插入图片描述
在这里插入图片描述

汇编语言结构

  做完上述设置之后,编译完打开 ‘.s’ 文件,你会看到如下格式的代码:


        RTMODEL "__SystemLibrary", "DLib"

        RTMODEL "__code_model", "small"

        RTMODEL "__core", "stm8"

        RTMODEL "__data_model", "medium"

        RTMODEL "__rt_version", "4"


        EXTERN ?b0

        EXTERN ?b1

        EXTERN ?w0

        EXTERN ?w1


        PUBLIC array

        PUBLIC main

        PUBLIC val

        

          CFI Names cfiNames0

          CFI StackFrame CFA SP DATA

          CFI Resource A:8, XL:8, XH:8, YL:8, YH:8, SP:16, CC:8, PC:24, PCL:8

          CFI Resource PCH:8, PCE:8, ?b0:8, ?b1:8, ?b2:8, ?b3:8, ?b4:8, ?b5:8

          CFI Resource ?b6:8, ?b7:8, ?b8:8, ?b9:8, ?b10:8, ?b11:8, ?b12:8, ?b13:8

          CFI Resource ?b14:8, ?b15:8

          CFI ResourceParts PC PCE, PCH, PCL

          CFI EndNames cfiNames0

        

          CFI Common cfiCommon0 Using cfiNames0

          CFI CodeAlign 1

          CFI DataAlign 1

          CFI ReturnAddress PC CODE

          CFI CFA SP+2

          CFI A Undefined

          CFI XL Undefined

          CFI XH Undefined

          CFI YL Undefined

          CFI YH Undefined

          CFI CC Undefined

          CFI PC Concat

          CFI PCL Frame(CFA, 0)

          CFI PCH Frame(CFA, -1)

          CFI PCE SameValue

          CFI ?b0 Undefined

          CFI ?b1 Undefined

          CFI ?b2 Undefined

          CFI ?b3 Undefined

          CFI ?b4 Undefined

          CFI ?b5 Undefined

          CFI ?b6 Undefined

          CFI ?b7 Undefined

          CFI ?b8 SameValue

          CFI ?b9 SameValue

          CFI ?b10 SameValue

          CFI ?b11 SameValue

          CFI ?b12 SameValue

          CFI ?b13 SameValue

          CFI ?b14 SameValue

          CFI ?b15 SameValue

          CFI EndCommon cfiCommon0

        

// E:socexample_emptymain.c

//    1 #include "Untitled1.h"

//    2 typedef enum {FALSE = 0, TRUE = !FALSE} bool;


        SECTION `.near.bss`:DATA:REORDER:NOROOT(0)

//    3 int val;

val:

        DS8 2


        SECTION `.near.data`:DATA:REORDER:NOROOT(0)

//    4 int array[10] = {1,33,2,6,8,9,4,45,8,0};

array:

        DC16 1, 33, 2, 6, 8, 9, 4, 45, 8, 0


        SECTION `.near_func.text`:CODE:REORDER:NOROOT(0)

          CFI Block cfiBlock0 Using cfiCommon0

          CFI Function main

        CODE

//    5 int main( void )

//    6 {

//    7   int i = 0;

main:

        CLR       S:?b1

        CLR       S:?b0

//    8   int buf;

//    9   bool flag = TRUE;

        LD        A, #0x1

        JRA       L:??main_0

//   10   while(1)

//   11   {

//   12     if(array[i] > array[i+1])

//   13     {

//   14       buf = array[i];

//   15       array[i] = array[i+1];

//   16       array[i+1] = buf;

//   17       flag = FALSE;

//   18     }

//   19     if(i == 9)

//   20     {

//   21       if(flag)

//   22       {

//   23         break;

//   24       }

//   25       i = 0;

??main_1:

        CLR       S:?b1

        CLR       S:?b0

??main_0:

        LDW       X, S:?w0

        SLLW      X

        ADDW      X, #array + 2

        LDW       X, (X)

        LDW       S:?w1, X

        LDW       X, S:?w0

        SLLW      X

        ADDW      X, #array

        LDW       Y, X

        LDW       X, S:?w1

        CPW       X, (Y)

        JRSGE     L:??main_2

        LDW       X, S:?w0

        SLLW      X

        LDW       X, (L:array,X)

        LDW       S:?w1, X

        LDW       X, S:?w0

        SLLW      X

        ADDW      X, #array + 2

        LDW       X, (X)

        LDW       Y, X

        LDW       X, S:?w0

        SLLW      X

        LDW       (L:array,X), Y

        LDW       X, S:?w0

        SLLW      X

        LDW       Y, S:?w1

        ADDW      X, #array + 2

        LDW       (X), Y

        SUBW      X, #array + 2

        CLR       A

??main_2:

        LDW       X, S:?w0

        CPW       X, #0x9

        JRNE      L:??main_0

        TNZ       A

        JREQ      L:??main_1

//   26     }

//   27 

//   28   }

//   29   return 0;

        CLRW      X

        RET

//   30 }

          CFI EndBlock cfiBlock0


        SECTION VREGS:DATA:REORDER:NOROOT(0)


        END

// 

//  2 bytes in section .near.bss

// 20 bytes in section .near.data

// 84 bytes in section .near_func.text

// 


  具体含义简单介绍一下:


1. 运行模型结构(Runtime model attributes)

  这类东西基本找不到官方的翻译,那就按字面上的意思咯。它主要是对程序整体的一些基础设置,一般要保持代码中所有汇编文件保持一致。在自己写汇编时可加可不加。如果要加的话一定要从同工程下别处原样复制过来,一个符号都不要改


        RTMODEL "__SystemLibrary", "DLib" //基础库,包括C和C++所必需的头文件

        RTMODEL "__code_model", "small" //代码量,代表寻址空间

        //"small"  ->最大16KB寻址空间

        //"medium" ->最大16MB寻址空间,但函数代码地址不允许超过64KB边界

        //"large"  ->最大16MB寻址空间,函数代码地址允许超过64KB边界

        RTMODEL "__core", "stm8" //芯片型号,只能是"stm8"

        RTMODEL "__data_model", "medium" //详见帮助文档

        RTMODEL "__rt_version", "4" //同个程序RTMODEL改变时,版本号相应改变


2. 标号声明(Symbol control)

[1] [2] [3]
关键字:STM8  汇编学习  开发环境 引用地址:STM8 汇编学习笔记2: 开发环境

上一篇:[STM8学习笔记] IAR工程搭建笔记
下一篇:STVD配置

推荐阅读最新更新时间:2024-10-26 18:44

STM8 汇编学习笔记2: 开发环境
写在前面   就我所知,STM8的开发平台有两种:意法官方的STVD和IAR for STM8. STVD没尝试过。反正IAR用的感觉还凑合,各种该有的功能都有,但界面不怎么友好。估计是低版本的缘故,由于我长时间盯着屏幕眼睛酸痛,所以没办法只能把编辑界面底色改成黑色,可TM怎么行号编程白色的了?根本看不清。看不清就不看了呗,反正也没啥用。但是就是感觉超不爽。而且字体显示不知道怎么搞的,在缩放的时候就变得特别奇怪,跟手写的一样。 相关资料   如之前所述,官方的永远是最好的,没有谁比创造者更了解他的产品了。 环境设置   俗话说,站在巨人的肩膀上能看得更远。学习汇编也是一样,先看代码。但是由于汇编对于不同的芯片差异很大,网络
[单片机]
<font color='red'>STM8</font> <font color='red'>汇编</font><font color='red'>学习</font>笔记2: <font color='red'>开发环境</font>
STM8 汇编学习笔记2: 开发环境
写在前面 就我所知,STM8的开发平台有两种:意法官方的STVD和IAR for STM8. STVD没尝试过。反正IAR用的感觉还凑合,各种该有的功能都有,但界面不怎么友好。估计是低版本的缘故,由于我长时间盯着屏幕眼睛酸痛,所以没办法只能把编辑界面底色改成黑色,可TM怎么行号编程白色的了?根本看不清。看不清就不看了呗,反正也没啥用。但是就是感觉超不爽。而且字体显示不知道怎么搞的,在缩放的时候就变得特别奇怪,跟手写的一样。 相关资料 如之前所述,官方的永远是最好的,没有谁比创造者更了解他的产品了。 环境设置 俗话说,站在巨人的肩膀上能看得更远。学习汇编也是一样,先看代码。但是由于汇编对于不同的芯片差异很大,网络上也很难找到
[单片机]
<font color='red'>STM8</font> <font color='red'>汇编</font><font color='red'>学习</font>笔记2: <font color='red'>开发环境</font>
STM8 汇编学习笔记1:CPU简介
写在前面   最近项目中涉及到一些实时性要求很高的底层驱动设计,在IAR下用C语言写完后总是感觉响应不是足够快,平时在网上会看到很多嵌入式大牛直接通过汇编来写,效果超级明显。之前在学校里接触过51的汇编,感觉又low又难懂。随着时间的推移,越来越有一种潜意识,觉得高级程序虽然有着开发效率高的特点,但有一些地方的局限还是很多大的,如果想要继续深入地了解和运用一些单片机底层的资源,能且只能通过汇编来实现。现在工作中接触的MCU主要是STM8系列,所以就从他开始吧! STM8 简介   意法半导体的这款8位单片机一直知名度不高,在上学时,一般耳熟能详的八位机都有PIC、51、AIR之类,STM系列也只听说过STM32,工作后接触到S
[单片机]
<font color='red'>STM8</font> <font color='red'>汇编</font><font color='red'>学习</font>笔记1:CPU简介
STM8汇编学习
STM8 CPU中的寄存器只有6个,即A、X、Y 、SP、 PC 、CC。 完成内存种的2个8位无符号数相加,结果还保存到内存中。 unsigned char a,b,c; c = a + b; STM8汇编如下: LD A,$1000 ADD A,$1001 LD $1002,A 这里假设a,b,c这3个变量分别存储在内存中,地址为1000,1001,1002。 static @inline void jump_to_new_prog(void) 远程升级部分汇编代码 { _asm( LDW X, SP ); _asm( LD A, $FF ); _asm( LD XL, A ); _asm(
[单片机]
单片机---STM8开发环境搭建与标准库工程创建
背景说明 手头有一个单片机的Lora模块,之前也用来开发了一个DTU和温度采集产品,但是对于单片机开发的整个流程,并没有特别清楚,只是用了官方提供的模块代码,增加了温度采集和modbus数据采集过程,并且增加了一些数据传输,加密解密的过程,主要集中在了代码的修改上。对于开发环境及工程搭建这里,并没有深入研究,所以今天来尝试一下,弄一个干净的编译环境及工程。 开发环境 这里用的软件是IAR ,可以自己去官网下载再注册,也可以下载此处的版本 网盘:提取码s2ro 安装过程就是比较简单了,下一步,继续,继续,……,就完事了 整个过程可以参考 安装过程 注册的过程稍微繁琐一点,不过为了免费,还是要耐心一点。 编译环境 ST芯片
[单片机]
单片机---<font color='red'>STM8</font><font color='red'>开发环境</font>搭建与标准库工程创建
STM8,STVD,Cosmic开发环境下,是大端模式还是小端模式?
因为需要把32位的序列号烧录到内部EEPROM中,所以需要知道烧录器烧录的格式是大端还是小端,因为程序需要用到序列号,所以也需要知道具体的开发环境下,是大端模式还是小端模式。 经过测试,STM8S,在STVD,COSMIC开发环境下,是大端模式,即数据的高位字节存储在低字节中。
[单片机]
STVD+Cosmic搭建STM8开发环境
1、在官网下载STVD并安装 因为STVD只支持汇编语言,还需要安装Cosmic编译器来支持C语言 2、到官网下载Cosmic并安装 在官网上注册一下,获取1年的免费使用license 3、在STVD上配置Cosmic路径
[单片机]
STVD+Cosmic搭建<font color='red'>STM8</font><font color='red'>开发环境</font>
STM8开发环境搭建(STVD + COSMIC)
一、STM8开发IDE 1. STVD + COSMIC ST Visual Develop (STVD)只支持汇编开发,C语言开发需要再安装COSMIC,配套起来使用。 2. IAR IAR也可以用来开发STM8 下面介绍STVD + COSMIC的搭建方式 二、环境搭建 1. STVD下载、安装 直接从官网下载: https://www.st.com/en/development-tools/stvd-stm8.html 安装很简单,基本下一步往下点。 2. COSMIC下载、安装 对于stm8可以使用32K免费使用权限,每台电脑是1年,以及16K的限制权限,需要使用邮件获取license.lic文件。 下载
[单片机]
<font color='red'>STM8</font><font color='red'>开发环境</font>搭建(STVD + COSMIC)
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved