时间:2023-08-18 03:53 / 来源:未知

  Str_opr2 中!北海布伦特FXCG原油期货迩来安排玩一下STM8, 只为了消化一下我的库存,由于我已经买过几个型号的STM8单片机,不过平素没用来DIY啥。我对STM8熟谙水准远不如STM32,  后者是时兴遍及的ARM核,STM8却是ST独家的架构。

  STM8 CPU是正在ST7根基上加强,有人说是从6502演变来的,我看倒也不像。

  练习了一下史乘,Motorola的6800演变出来的6805/6811/6809三个分支,以及6502这个与6800有渊源的CPU,从寄存器和指令集上看STM8是和它们有形似之处的,可是分别的地方也很大。行为一个8位MCU,STM8的寻址限度果然抵达16M byte(我不信ST会给8位机配上1M以上的ROM或RAM),寻址形式就良众了,间接内存拜望比x86都繁复,看惯了RISC的CPU更不行忍。好吧,固然指令集繁复,STM8的推广速率还疾,反正不会纯用汇编来开拓。

  ST并没有供给STM8的C编译器(汇编器是有的),需求用第三方的。Cosmic C编译器有免费License的版本可能用,这也是ST推举的,我就装了一个来试。ST官方援手的再有Raisonance的编译器,另外IAR也有STM8的开拓情况。

  试写了个C标准测试,可能用STVP连结ST-Link下载标准,但我以为还需求个能反汇编看编译结果的东西。Cosmic东西链内部没有反汇编标准,ST的汇编东西里也没有,STVD既然能跟踪调试应当有,但我没能把它用起来。

  利落己方写一个STM8反汇编东西吧,也练下手奈何写。先研讨下STM8的指令集,这是一种外率变长指令集,除了前缀字节,操作码就正在一个字节内部。于是我照开头册统计了一张外出来:

  一个字节能展现的限度除了 0x90, 0x91, 0x92, 0x72 用来做指令前缀,其它险些都用来作操作码了。当然很众指令都有众种寻址形式的(譬喻加法是谁和谁相加,需求指定),所以用了不止一个操作码。算上寻址形式,256种指令都不敷用的,因此STM8靠前面补充前缀字节来扩展。从手册内部截一个例子如下(这是XOR指令的众种编码):

  正在指令的操作码后面即是供给数据或地方的字节了,长度由操作码加上前缀来决策。

  编写反汇编标准即是写一个依照字节数据流的查外历程。上面我做的谁人外只是划分了指令的散布,涉及到寻址形式的细节如故得一边写一边查手册。从外上看,操作码的高半字节大抵可能把指令划分为几类,再用低半字节去细分指令,于是我的标准解码第一步即是一个 switch-case 组织来划分职司:

  解码的结果是放到整体变量内部的,返回值只代外了指令是否有用。比方,外格最右边一列的指令我是云云解析的:

  闭键是靠 format() 函数依照而今的指令前缀来翻译操作码:指令名称,寻址的第一操作数、第二操作数。若一共写 256 个 case 分支就太繁琐了,需求捉住共性,像外格中绿色布景的这一组指令我是这么照料的:

  正在给 format() 这个函数的参数中,指令和操作数类型都是用数值来展现的——用 enum 界说:

  我思这么写而不是直接写字符串的由来是,字符串万一写错了很难查抄出来。写成常量编译器可能查抄,再联合对应到字符串即可。

  format() 函数查抄成婚指令前缀,成婚上了才把数值展现的指令和操作数类型转换成字符串,区分存到三个整体变量 Str_inst, Str_opr1, Str_opr2 中,实在这些字符串都是界说好的,也即是写指针云尔。有个特别照料是正在 0x90 指令前缀下,主动将 X 寄存器替代为 Y 寄存器。

  再来看下主标准中奈何输出反汇编文本的,最初是初始换化几个整体变量,然后移用 decode_instr() 根据操作码瓦解指令,判别是否获胜。倘使碰到指令前缀,那么就从新取下一个字节;倘使有前缀但指令未被识别,那么移用 decode_instr_special() 举行特别指令的照料,也即是上面的外中没法展现出来的指令。若解码败北,先输有缺点的音讯。

  下面即是解码获胜后的翻译历程了,用 get_extra() 函数从代码数据中提取操作数(随即数、地方等),存放到dat1, dat2两个整型数,供后面用 printf() 输出。至于 printf() 需求的形式字符串,实践上是由解码取得的 Str_opr1, Str_opr2 结果供给的。这里还要特别照料一下带位操作的指令(BCCM, BCPL, BRES, BSET, BTJF, BTJT这几个),此中的位是编码正在操作码当中的,我正在 format() 函数中并不把这个位编码行为一个操作数,纵然从汇编讲话角度它应当是算一个操作数。


外汇交易无重复报价,并按实时报价执行交易

通过FXCG MT4交易平台随时随地进入全球市场。