你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

都是C,来个STM8的汇编

[复制链接]
mlxy123xy 发布时间:2015-1-14 00:33
以下为转贴。网络资源,来源不详。
6 A. b4 `, S% N" ?  F1 T$ `/ n
STM8的开发环境用起来还是不错的,可以到ST的网站上下载安装程序ST_Toolset.exe。利用该环境可以开发用汇编语言写的程序,而且与ST的三合一开发板配合起来,确实非常方便。
不过如果要想用C语言来开发,稍微有点麻烦,得去别的公司下载C的编译器(CXSTM8_16K.exe),而且下载完以后,还得去注册,等待许可文件。实际上,我也按照ST介绍的方法做了,但始终都没有收到许可文件,也许本人实在愚笨。但不管怎么说,我觉得ST这一点做得相当不好,实在有点抠门。既然是免费的,为什么不一起打包提供给客户,这么麻烦,多耽误客户使用,得少卖多少STM8的芯片。
言归正传,还回到正题。用汇编语言开发程序,最简单的就是利用ST开发环境中提供的汇编程序框架自动生成功能。打开开发环境后,在File菜单中选择NewWorkspace,点击Createworkspace and project图标,然后就可以建立项目,在工具链中选ST Assembler Linker,最后选择MCU的型号,点击OK,就完成了一个项目的建立。这个环境与微软的VC6开发环境很象,点开项目文件中的Source Files,能看到系统自动生成好了一个汇编语言的框架,我们编写程序只要在这框架基础上就可以了。其实不用编写任何一条指令,这个框架程序是能够编译通过,并下载运行的。
自动生成的项目中包含3个重要的文件:mapping.inc,mapping.asm和main.asm。
mapping.inc文件中定义的是一些常量,mapping.asm文件中定义的是一些内存的分配,主要的汇编代码都在main.asm。
下面是main.asm中的汇编代码及注释。
stm8/
       #include"mapping.inc"
       segment'rom'
; 下面是定义一个标号,ST汇编的写法,有点不习惯
; 这里的main标号是复位后的第一条指令,与后面的中断向量表中
; 的名字是对应的
main.l   
       ;initialize SP
       ldwX,#stack_end
       ldwSP,X                              ; 设置堆栈指针
#ifdef RAM0  
; 如果定义了RAM0,则要汇编以下代码  
; clear RAM0
ram0_start.b EQU $ram0_segment_start
ram0_end.b EQU $ram0_segment_end
       ldwX,#ram0_start    ;寄存器X指向要清除的内存起始地址   
clear_ram0.l            ;这是一个标号定义,用于后面的跳转指令
       clr(X)              ;对应的内存单元清0  
       incwX              ;寄存器X+1,指向下一个单元   
       cpwX,#ram0_end    ;比较寄存器X是否等于内存的最后一个地址  
       jruleclear_ram0       ;若不等于,则循环
       #endif
#ifdef RAM1
; 如果定义了RAM1,则要汇编以下代码,代码含义与上面完全一样  
; clear RAM1
ram1_start.w EQU $ram1_segment_start
ram1_end.w EQU $ram1_segment_end      
       ldwX,#ram1_start
clear_ram1.l
       clr(X)
       incwX
       cpwX,#ram1_end  
       jruleclear_ram1
       #endif
       ;clear stack
; 将堆栈区的内存单元清0,代码含义与上面完全一样  
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
       ldwX,#stack_start
clear_stack.l
       clr(X)
       incwX
       cpwX,#stack_end  
       jruleclear_stack
infinite_loop.l                         ; 定义一个标号
;由于是一个框架,初始化内存后,进入一个死循环
       jrainfinite_loop                     
;下面代码写的是一段中断服务程序,不过也是空的
       interruptNonHandledInterrupt
NonHandledInterrupt.l
; 当进入中断服务程序后,无其它动作,直接返回
iret                                 
; 下面这张表很重要,定义了STM8所有的硬件中断对应的中断
; 服务程序的入口地址
segment 'vectit'
       dc.l{$82000000+main}                             ;reset
       dc.l{$82000000+NonHandledInterrupt}     ; trap
       dc.l{$82000000+NonHandledInterrupt}     ; irq0
       dc.l{$82000000+NonHandledInterrupt}     ; irq1
       dc.l{$82000000+NonHandledInterrupt}     ; irq2
       dc.l{$82000000+NonHandledInterrupt}     ; irq3
       dc.l{$82000000+NonHandledInterrupt}     ; irq4
       dc.l{$82000000+NonHandledInterrupt}     ; irq5
       dc.l{$82000000+NonHandledInterrupt}     ; irq6
       dc.l{$82000000+NonHandledInterrupt}     ; irq7
       dc.l{$82000000+NonHandledInterrupt}     ; irq8
       dc.l{$82000000+NonHandledInterrupt}     ; irq9
       dc.l{$82000000+NonHandledInterrupt}     ;irq10
       dc.l{$82000000+NonHandledInterrupt}     ;irq11
       dc.l{$82000000+NonHandledInterrupt}     ;irq12
       dc.l{$82000000+NonHandledInterrupt}     ;irq13
       dc.l{$82000000+NonHandledInterrupt}     ;irq14
       dc.l{$82000000+NonHandledInterrupt}     ;irq15
       dc.l{$82000000+NonHandledInterrupt}     ;irq16
       dc.l{$82000000+NonHandledInterrupt}     ;irq17
       dc.l{$82000000+NonHandledInterrupt}     ;irq18
       dc.l{$82000000+NonHandledInterrupt}     ;irq19
       dc.l{$82000000+NonHandledInterrupt}     ;irq20
       dc.l{$82000000+NonHandledInterrupt}     ;irq21
       dc.l{$82000000+NonHandledInterrupt}     ;irq22
       dc.l{$82000000+NonHandledInterrupt}     ;irq23
       dc.l{$82000000+NonHandledInterrupt}     ;irq24
       dc.l{$82000000+NonHandledInterrupt}     ;irq25
       dc.l{$82000000+NonHandledInterrupt}     ;irq26
       dc.l{$82000000+NonHandledInterrupt}     ;irq27
       dc.l{$82000000+NonHandledInterrupt}     ;irq28
       dc.l{$82000000+NonHandledInterrupt}     ;irq29
       end
把这个项目Build后,点击Debug中的Start Debugging就可以将程序下载到ST的三合一板上了,然后点击Run,程序就运行起来了,不过由于框架程序是一个空程序,初始化内存后就进入死循环了,因此什么效果也看不见。因此我们必须在框架程序的基础上,编写自己的程序。后面的程序例子都是在这个框架程序的基础上编写的。
, W9 Z4 u1 W6 ], a0 F
收藏 评论15 发布时间:2015-1-14 00:33

举报

15个回答
nightholder 回答时间:2015-1-14 19:34:19
这个好象是一个文档里面的一部分。。。。。不过东西不错了。。。。。
mubingml 回答时间:2015-1-14 20:05:31
这个是完整的吗?
mlxy123xy 回答时间:2015-1-14 20:53:55
mubingml 发表于 2015-1-14 20:05* v5 Z9 T& M4 a4 Q
这个是完整的吗?

! B& v1 e) u' e8 `) H; L有个pdf的同名文档。就在这个版面下。
holts1 回答时间:2015-1-16 13:20:34
汇编的效率太低
我是酱油哥 回答时间:2015-1-20 08:38:53
holts1 发表于 2015-1-16 13:20
& f7 `) k8 C: a汇编的效率太低
3 T4 Y5 e0 n; o4 V
效率低吗 ?汇编
那片清茶 回答时间:2015-1-20 09:04:26
不错,学习了。
holts1 回答时间:2015-1-20 10:03:46
我是酱油哥 发表于 2015-1-20 08:381 u2 ~  c& B7 _: o/ N: `+ {
效率低吗 ?汇编
& x2 c+ {% T9 V6 f0 h! E) ?
很低,指的是开发效率
我是酱油哥 回答时间:2015-1-20 10:56:26
holts1 发表于 2015-1-20 10:03
: U9 g- L/ \+ m! s! n) i很低,指的是开发效率

# [5 H, o4 x5 L) Ehaoba                           
mlxy123xy 回答时间:2015-1-20 23:06:56

; ?7 v/ ^4 ]4 S$ W" o3 U熟悉就好,语言没有优劣,只是个人的使用熟练程度。
! f3 b9 \( r/ T% W& s' v; L$ q6 ^3 \# [就像我们说中文,英国人说英文一样。
我是酱油哥 回答时间:2015-1-21 08:21:35
mlxy123xy 发表于 2015-1-20 23:06* V! S0 r0 u( ~5 ]3 {
熟悉就好,语言没有优劣,只是个人的使用熟练程度。
$ a1 b0 P9 V9 c1 z& x5 l就像我们说中文,英国人说英文一样。 ...

1 V: Y* y( Q- X熟能生巧   
拼命三郎 回答时间:2015-1-21 12:43:27
支持一下吧
cshmotor 回答时间:2018-11-28 17:32:35
顶一下。
TLLED 回答时间:2018-11-28 17:52:57
顶一下,汇编执行效率很高,就是移植比较麻烦
12下一页
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版