Re: [問題] 16進和10進轉換程式(8051)

看板ASM (組合語言)作者 (喵喵叫的蜜蜂貓)時間14年前 (2010/08/26 16:17), 編輯推噓4(404)
留言8則, 2人參與, 最新討論串2/2 (看更多)
※ 引述《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

08/26 16:18, , 1F
好久沒寫8051ASM了,可能會有錯,以C為準
08/26 16:18, 1F

08/26 17:03, , 2F
但是CPU CYCLE會差很多喔~
08/26 17:03, 2F

08/26 21:58, , 3F
樓上是說我們兩個的寫法,還是C跟ASM之間?
08/26 21:58, 3F

08/26 22:10, , 4F
ASM VS ASM,而且我也沒最佳化,隨手寫寫 :P
08/26 22:10, 4F

08/26 22:11, , 5F
一般,如無必要我都會避免乘除指令(4個CYCLE)
08/26 22:11, 5F

08/26 22:13, , 6F
用你的流程,換成DAA,應該會最佳化 ^^;
08/26 22:13, 6F
我算了一下,我的程式碼總共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

08/26 22:25, , 7F
還有,您答案放反了 :P
08/26 22:25, 7F
改了 ※ 編輯: SmallBeeWayn 來自: 122.116.180.163 (08/27 00:51)

08/27 01:15, , 8F
嗯,您對了 ^^;; 辛苦了
08/27 01:15, 8F
文章代碼(AID): #1CTYCHfd (ASM)
文章代碼(AID): #1CTYCHfd (ASM)