LAOXU 发表于 2024-3-20 21:34:40

查表法 hex --> ascii ,5个时钟周期(缺点, 太占内存)
       MOV      DPTR,#TAB_ASCII   // 1
       MOVC      A,@A+DPTR       // 4

LAOXU 发表于 2024-3-20 21:46:29

本帖最后由 LAOXU 于 2024-3-20 21:50 编辑

我写了一个, 最快 4个时钟周期,最慢 7个时钟周期,
      CJNE    A,#10,$+3   // 1/3
      JC      $+4         // 1/3
      ADD   A,#7      // 1
      ADD   A,#30H      // 1   

最快时速度超查表法, 最慢时速度也超过标准法,   


zxcv1973 发表于 2024-3-20 23:56:35

LAOXU 发表于 2024-3-20 21:34
查表法 hex --> ascii ,5个时钟周期(缺点, 太占内存)
       MOV      DPTR,#TAB_ASCII   // 1
       MO ...

要用MOVC A,@A+PC指令
ADD A,#偏移
MOVC A,@A+PC
总共需要4个时钟,像这种核心算法,用空间换时间还是很有用的,也就多10个字节左右

LAOXU 发表于 2024-3-21 04:44:21

早些年, 网上流传着 4位HEX --> BCD 快速算法 PK , 看谁写的程序速度最快代码最短.

如有兴趣咱们来个 8位HEX --> BCD 算法 PK (这个工作量有点大),   
R4R5R6R7(无符号 LONG, 高在先, HEX) --> ACCR4R5R6R7(高在先, BCD)

要么来个简单一点的, HEX --> BCD 算法 常用的 除10 运算 ?
8位HEX / 10(这个工作量小),R4R5R6R7(无符号 LONG, 高在先, HEX) -->R4R5R6R7(商, 高在先), ACC(余数).

社区闲人 发表于 2024-3-21 05:53:15

查表用到的数组,放在code空间,不占内存。

小飞侠 发表于 2024-3-21 07:56:21

根据应用确定使用那种方法

小涵子爸爸 发表于 2024-3-21 08:00:20

来膜拜各路大神

BeHappy 发表于 2024-3-21 08:22:07

来都来了,凑个热闹再走 :-)
想问下,8位 mcu编程,有一个 2 字节组成的数字,想拆分出个、十、百、千、万位。

目前是这样做的:
低 8 位,先除以 100,余数再除以10,这样就把低 8 位表示的数字分离出个、十、百位了;
高 8 位,如果不为0,那就循环它:
每轮循环依次给分离出来的个、十、百位,分别加6、5、2.从个位开始加,大于等于10,则向前一位进位。

接下来是实现。其中PASSEDSECONDSLOW和PASSEDSECONDSHIGH存储的是组成16位二进制的低、高8位;SECONDSDIGITS、SECONDSDIGITS +1、SECONDSDIGITS + 2、SECONDSDIGITS + 3和SECONDSDIGITS + 4存储分离出来的个、十、百、千和万位上不超过十进制9的数字:
COMPSECONDSDIGITS:
    MOV                A, PASSEDSECONDSLOW
    MOV                B, #100D
    DIV                AB
    MOV                SECONDSDIGITS + 2, A
       
    MOV                A, B
    MOV                B, #10D
    DIV                AB
    MOV                SECONDSDIGITS + 1, A
    MOV                SECONDSDIGITS, B
       
    MOV                R7, PASSEDSECONDSHIGH
    CJNE        R7, #00H, COMPSECONDSDIGITSLOOPL1
    JMP                COMPSECONDSDIGITSEND
    COMPSECONDSDIGITSLOOPL1:
      MOV                A, #6D
      ADD                A, SECONDSDIGITS
      MOV                B, #10D
      DIV                AB
      MOV                SECONDSDIGITS, B
      ADD                A, SECONDSDIGITS + 1
      MOV                SECONDSDIGITS + 1, A
               
      MOV                A, #5D
      ADD                A, SECONDSDIGITS + 1
      MOV                B, #10D
      DIV                AB
      MOV                SECONDSDIGITS + 1, B
      ADD                A, SECONDSDIGITS + 2
      MOV                SECONDSDIGITS + 2, A
               
      MOV                SECONDSDIGITS + 3, #00H
      MOV                A, #2D
      ADD                A, SECONDSDIGITS + 2
      MOV                B, #10D
      DIV                AB
      MOV                SECONDSDIGITS + 2, B
      ADD                A, SECONDSDIGITS + 3
      MOV                SECONDSDIGITS + 3, A
               
      MOV                SECONDSDIGITS + 4, #00H
      MOV                A, SECONDSDIGITS + 3
      MOV                B, #10D
      DIV                AB
      MOV                SECONDSDIGITS + 3, B
      MOV                SECONDSDIGITS + 4, A
      DJNZ        R7, COMPSECONDSDIGITSLOOPL1
      COMPSECONDSDIGITSEND:
            RET

llyymm 发表于 2024-3-21 08:32:01

说实话,我从小就喜欢和电有关的东西,好像真的不是为了钱,单纯的爱好,不是干这行的却有万用表、示波器、频率计,对任何电器都会去琢磨他的控制原理,虽然学的不深,但就是爱这玩意儿!{:4_167:}

21cnsound 发表于 2024-3-21 08:32:59

搞汇编代码确实有意思
页: 1 [2] 3 4
查看完整版本: 电工们的业余爱好