三、用16位算術電路進行32位算術運算

  (一)32位加減運算
    32位加減運算是分別對高16位與低16位進行加減運算,然後把兩次運算的結果合並成一個32位數據。
    1、32位無符號加法運算。把兩個32位操作數都分成高16位與低16位,分別對兩個高16位及兩個低16位進行加法運算,在得到高16位與低16位的加法運算結果後,把高16位運算結果與低16位運算結果合並成一個32位數。合並方法是:檢測低16位運算結果的進位位,如果進位位為0,把高16位運算結果與低16位運算結果合並成一個32位數;如果進位位為1,高16位運算結果加1,把加1後的高16位運算結果與低16位運算結果合並成一個32位數;高16位運算結果的進位標志為合並數據的進位標志。
    2、32位有符號加法、有符號減法、無符號減法運算。把兩個32位操作數都分成高16位與低16位,每個操作數的高16位與低16位的符號標志均為該32位操作數的符號標志,分別對兩個高16位及兩個低16位進行運算,在得到高16位與低16位的運算結果後,把高16位運算結果與低16位運算結果合並成一個32位數。合並方法是:首先檢測高16位運算結果與低16位運算結果的符號是否相同。 
    (1)如果符號相同,高16位運算結果的進位標志為合並數據的進位標志;檢測低16位運算結果標志中的進位位,如果進位位為0,把高16位運算結果與低16位運算結果合並成一個32位數;如果進位位為1,高16位運算結果加1,把加1後的高16位運算結果與低16位運算結果合並成一個32位數。
    (2)如果符號相異,檢測高16位的運算結果是否為0,如果高16位運算結果為0,把高16位的運算結果與低16位的運算結果合並成一個32位數,運算結果的符號標志為低16位運算結果的符號標志;如果高16位的運算結果不為0,把低16位運算結果的數據翻轉,把高16位運算結果的數據減1,把減1後的高16位運算結果與翻轉後的低16位運算結果合並成一個32位數,運算結果的標志為高16位運算結果的標志。
  (一)32位乘法、除法運算
    1、32位乘法運算。把兩個乘法操作數都分成高16位與低16位兩個數據,先把一個乘法操作數的高16位分別與另一個乘法操作數的高16位及低16位相乘,再把這個操作數的低16位分別與另一個乘法操作數的高16位及低16位相乘,然後用加法合並成一個64位的結果數。
    2、32位除以16位的除法運算。被除數是32位,除數是16位時,先用高16位進行除法運算,除商是32位整數,再用低16位進行除法運算,除商是16位整數與16位小數。把32位的除商整數結果與16位的除商整數結果用加法運算合並成一個32位整數,合並後的32位整數沒有進位位,運算結果由32位整數與16位二進制小數組成。
    3、32位除以32位的除法運算
    (1)32位的除法運算是把一個32位除數轉換成兩個16位乘16位的除數,然後進行兩次除法運算。由於16位數的最大數值是FFFFH,兩個16位數相乘的最大值是FFFE0001H,因此,進行32位除法運算時,被除數與除數的最大數值不能大於FFFE0001H。進行除法運算前要先檢測被除數與除數是否大於FFFE0001H,如果大於該數值就不能進行32位的除法運算。檢測方法一是:把FFFE0001H做為被減數,兩個32位的操作數做為減數,分別進行無符號減法運算,檢測運算結果符號標志,只要兩個運算結果標志中的符號標志位任意一個為1,就退出32位除法運算;反之,則運算繼續進行。檢測方法二是:把32位操作數的最大值限定到小於FFFDFFFFH的範圍,用FFFDH做為被減數,兩個操作數的高16位做為減數,分別進行無符號減法運算,檢測運算結果符號標志,只要兩個運算結果標志中的符號標志位任意一個為1,就退出32位除法運算;反之,則運算繼續進行。
    FFFDFFFFH的10進制數值為4294836223,單片機進行數據處理一般達不到這樣大的數值,用戶編程更清楚所處理數據的範圍,如果數據處理的範圍比10的9次方小幾個數量級,可以不進行檢測直接進入除法運算。
    (2)檢測32位的除數是否為0,如果為0就退出運算。
    (3)把32位的除數轉換成兩個16位數相乘,兩個16位數相乘的結果與32位除數相等。轉換方法:設:32位的除數為A1,當A1/B1=C1時,有A1=B1*C1。令:B1=FFFFH,進行A1/B1運算,C1的運算結果用16位整數與16位小數表達,C1表達的數可以進行精度為16位的二進制倒數運算。
    (4)把32位的被除數也轉換成兩個16位數相乘。設:32位的被除數為A2,當A2/B2=C2時,有A2=B2*C2。令:B2=FFFFH,任意一個小於FFFE0001H的32位數除以B2後都可以得到一個小於FFFFH的16位數C2,C2用一個16位整數與一個16位小數表達。
    (5)設:32位除法運算為C=A2/A1,由於:A1=(FFFFH)*C1,A2=(FFFFH)*C2,有:32位的除法運算為:C=C2/C1。 
    C2由一個16位整數與一個16位小數兩部分組成,令:C2=R1+R2,R1為整數部分,R2為小數部分。
    C1也由16位的整數部分與16位的小數部分組成,可以進行16位的倒數定點數計算,令:C1的倒數運算結果為R3。
    (6)32位的除法運算為:
    C=C2/C1
    =(R1+R2)*R3
    =R1*R3+R2*R3
    R1*R3的運算結果為一個32位整數數,設:運算結果的高16位為R4,低16位為R5。
    R2*R3的運算結果為一個16位整數與16位小數,設:16位整數為R6,小數為R7。
   把R1*R3與R2*R3的運算結果合並成一個32位整數與一個16位小數。合並過程是:R5+R6為合並後的低16位整數,R5加R6的進位位與R4相加為合並後的高16位整數,高16位沒有進位位。R7為16位小數。
    4、32位除32位運算的快捷方法
    由上述32位除32位的運算知,32位除法運算是把被除數轉換成B2與C2兩個16位數據,B2*C2等於被除數,把除數轉換成B1*C1,B1*C1等於除數。當B1=B2時,32位的除法運算就成了C2/C1的運算。
    既然B1與B2可以是FFFFH,由於它沒有參加運算,B1與B2只要不小於FFFFH就行。令B1=B2=10000H,被除數與除數都是右移16位。由於不再進行32位除16位的運算分解被除數與除數,也就不需要對被除數與除數是否大於FFFE0001H進行檢測了。32位除32位快捷運算過程如下:
   (1)檢測除數是否為0,為0時退出
   (2)把32位除數的高16位做為16位整數,把低16位做為16位小數,進行倒數運算。
   (3)把32位被除數的高16位做為16位整數,把低16位做為16位小數,分別與除數的倒數運算結果進行乘運算。16位整數與除數的倒數運算結果相乘後得到32位的整數運算結果。16位小數與除數的倒數運算結果相乘後得到16位整數與16位小數。
   (4)把兩次運算結果合並成整數與小數兩個部分,整數部分為32位,小數部分為16位。
 返回上頁
 返回首頁