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
搞汇编代码确实有意思