新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > c51單片機浮點數及其匯編程序設計

        c51單片機浮點數及其匯編程序設計

        作者: 時間:2016-11-22 來源:網絡 收藏
        在單片機應用系統的數據處理過程中,經常會遇到小數的運算問題,如求解BCD的增量算式、線性化處理等。因此,需要用二進制數來表示小數。表示小數的方法一般有兩種,定點數和浮點數。定點數結構簡單,與整數的運算過程相同,運算速度快。但隨著所表示數的范圍的擴大,其位數成倍增加,給運算和存儲帶來不便,而且也不能保證相對精度不變。浮點數的結構相對復雜,但它能夠以固定的字節長度保持相對精度不變,用較少的字節表示很大的數的范圍,便于存儲和運算,在處理的數據范圍較大和要求精度較高時,采用浮點數。

        浮點數的概念

        本文引用地址:http://www.104case.com/article/201611/319885.htm

        常用的科學計數法來表示一個十進制數如

        l234.75=1.23475E3=1.23475×103

        在數據很大或很小時,采用科學計數避免了在有效數字前加0來確定小數點的位置,突出了數據的有效數字的位數,簡化了數據的表示。可以認為,科學計數法就是十進制數的浮點數表示方法。

        在二進制效中,也可以用類似的方法來表示一個數,如

        1234.75=10011010010.11(二進制)=0.1001101001011×211

        一般表達式為

        N=S×2p

        在這種表示方法中,數值由四個部分組成,即尾數S及符號,階碼P及符號。

        在二進制中,通過定義相應字節或位來表示這四部分,就形成了二進制浮點數。二進制浮點數可以有多種不同的表示方法,下面是一種常見的三字節浮點數的格式:

        其中尾數占16位,階碼占6位,階符占1位,數符占1位。階碼通常用補碼來表示。

        在這種表示方法中,小數點的實際位置要由階碼來確定,而階碼又是可變的,因此稱為浮點數。

        1234.75用這種格式的浮點數表示就是:

        0000 1011 1001 1010 0101 1000

        用十六進制表示為

        1234.75=0B9A58H

        -1234.75=4B9A58H

        0.171875=043B00H

        -0.171875=443B00H

        三字節浮點數所能表示的最大值為

        1×263=9.22×1018

        能表示的最小數的絕對值為

        0.5×2-63=5.42×10-20

        其所表示的數的絕對值范圍=(5.42×10-20~9.22×1018),由此可以看到,比三字節定點數表示的數的范圍大得多。

        按同樣方法可以定義一個四字節的浮點數,以滿足更高精度的需要。

        規格化浮點數

        同一個數用浮點數表示可以是不同的,如

        1234.75=0B9A58H=0C4D2CH=0D2696H

        雖然這幾種表示其數值是相同的,但其尾數的有效數字的位數不同,分別為16位、15位和14位。在運算過程中,為了最大限度地保持運算精度,應盡量增加尾數的有效位數。這就需要對浮點數進行規格化處理。

        在只考慮用二進制原碼表示尾數時,尾數的最高位為l,則該浮點數為規格化浮點數。在規格化浮點數中,用尾數為0和最小階碼表示0,三字節規格化浮點數的0表示為410000H。

        浮點數在運算之前和運算之后都要進行規格化,規格化過程包括以下步驟:

        (1)首先判斷尾是否為0,如果為0,規格化結果為410000H;

        (2)如果尾數不為0,判斷層數的最高位是否為1,如果不為1,尾數左移,階碼減1;

        (3)再判斷層數的最高位是否為1,如果不為1,繼續進行規格化操作,如果為1,則規格化結束。

        浮點數運算

        浮點數運算包括加、減、乘、除四則運算,比較運算,開方運算,多項式運算和函數運算。其它運算都可用這些基本運算的組合來完成。本節主要介紹浮點數四則運算及其子程序。

        1.浮點數的加、減運算

        浮點數的運算就是求結果的尾數、數符、階碼包括階符的過程。在加、減運算中,參加運算的浮點數的階碼可能是不同的,其尾數所代表的值也是不同的。在這種情況下,尾數不能直接相加或相減,必須首先使兩個數的階相同,這一過程稱為對階。一般是讓小階向大階對齊,尾數相應右移。對階相當于算術中的小數點對齊或代數中的通分。尾數相加或相減得到了結果的尾數。數符由尾數的運算結果的符號確定。階碼就是兩個數中較大的階碼。

        例1 計算132.25+69.75

        解: 132.25+69.75=088444H+078B80H=088444H+0845C0H=08CA00H=202

        由于兩個浮點數的階碼分別為8和7,先將加數的階碼變為8,其尾數右移1位。兩個數的階碼相同后,尾數直接相加即為和的尾數,和的尾數的最高位為1,為規格化浮點數。

        例2 計算12.39-93.1

        解: 12.39-93.1=04C651H-07BA33H=87A169H=-80.71

        本例中被減數小于減數,差為負數,結果的數符為1。差的階碼為兩個數中較大的階碼。

        2.浮點數乘法運算

        如果設參加運算的兩個操作數分別表示為

        Na=(-1)SSa×Sa×2Pa

        Nb=(-1)SSb ×Sb×2Pb

        它們的積為

        N=Na×Nb=(-1)SSa+SSb×(Sa×Sb)×2Pa+Pb

        式中SSa和SSb為兩個數的數符。

        乘法運算可總結為:

        (1)積的數符為乘數的符號位和被乘數的符號位按模2求和,即異或;

        (2)積的階為乘數和被乘數的階的和;

        (3)積的尾數為被乘數和乘數的尾數的積。

        參加運算的浮點數一般都是規格化的浮點數,尾數的積小于1,不需進行右規格化處理。但有可能小于0.5,所以需進行左規格化處理,使積為規格化浮點數。如果乘數或被乘數的尾為0、則積為410000H。由于在尾數相乘時,積的低16位不能反映在結果中,因此,積可能會產生一定的誤差。

        例3 算22.4l×4.23。

        解: 22.41×4.23=05B349H×03875EH=07BD9AH=94.8

        積的階為乘數和被乘數的和,即8。尾數相乘時,積小于0.5,進行左規格化處理,階碼變為7。

        例4 計算2586.5×(-6.91)。

        解: 2586.5×(-6.91)=0CA1BOH×83DD13H=8F8BA0H=-17872

        被乘數為正數,數符為0,乘數為負數,數符為1,積的數符為0⊕1=1,積為負數。

        3.浮點數的除法運算

        除法運算可以表示為

        N=Na/Nb=[(-1)SSa×Sa×2Pa]/[(-1)SSb×Sb×2Pb ]

        =(-1)SSa-SSb×(Sa/Sb) ×2Pa-Pb

        浮點數的除法運算可以總結為:

        (1) 商的數符為被除數與除數的符號位的差;

        (2) 商的階碼為被除數和除數的階碼的差;

        (3) 商的尾數為被除數和除數的尾數的商。

        規格化的浮點數進行除法運算時,尾數相除,商不會小于0.5,不需進行左規格化處理。但有可能大于1,有時需進行右規格化處理。

        例5 計算390.67÷14.3l。

        解: 390.67÷14.31=09C357H÷04E511H=05DA4EH=27.3

        商的階碼為被除數與除數的階碼的差。尾數相除時,結果的最高位為1,商為規格化浮點數。

        例6 計算 -6.02÷16.157。

        解: -6.02÷16.157=83C0AAH÷058143H=FFBEC8H= -0.373

        異號相除時,商為負數。由于被除數的尾數大于除數的尾數,所以被除數先進行右規格化,階碼變為4,商的階碼為 -1,用補碼來表示。

        浮點數運算子程序

        通過前面的分析可以看到,浮點運算比較復雜,有其特有的方法和規律。這里介紹幾種常用的三字節浮點數運算子程序,通過分析、設計這些程序,可以進一步了解浮點數的運算過程和特點,熟悉復雜程序的設計方法。

        1.浮點數通用規格化子程序

        在浮點數運算過程中,有時需要左規格化,有時需要右規格化。通過規格化子程序既可實現左規格化,又可實現右規格化,其具體功能如下:

        當Cy=0時,進行右規格化:F0=0時.對R6(階)R2R3(尾數)右規格化1位;F0=1時,對R7(階)R4R5(尾數)右規格化1位。

        當Cy=1時,對R6(階)R3R3(尾數)執行左規格化。

        程序開始時,判斷是執行左規格化還是右規格化。如果是右規格化,還要判斷是對R6(階)R2R3(尾數)還是對R7(階)R4R5(尾數)進行規格化。如果是左規格化,直至把操作數變為規格化浮點數。其程序框圖如圖4-13所示。程序為:

        FSDT: JC LNORMS

        MOV C, 39H ;進行右規格化

        JB F0, NR7

        MOV A, R2 ;R2R3右移一位

        RRC A ;(Cy)移入尾數最高位

        MOV R2, A

        MOV A, R3

        RRC A

        MOV R3, A

        INC R6 ;階碼加1

        RET

        NR7: MOV A, R4

        RRC A

        MOV R4, A

        MOV A, R5

        RRC A

        MOV R5, A

        INC R7

        RET

        LNORMS: MOV A, R7

        JNZ LSHIFT

        CJNE R3, #00H, LSBIT8 ;尾數為0,階碼41H

        MOV R6, #41H

        LSEND : RET

        LSHIFT: JB ACC.7, LSEND

        LSBIT8: MOV C, F0

        MOV A, R3

        RLC A

        MOV R3, A

        MOV A, R2

        RLC A

        MOV R2, A

        CLR F0

        DEC R6

        SJMP LNORMS

        2.浮點數加減運算子程序

        參加運算的浮點數可能是正數,也可能是負數。對于加法運算.當加數和被加數的數符相同時,尾數相加,不同時尾數相減;對于減法運算,當減數和被減數的數符相同時,尾數相減、不同時尾數相加。當兩個浮點數的階碼不同時,要進行對階,使小階與大階相等,因此,結果的階碼與其較大的階碼相同。

        在執行加法運算時,尾數有可能大于1,因此要進行右規格化處理;執行減法運算時,尾數有可能小于0.5,因此,要進行左規格化處理。

        下面是三字節浮點數加、減法處理于程序,具體功能為:

        R6(階)R2R3(尾)±R7(階)R4R5(尾)→R4(階)R2R3(尾);

        當位3AH=0時,執行加法;

        當位3AH=1時,執行減法。

        程序框圖如圖4—14所示。程序如下:

        FABP: MOV A, R6

        MOV C, ACC.7

        MOV 38H, C ;存被加數數符

        XRL A, R7

        JNB ACC.7, FAB1 ;數符相同則轉

        CPL 3AH ;數符不等,求反運算標志

        圖4-14

        FAB1: MOV A, R6

        MOV C, ACC.6 ;擴展階碼符號位

        MOV ACC.7, C

        MOV R6, A

        MOV A, R7

        CLR C

        MOV A, R6

        SUBB A, R7

        JZ FAB2 ;階碼相同則轉

        CLR F0

        JB ACC.7, FAB6

        CJNE R4, #00H, FAB7

        CJNE R5, #00H, FAB7

        FAB2: JB 3AH, FAB9 ;轉向尾數減法

        MOV A, R3 ;執行尾數加法

        ADD A, R5

        MOV R3, A

        ADD A, R2

        ADDC A, R4

        MOV R2, A

        JNC FAB4

        SETB 39H

        CLR C

        FAB3: CLR F0

        LCALL FSDT

        FAB4: CJNE R2, #00H, FAB5

        CJNE R3, #00H, FAB5

        MOV R4, #41 ;結果為0,規格化

        RET

        FAB5: MOV A, R6

        MOV C, 38H

        MOV ACC.7, C

        XCH A, R4

        MOV R6, A

        RET

        FAB6: CJNE R2, #00H, FAB8

        CJNE R3, #00H, FAB8

        MOV A, R7

        MOV R6, A

        SJMP FAB2

        FAB7: CPL F0

        FAB8: CLR C

        LCALL FSDT

        SJMP FAB1

        FAB9: MOV A, R3 ;尾數相減

        CLR C

        SUBB A, R5

        MOV R3, A

        MOV A, R2

        SUBB A, R4

        MOV R2, A

        JNC FAB10

        CLR A

        CLR C

        SUBB A, R3

        MOV R3, A

        CLR A

        SUBB A, R2

        MOV R2, A

        CPL 38H

        FAB10: SETB C

        SJMP FAB3

        3. 浮點數乘法運算子程序

        浮點數相乘時,階碼直接相加即獲得積的階碼,尾數相乘時,結果可能小于0.5,需進行左規格化處理。下面是三字節浮點數乘法運算子程序,具體功能為:

        (Ro)指向的三字節浮點數×(R1)指向的三字節浮點數→R4(階)R2R3(尾數)。

        圖4-15三字節浮點數乘法的程序框圖。程序為:

        FMUL: LCALL FMLD ;傳送浮點數

        MOV A, R6 ;求積的數符

        XRL A, R7

        MOV C, ACC.7

        MOV 38H, C

        LCALL DMUL ;調用雙字節無符號數乘法子程序

        MOV A, R7

        MOV C, ACC.7

        MOV F0, C

        MOV A, @R0

        ADD A, @R1

        MOV R6, A

        SETB C

        LCALL FSDT ;進行規格化操作

        圖4-15 三字節浮點數乘法子程序

        MOV A, R6

        MOV C, 38H

        MOV ACC.7, C ;置積的數符

        MOV R4, A

        RET

        注:(1)FMLD為浮點數取數子程序,功能為:將(R0)指向的三字節浮點數送入R6(階)R2R3(尾數)中,將(R1)指向的三字節浮點數送入R7(階)R4R5(尾數)中。

        (2)DMUL為雙字節無符號數乘法子程序。

        4.浮點數除法運算子程序

        在進行除法運算時,被除數的尾數可能比除數的尾數大很多,使結果大于1。為避免這種情況,如果被除數尾數大于除數的尾數,先將被除數的尾數右移,使其小于除數的尾數。階碼也相應增加,保持其數值不變。下面是三字節浮點數除法運算程序,其功能為:(R0)指向的三字節浮點數除以(R1)指向的三字節浮點數→R4(階)R2R3(尾數)中。

        程序框圖如圖4-16所示。程序為:

        FDIV: LCALL FMLD

        MOV A, R6

        XRL A, R7 ;求商的數符

        MOV C, ACC.7

        MOV 38H, C

        CLR A

        MOV R6, A

        MOV R7, A

        CJNE R4, #00H, FDIV1

        CJNE R5, #00H, FDIV1

        SETB C

        RET ;除數為0返回

        FDIV1: MOV A, R3 ;比較被除數與

        SUBB A, R5 ;除數的尾數

        MOV A, R2

        SUBB A, R4

        JC FDIV2

        CLR F0

        CLR 39H

        LCALL FDST

        RRC A

        MOV R7, A

        CLR C

        SJMP FDIV1

        FDIV2: CLR A

        XCH A, R6

        PUSH ACC

        LCALL DDIV ;調用雙字節除法程序

        POP ACC

        ADD A, @R0

        CLR C

        SUBB A, @R1

        MOV C, 38H

        MOV ACC.7, C

        MOV R4, A

        CLR C

        RET



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 介休市| 卓资县| 攀枝花市| 平陆县| 吉木乃县| 甘洛县| 宾阳县| 千阳县| 高清| 齐河县| 岑溪市| 甘泉县| 佛学| 台湾省| 西吉县| 潞城市| 青铜峡市| 峨山| 贵阳市| 靖宇县| 河西区| 天全县| 定陶县| 通化市| 时尚| 惠水县| 扎赉特旗| 台北县| 曲阜市| 福安市| 榆中县| 永定县| 南澳县| 静乐县| 滕州市| 镇安县| 南木林县| 红河县| 容城县| 定兴县| 青岛市|