作者SmallBeeWayn (喵喵叫的蜜蜂猫)
看板ASM
标题Re: [问题] 16进和10进转换程式(8051)
时间Thu Aug 26 16:17:18 2010
※ 引述《WolfLord (呆呆小狼)》之铭言:
: DecConv:
: ;DecConv(char num,char data *byte);
: MOV A,R7 ;Take num
: MOV R0,R5 ;Take *byte
: DA A
: MOV @R0,A ;Put into byte[0]
: SWAP A
: INC R0
: MOV @R0,A ;Put into byte[1]
: MOV R0,R5
: MOV A,#15 ;byte[0]&=0x0f
: ANL A,@R0
: MOV @R0,A
: INC R0
: MOV A,#15 ;byte[0]&=0x0f
: ANL A,@R0
: MOV @R0,A
: RET
不过这样看来,我觉得用DIV比较快耶
CYCLE CODE
MOV A,R7 ;Take num 1 1
MOV B,#0A ;B=10d 1 2
MOV R0,R5 ;Take *byte 2 2
DIV AB 4 1
MOV @R0,A ;十位数 1 1
INC R0 1 1
MOV @R0,B ;个位数 1 1
RET
这段用C来表示:
Byte[0]=num/10;
Byte[1]=num%10;
不过编译器会不会判定成只用一个DIV处理可能要看造化了
--
连连看:狼与辛香料(小梅漫画版) 限制级
秋色天空 普遍级
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.116.180.163
1F:→ SmallBeeWayn:好久没写8051ASM了,可能会有错,以C为准 08/26 16:18
2F:推 WolfLord:但是CPU CYCLE会差很多喔~ 08/26 17:03
3F:→ SmallBeeWayn:楼上是说我们两个的写法,还是C跟ASM之间? 08/26 21:58
4F:推 WolfLord:ASM VS ASM,而且我也没最佳化,随手写写 :P 08/26 22:10
5F:→ WolfLord:一般,如无必要我都会避免乘除指令(4个CYCLE) 08/26 22:11
6F:→ WolfLord:用你的流程,换成DAA,应该会最佳化 ^^; 08/26 22:13
我算了一下,我的程式码总共11 CYCLE, 9 CODE
如果改用DA A的话,我能写到的极限:
CYCLE CODE
MOV A,R7 ;Take num 1 1
MOV R0,R5 ;Take *byte 2 2
DA A 1 1
MOV R1,A 1 1
SWAP A 1 1
ANL A,#0x0F 1 2
MOV @R0,A ;十位数 1 1
INC R0 1 1
MOV A,R1 1 1
ANL A,#0x0F 1 1
MOV @R0,A ;个位数 1 1
RET
总共12 CYCLE, 13 CODE
7F:推 WolfLord:还有,您答案放反了 :P 08/26 22:25
改了
※ 编辑: SmallBeeWayn 来自: 122.116.180.163 (08/27 00:51)
8F:推 WolfLord:嗯,您对了 ^^;; 辛苦了 08/27 01:15