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

发布者:中原读书客最新更新时间:2020-02-01 来源: 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]
关键字:STM8  汇编学习  开发环境 引用地址:STM8 汇编学习笔记2: 开发环境

上一篇:STM8S汇编代码分析
下一篇:STM8 symbol _assert_failed not defined (Debugstm8s_adc1.o )

推荐阅读最新更新时间:2024-11-13 12:02

汇编入门学习笔记 (六)—— si、di,双重循环
疯狂的暑假学习之 汇编入门学习笔记 (六) si、di,双重循环 参考: 《汇编语言》 王爽 第7章 1. and和or指令,与 and和or,就不多说了。 这样写是可以的,某些情况下,比较方便。 也可以写成 idata 直接见例子: 把 ABcde 跟 fGHig 都改成大写(ASCII中大写字母与小写字母二进制中,只有第五位不同,大写字母是0,小写字母是1) assume cs:code,ds:data data segment db 'ABcde' db 'fGHIg' data ends co
[单片机]
UltraSoC获晶心科技选用于RISC-V开发的追踪及调试
UltraSoC日前宣布:亚洲领先且成熟的中央处理器半导体知识产权(CPU IP)供应商晶心科技(Andes Technology)已采用UltraSoC先进的嵌入式分析技术,来支持其AndesCore系列RISC-V处理器。晶心科技将利用UltraSoC包括业界唯一商用RISC-V处理器追踪解决方案在内的独一无二的IP产品系列,来实现其复杂应用嵌入式产品的开发加速和调试增强,这些应用包括人工智能(AI)、计算机视觉、网络控制器和存储等。 两家公司将携手在即将举行的RISC-V大会(RISC-V Workshop,将于5月7-10日在西班牙的加泰罗尼亚理工大学举办)上,展出一套完整的RISC-V开发、调试和追踪设计流程。 Ul
[半导体设计/制造]
Xilinx专为数据中心加速设计的软件定义开发环境上线AWS
赛灵思公司(Xilinx, Inc.,(NASDAQ:XLNX))今天宣布其软件定义开发环境SDAccel现已上线亚马逊AWS,可与亚马逊弹性计算云(Amazon EC2)F1实例配合使用。Amazon EC2 F1实例借助赛灵思16nm Virtex®UltraScale+™FPGA,可提供可重配置的定制硬件加速功能,能够满足数据分析、视频处理和机器学习等计算密集型工作负载的种种需求。 随着面向Amazon EC2 F1实例的SDAccel开发环境的部署,使不太熟悉FPGA的软件开发人员现在也能够将工作负载的性能提升高达50倍之多。 SDAccel通过为Amazon EC2 F1构建专用的FPGA内核,可以自动加速使用C
[嵌入式]
关于使用stvp和IAR软件stlink下载stm8程序失败问题
最近要产200个stm8设计的设备,使用STVP和stlink工具下载软件程序,程序为.hex文件,交给某工厂后焊接,下载,测试,结果在下载那一环节出现了问题,使用stlink下载没几个连续不能超过10次,stlink莫名其妙的就不能下载了,断电,重启,有时候能用,有时候真的就不能用了提示信息如下图, Failed to initialize communcation with hardware: SWIM error : Detected hardware not compatible with software 然后网上搜索各种答案。 答案1:stlink里边有一个4脚电源芯片烧坏,更换它可以使用。 答案2:stlink驱
[单片机]
关于使用stvp和IAR软件stlink下载<font color='red'>stm8</font>程序失败问题
关于STM8的程序下载问题:SWIM Error[30006]报错解决办法汇总
本人也是Windows用户的受害者,对于编程1天,配置2天的经历来说,着实是一种痛苦的情况。本人也是遇到了这个问题,虽然发现竟然是芯片错了,但也因为这个研究了好几天,为了下次不再重新网上搜索,就把我现在对这方面的解决方法汇个总,并把我个人的自己见解放在里面记录下来。 问题背景 我用的是IAR的STM8开发环境,在连接ST-LINK时,选择运行调试就会立马报错,出现错误为:**Connection error(usb):swim error :comm init error:chip does not answer,不管插多少次,重启系统都不行。 针对这样的情况,下面要从硬件和软件两个方面来分析并解决。 硬件方面 1.
[单片机]
关于<font color='red'>STM8</font>的程序下载问题:SWIM Error[30006]报错解决办法汇总
B-1.19 协议分析--STM8使用自带的bootloader
1,首先确认你使用的STM8有没有自带的bootloader。参考下表: 2,STM8空器件可以直接使用自带的bootloader。 3,STM8在使用SWIM烧录后,要想继续使用自带的bootloader,必须设置可选字节为0x55AA。如下图: 设置这两个字节的方法,可以使用ST Visual Programmer修改,如下图: 不过这个软件显示只能修改487Eh为0x55,487Fh没更改。官方提供的软件,很奇怪。所以,我采用下一种方法。 在程序中设定,然后用SWIM下载一次,一次就够了。使用库函数如下: /* Define FLASH programming time / FLASH_SetProgrammingTi
[单片机]
B-1.19 协议分析--<font color='red'>STM8</font>使用自带的bootloader
学习单片机是汇编编程还是C语言编程
关于用汇编和C语言编程的问题。这个问题困恼很多人,可能主要是学校教学和部分教材的教育引导引起的吧,大一开了C语言编程,没等学生知道到底C语言有什么实际的用途,马上其他的语言一起来过来了。即使是开始了专门的单片机课程,但是课程的内容与技术文档很相识,指令很多,但是完整的不多,所以学完了也不知道,到底为什么要学习编程。   很多同学大一就开设了C语言的课,我也上过,但是那时候就是天天几乘几,几加几啊,求个阶乘啊,用C语言去解决小学数学问题,每周两次上机,对着书本不停的敲打,下课了也不知道自己到底掌握了什么,掌握了这个有什么用途。学完了有什么用?如果在面试的时候,老板问,你学过编程吗,你脑子里马上是什么 C语言,VC什么VB。很多,什么C
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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