痞酷網_PIGOO

 找回密碼
 立即註冊
!!! [系統偵測到廣告阻擋軟體] !!!

如果您覺得痞酷網對您有些許幫助,或者您認同痞酷網的理想,

那麼希望您將痞酷網設定為白名單.

並請在上論壇的時候,動動您的手指,用行動支持我們.

謝謝!
查看: 14253|回復: 31

[問題求助] 請教8051組合語言如何將0xff,0xff,0xff轉為16777215

  [複製鏈接]
發表於 2012-9-15 15:13:20 | 顯示全部樓層 |閱讀模式
如標題將16進制0xff,0xff,0xff轉為十進制16777215,找書店大概都是3位數或4位數,請高手幫幫忙!謝謝!:)
發表於 2012-9-15 15:18:16 | 顯示全部樓層
用 "除以10" 的算法
發表於 2012-9-15 20:12:36 | 顯示全部樓層
這是16進位轉換成十進位,既然有三位數或四位數範例可看,只要將轉換演算法搞清楚,自己拓展為6位數應該不難.......
 樓主| 發表於 2012-9-15 20:58:13 | 顯示全部樓層
ysc 發表於 2012-9-15 08:12 PM static/image/common/back.gif
這是16進位轉換成十進位,既然有三位數或四位數範例可看,只要將轉換演算法搞清楚,自己拓展為6位數應該不 ...

您好,抱歉!這範例是51c語,看不懂阿!所以才請教組合語言啊!:sam09
 樓主| 發表於 2012-9-15 21:00:24 | 顯示全部樓層
xiaolaba 發表於 2012-9-15 03:18 PM static/image/common/back.gif
用 "除以10" 的算法

51除法 div 指令沒有旗標可判斷啊!:sam09
發表於 2012-9-15 21:34:12 | 顯示全部樓層
24bit轉成8位數bcd碼並不是太難的,
不過這種東西用c看應該反而比較簡單吧
如果c都看不懂的情形下應不建議去看組合語言
這種運算大約要8-90行組合語言去寫就能完成,應該也沒人沒事會去寫
即然都有c的範例,就直接編譯後在keil上就能直接看到組合語言也是一種方法
不過應該就會超過100行的組語
所以這個一般書上應該是找不到的吧
 樓主| 發表於 2012-9-15 22:12:00 | 顯示全部樓層
legion 發表於 2012-9-15 09:34 PM static/image/common/back.gif
24bit轉成8位數bcd碼並不是太難的,
不過這種東西用c看應該反而比較簡單吧
如果c都看不懂的情形下應不建議去 ...

版大,我對組合語言比較熟也看的懂,並不是要高手寫出,而是指點處理方式,例如
「10112」hex = (1*16^4) + (0*16^3) + (1*16^2) + (1*16^1) + (2*16^0)
但這算數我懂,但要以組合語言列出則‧‧‧頭皮都流湯了:sam09
發表於 2012-9-16 13:21:23 | 顯示全部樓層
本帖最後由 xiaolaba 於 2012-9-16 01:22 PM 編輯
lotor 發表於 2012-9-15 09:00 PM static/image/common/back.gif
51除法 div 指令沒有旗標可判斷啊!


o..

如果你要研究算法設計, 那可是很花腦筋的事情. 8 BIT 機器也可以做 64BIT 的數目處理, 沒有硬件支持的除法指令也是可以做除法運算, 只是執行時間和編程序的需要開銷, 俺以前研讀過的這個, 你參考看看.

http://homepage.cs.uiowa.edu/~jones/bcd/decimal.html
發表於 2012-9-16 13:47:19 | 顯示全部樓層
本帖最後由 oldhan 於 2012-9-16 01:51 PM 編輯

這我寫過, 有點笨但是可用.
準備一個  BCDtable, 1,2,4,8,16hex,32hex,64hex,128hex,
256hex,512hex,1024hex,2048hex,4096hex,8192hex, 16384hex, 32768hex,
65536hex,131072hex,262144hex,524288hex, 1048576hex,2097152hex,4194304hex,8388608hex
, 然後把原來 16 進 3byte 右移 1 bit 到 C 旗標,
如果 C 為 1 的話 結果加上(使用 BCD 加法) BCDtable 的數字(第一次取表格第一個數子, 第二次取第二個數字於此類推)
重複以上步驟直到24 位元位移完畢,
報告完畢 :)
 樓主| 發表於 2012-9-16 16:08:19 | 顯示全部樓層
xiaolaba 發表於 2012-9-16 01:21 PM static/image/common/back.gif
o..

如果你要研究算法設計, 那可是很花腦筋的事情. 8 BIT 機器也可以做 64BIT 的數目處理, 沒有硬件支持 ...

就是那個﹝c﹞,讓我【傷粉大】,為什麼那個﹝c﹞那麼難學。
 樓主| 發表於 2012-9-16 16:18:21 | 顯示全部樓層
oldhan 發表於 2012-9-16 01:47 PM static/image/common/back.gif
這我寫過, 有點笨但是可用.
準備一個  BCDtable, 1,2,4,8,16hex,32hex,64hex,128hex,
256hex,512hex,1024he ...

oldhan 大,好像略懂你這方法的意思,練功去了‧‧‧請眾神多多加持!謝謝!n_022|
 樓主| 發表於 2012-9-17 23:56:41 | 顯示全部樓層
legion 發表於 2012-9-15 09:34 PM static/image/common/back.gif
24bit轉成8位數bcd碼並不是太難的,
不過這種東西用c看應該反而比較簡單吧
如果c都看不懂的情形下應不建議去 ...

版大:我功力真的差多了,寫了200多行還在第6位數,還有時是錯誤值,天啊!要到第8位數其他就不用玩了,有高手願指導一下嗎?:sam09
發表於 2012-9-18 13:32:08 | 顯示全部樓層
本帖最後由 ysc 於 2012-9-18 08:50 PM 編輯
lotor 發表於 2012-9-17 11:56 PM static/image/common/back.gif
版大:我功力真的差多了,寫了200多行還在第6位數,還有時是錯誤值,天啊!要到第8位數其他就不用玩了, ...


照理說應該自己找出演算法再寫成程式,這樣才有學習效果,
貼出寫好的程式有時反而害了初學者,不過參考別人寫的程式也是學習的一種,
剛剛隨手寫了一下但願沒害到您,經過初步編譯沒問題,執行是否正確沒驗證過,
但基本演算法是正確的,我用這種方法轉換BCD已經超過30年了:

這段程式有效指令23行,佔用35 Byte程式空間。
-------------------------------------------------------------------------------------------------
;Input : BIN 3 Byte  BIN+2, BIN+1, BIN+0
;Output:BCD 4 Byte  BCD+3, BCD+2, BCD+1, BCD+0
;
BCD24:
        MOV       BCD,#0
        MOV       BCD+1,#0
        MOV       BCD+2,#0
        MOV       BCD+3,#0
        MOV        R7,#24
BCD241:
        MOV        R0,#BIN
        MOV        R3,#3
        CLR        C
BCD242:
        MOV        A,@R0
        RLC        A
        MOV        @R0,A
        INC        R0
        DJNZ        R3,BCD242
;
        MOV        R0,#BCD
        MOV        R3,#4
BCD243:
        MOV        A,@R0
        ADDC        A,@R0
        DA        A
        MOV        @R0,A
        INC        R0
        DJNZ        R3,BCD243
;
        DJNZ        R7,BCD241
        RET
-----------------------------------------------------------------------
呵呵~~下午寫太快,忘了將BCD先歸零,已補上......
 樓主| 發表於 2012-9-18 18:22:11 | 顯示全部樓層
ysc 發表於 2012-9-18 01:32 PM static/image/common/back.gif
照理說應該自己找出演算法再寫成程式,這樣才有學習效果,
貼出寫好的程式有時反而害了初學者,不過參考 ...

ysc 大:跟您報告我的小學演算法→夠減10000000→第8位加1,夠減1000000→第7位加1‧‧‧類推,失敗!
小學演算法→「10112」hex = (1*16^4) + (0*16^3) + (1*16^2) + (1*16^1) + (2*16^0)
依進制位元次方乘該位元數,再加總合‧‧‧結果,太龐大失敗!
ysc 大:您這方法太神了還再研究中,但先報告情況軟體編譯模擬都ok!用仿真器實際mpu跑就有誤,我把所有中斷都關了也是一樣,繼續抓蟲蟲‧‧‧。
對初學者來說,參考別人寫的程式也是學習的一種,畢竟沒上補習班,而初學者如果只一味複製別人貼出的程式叫腦殘,永遠也進不了階,還是萬分感激!:sam30
發表於 2012-9-18 18:42:10 | 顯示全部樓層
lotor 發表於 2012-9-18 06:22 PM static/image/common/back.gif
ysc 大:跟您報告我的小學演算法→夠減10000000→第8位加1,夠減1000000→第7位加1‧‧‧類推,失敗!
小 ...

這是所謂移位轉換法,binary相鄰位元差2倍,所以將binary從最高位元每次移出1 bit,然後將這個bit以10進位方式乘二放在BCD暫存,連續做24次相同運算即可得到答案‧
這演算法是讀書時老師教的,當時也只是個演算法沒有針對哪種程式語言,工作之後至少用過5種以上CPU,每次都用相同演算法重寫程式,都證實這方法還蠻有效率的‧

發表於 2012-9-18 19:25:44 | 顯示全部樓層
本帖最後由 legion 於 2012-9-18 07:27 PM 編輯

找了一下,幾年前作的東西里面的一段程式
跑起來沒什麼大問題,參考看看吧
  
  HH_HEX  DATA   2AH   ;輸入暫存, 16-23BIT.
  HI_HEX  DATA   2BH   ;輸入暫存. 8-15BIT.
  LO_HEX  DATA   2CH   ;輸入暫存. 0-7BIT.
  
  A_DEC   DATA   60H   ;個.       
  B_DEC   DATA   61H   ;十.
  C_DEC   DATA   62H   ;百.
  D_DEC   DATA   63H   ;千.
  E_DEC   DATA   64H   ;萬.
  F_DEC   DATA   65H   ;十萬.
  G_DEC   DATA   66H   ;百萬.
  H_DEC   DATA   67H   ;千萬.

        MOV R1,HH_HEX
        MOV R2,HI_HEX
        MOV R3,LO_HEX

        MOV        R4,#0
        MOV        R5,#0
        MOV        R6,#0
        MOV        R7,#0
        MOV        R0,#24                               
        JMP        BIN24BCD4_1
BIN24BCD4_0:
        MOV        A,R7
        ADD        A,R7
        DA        A
        MOV        R7,A
        MOV        A,R6
        ADDC        A,R6
        DA        A
        MOV        R6,A
        MOV        A,R5
        ADDC        A,R5
        DA        A
        MOV        R5,A
        MOV        A,R4
        ADDC        A,R4
        DA        A
        MOV        R4,A
BIN24BCD4_1:
        MOV        A,R3
        RLC        A
        MOV        R3,A
        MOV        A,R2
        RLC        A
        MOV        R2,A
        MOV        A,R1
        RLC        A
        MOV        R1,A
        JNC        BIN24BCD4_2               

        MOV        A,#1
        ADD        A,R7
        DA        A
        MOV        R7,A
        CLR        A
        ADDC        A,R6
        DA        A
        MOV        R6,A
        CLR        A
        ADDC        A,R5
        DA        A
        MOV        R5,A
        CLR        A
        ADDC        A,R4
        DA        A
        MOV        R4,A
BIN24BCD4_2:
        DJNZ        R0,BIN24BCD4_0
       
        ;--下面是切割成單一字元為了作顯示用途,不想切割就到此為止
        ;--將R4,R5,R6,R7切割出來給8位數的10進制.
        ;---R4---------
        MOV   A,#0F0H
        ANL   A,R4
        RR    A
        RR    A
        RR    A
        RR    A
        MOV   H_DEC,A        ;千萬.
        MOV   A,#0FH
        ANL   A,R4
        MOV   G_DEC,A        ;百萬.
        ;---R5---------
        MOV   A,#0F0H
        ANL   A,R5
        RR    A
        RR    A
        RR    A
        RR    A
        MOV   F_DEC,A        ;十萬.
        MOV   A,#0FH
        ANL   A,R5
        MOV   E_DEC,A        ;萬.
        ;---R6---------
        MOV   A,#0F0H
        ANL   A,R6
        RR    A
        RR    A
        RR    A
        RR    A
        MOV   D_DEC,A         ;千.
        MOV   A,#0FH
        ANL   A,R6
        MOV   C_DEC,A   ;百.
        ;---R7---------
        MOV   A,#0F0H
        ANL   A,R7
        RR    A
        RR    A
        RR    A
        RR    A
        MOV   B_DEC,A        ;十.
        MOV   A,#0FH
        ANL   A,R7
        MOV   A_DEC,A  ;個.
 樓主| 發表於 2012-9-18 19:36:12 | 顯示全部樓層
legion 發表於 2012-9-18 07:25 PM static/image/common/back.gif
找了一下,幾年前作的東西里面的一段程式
跑起來沒什麼大問題,參考看看吧
  

版大:給你個讚!收下慢慢消化:sam30
發表於 2012-9-18 20:09:38 | 顯示全部樓層
本帖最後由 ysc 於 2012-9-18 08:44 PM 編輯
legion 發表於 2012-9-18 07:25 PM static/image/common/back.gif
找了一下,幾年前作的東西里面的一段程式
跑起來沒什麼大問題,參考看看吧
  


legion大的演算法基本上跟我一樣,
都是左移binary,將BCD以十進位乘二並加入移出的Bit,
只是程式寫法不同。
 樓主| 發表於 2012-9-19 10:24:22 | 顯示全部樓層
感謝各大不吝指教,問題已解決,只是還再研究這演算法:

10101010  hh
10101010  l h
10101010  l o
r l f → c =1 低 4 bit >9 ,書上說明 +6 ,da 指令能有正確bcd 碼,但實際好像不對‧‧‧
再研究、研究‧‧‧
發表於 2012-9-19 11:34:07 | 顯示全部樓層
lotor 發表於 2012-9-19 10:24 AM static/image/common/back.gif
感謝各大不吝指教,問題已解決,只是還再研究這演算法:

10101010  hh

51的DA   A指令使用上是有所限制的,只能緊跟在ADD或ADDC指令之後,
針對原本就屬BCD碼的加法才有意義,無法直接將二進位轉換為10進位,也
無法調整減法指令之後的結果。

DA A的原文是「Decimal-adjust Accumulator for Addition」,將原文背下來就不會忘記.......

發表於 2012-9-23 00:49:45 | 顯示全部樓層
2進轉10進,用泡泡法,組語程式只有25行。
發表於 2012-9-24 09:44:37 | 顯示全部樓層
單晶片微電腦 發表於 2012-9-23 12:49 AM static/image/common/back.gif
2進轉10進,用泡泡法,組語程式只有25行。

示範一下(短程式與短裙一樣迷人)
發表於 2012-9-24 11:55:15 | 顯示全部樓層
oldhan 發表於 2012-9-24 09:44 AM static/image/common/back.gif
示範一下(短程式與短裙一樣迷人)

喔,這是你保持年輕的妙招 ... :sam31
你該不會常跑展場吧...:sam47
 樓主| 發表於 2012-9-24 13:22:51 | 顯示全部樓層
單晶片微電腦 發表於 2012-9-23 12:49 AM static/image/common/back.gif
2進轉10進,用泡泡法,組語程式只有25行。

2進轉10進,用泡泡法?????不懂!n_024|
發表於 2012-9-24 16:07:29 | 顯示全部樓層
泡泡排序法 Bubble sort, 上網找到的
作者 C.E.W
http://program-lover.blogspot.tw/2008/06/bubble-sort_20.html
發表於 2012-9-24 16:52:54 | 顯示全部樓層
Bubble Sort用在排序很常見,用來轉換10進制是還沒看過,
我也很想知到轉換原理?
發表於 2012-9-24 21:59:41 | 顯示全部樓層
不是c 的泡沫排序法,正確名稱還要找一下,
數學式以 8bit 為例 : (....(b7x2)+b6)x2+b5)x2+b4)x2+b3)x2+b2)x2+b1)x2+b0
有興趣可以找這本書  ISBN:957-512-369-7
(有程式及解說)
發表於 2012-9-24 23:24:44 | 顯示全部樓層
單晶片微電腦 發表於 2012-9-24 09:59 PM static/image/common/back.gif
不是c 的泡沫排序法,正確名稱還要找一下,
數學式以 8bit 為例 : (....(b7x2)+b6)x2+b5)x2+b4)x2+b3)x2+b2 ...

這個算法應該是 double dabble algorithm
發表於 2012-9-25 00:18:44 | 顯示全部樓層
單晶片微電腦 發表於 2012-9-24 09:59 PM static/image/common/back.gif
不是c 的泡沫排序法,正確名稱還要找一下,
數學式以 8bit 為例 : (....(b7x2)+b6)x2+b5)x2+b4)x2+b3)x2+b2 ...

這就跟我po的移位轉換法是一樣的......
發表於 2012-9-25 01:08:10 | 顯示全部樓層
單晶片微電腦 發表於 2012-9-24 09:59 PM static/image/common/back.gif
不是c 的泡沫排序法,正確名稱還要找一下,
數學式以 8bit 為例 : (....(b7x2)+b6)x2+b5)x2+b4)x2+b3)x2+b2 ...

呼! 試寫完用了 31 行.. 還沒測.
您需要登錄後才可以回帖 登錄 | 立即註冊

本版積分規則

關閉

站長小叮嚀上一條 /1 下一條

禁閉室|手機版|連繫我們|痞酷網電子技術論壇

GMT+8, 2024-11-23 04:11 PM , Processed in 0.432040 second(s), 16 queries , Gzip On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.