三亞學院信息與智能工程學院 魏爽 張晶
在《計算機組成原理》的教學中,計算機的運算方法是一個重難點內容,而其中定點運算中的除法運算在很多教材中都只給出了它的基本運算步驟,學生通過學習后不能真正理解這種算法的原理。本文結合所授課對象的實際情況,對補碼除法的教學方法進行探討,提出了一種可行的教學方法。
乘除法運算是計算機中的重要運算。實現乘除運算的方法也很多,既可以通過硬件電路實現,也可由軟件編程的方式實現,或者將兩者相結合來實現。盡管運算實現的方法不同,然而它們實現的算法卻是相同的。因此,深入理解乘除運算的運算原理,對于乘法器、除法器的設計或實現乘除運算的程序設計是非常重要的。計算機中常用的編碼,如原碼或補碼均可實現乘除運算。原碼因為其編碼規則的特殊性,因此,通過原碼進行乘除運算的原理比較簡單,實現起來也非常方便。在專門的乘法器和除法器或以乘除運算為主的計算機中,可以采用原碼乘除運算[1]。但是原碼進行加減運算卻非常繁瑣,而補碼的加減運算則比較簡單,所以在以加減運算為主的通用機中,大多采用補碼編碼方式。在補碼制機器中,數據均以補碼形式表示與存儲。如果用原碼進行乘除運算,則要經過繁鎖的變補操作,嚴重影響運算的速度,所以要研究直接用補碼進行乘除運算的算法,以加速計算機進行乘除運算的效率[2]。根據筆者在五年教學中的體會,在本文中簡要敘述了有關的算法,重點討論了算法的證明,給出了一種簡單易懂的證明方法。
為了下文容易理解補碼除法,本節首先簡單介紹下原碼除法的原理以及上商規則,原碼除法的運算過程可以簡單的歸納為:比較、上商、求新余數。原碼與真值就相差一個符號位,原碼數值部分就是真值的絕對值,而乘除運算的乘積或商的符號與兩個操作數的符號相關,同號為正,異號為負。因此,用原碼進行除法運算時,可以將兩個操作數,也就是被除數和除數的符號位進行異或運算得到商的符號位。因為如果兩個操作數符號相同,那么商應該為正,也就是商的符號位應該是0,而兩個符號位如果相同,則將兩符號位進行異或運算時,根據異或運算的規則,異或運算的結果正好是0。而如果兩個操作數的符號不同,那么商應該為負,也就是商的原碼的符號位應該是1,而兩個不同的符號位進行異或運算時,根據異或運算規則,其結果也正好是1。把被除數和除數的絕對值進行相除得到商的絕對值,也就是商的原碼的數值部分。因此,原碼除法的原理很簡單,關鍵是如何上商。上商原則就是比較被除數(余數)的絕對值與除數的絕對值,如果被除數或余數的絕對值大,則上商1,否則,上商0,因此,要確定上商,就需要進行比較。
比較其實就是將兩操作數的絕對值做減法運算,然后通過差的符號判斷兩操作數的相對大小[3]。而在計算機中進行加減運算,采用的是操作數的補碼,因為補碼制可以將減法運算轉換為加法運算,并且符號位可以直接參與運算,最終的計算結果也是和或差的補碼,因此直接根據結果的符號位就能很容易判斷兩操作數絕對值的大小。因此,比較是將被除數(或余數)和除數的絕對值用補碼表示,為方便說明,這里被除數(或余數)用X表示,除數用Y表示,計算[|X|-|Y|]補=|X|補+[-|Y|]補,因此,每次比較時,都是計算|X|補+[-|Y|]補,然后根據結果的符號位得到比較結果。
上商規則就是,如果|X|補+[-|Y|]補的結果的符號位為0,表示被除數(或余數)的絕對值大于除數的絕對值,這樣商就應該上1。如果|X|補+[-|Y|]補的結果的符號位為1,表示被除數(或余數)的絕對值小于除數的絕對值,這樣商就應該上0。
新余數要根據本次上商的結果,經過運算之后得到:若本次商上1,則將余數左移一位,再減去除數得新余數;若本次上商為0,那么則這次不應該減去除數,因此,需要加上|Y|]補恢復余數,再將余數左移一位之后,再減去除數得到新的余數。這種方式就是恢復余數法。當然,也可以將這個過程歸納下,即本次上商為1時,將余數左移一位,再減去除數得新余數。本次上商為0時,將余數左移一位,再加上除數得新余數,這就是所謂的不恢復余數法。
(1)先將兩操作數用原碼表示,取兩操作數原碼的符號位進行異或運算,得到結果的符號位。再取兩操作數原碼的數值部分,作為兩操作數的絕對值。再寫出兩操作數絕對值的補碼形式,同時把負除數的絕對值的補碼也表示出來,為后面做減法運算做好準備。
(2)將被除數的絕對值的補碼加上,然后看結果的符號位是0還是1,如果是0,則上商1,再把結果左移一位,加上負的除數的絕對值的補碼得到新的余數。如果是1,則商上0,如果按照恢復余數法,就把結果再加上除數絕對值的補碼恢復余數,然后將恢復后的余數左移一位再加上負除數的絕對值的補碼得到新的余數。如果按照不恢復余數法,則將結果左移一位,再加上除數的絕對值的補碼得到新的余數。
(3)重復步驟2若干次,得到所需位數的商即可。一般我們保持商的位數與兩操作數的位數一致即可。
補碼除法的運算過程跟原碼除法類似,主要也是需要解決三個問題,一是確定上商;二是新余數的形成方式;三是商符的確定。但是,補碼除法中參與運算的兩操作數用補碼來表示。而上商的原則是根據操作數絕對值的大小來決定的,這就需要確定如何通過補碼運算來判斷兩操作數絕對值的大小,從而決定上商。
從本質上來講,上商和新余數的形成是統一的,要確定上商0還是1,就是要比較被除數與除數絕對值的大小,當被除數的絕對值大于除數的絕對值時。這里需要分兩種情況進行討論,一是被除數和除數同號,在這種情況下,商為正,因此,商的補碼與其原碼是相等的,所以在夠減的情況下,商上1,不夠減的情況下,商上0。第二種情況,當被除數和除數異號時,商為負,這時,商的補碼與原碼,在從低位往高位看,找到第一個1時,在這個1的右邊部分,包括這個1,與原碼是相同的,在1的左邊,與原碼是相反的。但是此時,商并沒有確定,因此,也不能確定此刻上商是在1的左邊還是右邊。因此,約定用補碼進行除法運算時,商的最末尾采用恒置1的方式上商。這樣一來,商的最末尾為1,那么現在上的每一位商均在1的左邊,也就是商的補碼與原碼是相反的,因此,上商原則也應該相反,所以,在夠減的情況下,商上0,在不夠減的情況下,商上1。因此,將上述兩種情況歸納,得出如下結論:當被除數與除數同號,上商規則是夠減上1,不夠減上0;當被除數與除數異號時,上商規則是夠減上0,不夠減上1。因此,現在的關鍵問題就是如何通過操作數的補碼進行運算,來判斷夠減與不夠減的條件。下面,通過簡單易懂的方式給出證明。
夠減等價于被除數的絕對值大于除數的絕對值,為了方便后面用表達式進行說明,這里被除數用X表示,除數用Y表示,下面就X,Y分別為正、負四種不同的情況進行討論。特別說明:以下所有運算都是用X,Y的補碼形式進行的,而不是兩操作數的真值直接運算。
(1)X>0,Y>0,則|X|>|Y|?X>Y?X-Y>0,這時,我們發現,這種情況下,X-Y與Y是同號的,則夠減,X-Y與Y是異號的,則不夠減。
(2)X<0,Y<0,則|X|>|Y|?X
因此,這兩種情況下總結的結論就是,在X與Y同號的情況下,當X-Y與Y同號時,夠減,當X-Y與Y異號時,不夠減。
(3)X>0,Y<0,則|X|>|Y|?X>-Y?X+Y>0,這時,我們發現,這種情況下,X+Y與Y是異號的,則夠減,X+Y與Y是同號的,則不夠減。
(4)X<0,Y>0,則|X|>|Y|?-X>Y?X+Y<0,這時,我們發現,這種情況下,X+Y與Y是異號的,則夠減,X+Y與Y是同號的,則不夠減。
因此,這兩種情況下總結的結論就是,在X與Y異號的情況下,當X+Y與Y異號時,夠減,當X+Y與Y同號時,不夠減。
再結合上述的上商規則,則有以下結論:
(1)當X,Y同號時,在X-Y與Y同號時,上商1,在X-Y與Y異號時,上商0。
(2)當X,Y異號時,在X+Y與Y同號時,上商1,在X+Y與Y異號時,上商0。
新余數的形成與上商是緊密相關的,因此,下面也分四種情況來討論新余數的形成方法。同樣,以下所有的加減運算都是在補碼下進行的。
(1)X與Y同號,X-Y與Y同號,商上1。因為這種情況是夠減的,所以新余數為上一次余數左移一位,再減去Y,假設用Ri表示上一次的余數,則新余數Ri+1=2Ri-Y。
(2)X與Y同號,X-Y與Y異號,商上0。因為這種情況是不夠減的,所以需要先恢復余數,而原來的余數是減去Y得到的,因此,恢復余數需要加上Y,因此是Ri+Y,再左移一位,即2(Ri+Y),又由于恢復余數后,余數與除數同號,所以,通過減法比較大小,即2(Ri+Y)-Y=2Ri+Y。新余數為上一次余數左移一位,再減去Y,假設用Ri表示上一次的余數,則新余數Ri+1=2Ri-Y。
(3)X與Y異號,X+Y與Y異號,商上0。因為這種情況是夠減的,所以新余數為上一次余數左移一位,而X,Y異號,所以新余數與Y相加比價大小,則新余數Ri+1=2Ri+Y。
(4)X與Y異號,X+Y與Y同號,商上1。因為這種情況是不夠減的,所以需要先恢復余數,而原來的余數是加上Y得到的,因此,恢復余數需要減去Y,因此是Ri-Y,再左移一位,即2(Ri-Y),又由于恢復余數后,余數與除數異號,所以,通過加法比較大小,即2(Ri-Y)+Y=2Ri-Y。
最后,將上商規則與新余數的形成方法進行總結,得到的結論就是:
(1)上商1,則新余數通過2Ri-Y形成。
(2)上商0,則新余數通過2Ri+Y形成。
根據前面的上商規則,我們不難理解得到的商的數值部分是補碼,那么符號位是不是也是補碼的符號位呢?事實證明,商符也是補碼的符號位,也就是說,商符是在求商的過程中自動形成的。因為,在小數定點除法中,為了避免溢出,約定,被除數的絕對值必須小于除數的絕對值。因此,當X與Y同號時,X-Y與Y異號,上商0,正好與商的符號位一致。當X與Y異號時,X+Y與Y同號,上商1,也正好與商的符號位一致。由此可見,商符是在求商的過程中自動形成的。
在教學過程中,學生一般對這部分內容感覺理解起來比較困難,主要是因為按算法進行運算時,在各個不同的運算步驟中都要根據不同的情況來進行分別處理。如比較時要根據除數與被除數同號與否分別作減、加運算;上商時要根據比較的結果是否夠減分別上0或1,而判斷夠不夠減又要分同號異號比較的結果為正還是為負……。總之,如果在教學過程中,授課老師僅僅只是按照算法的運算步驟一步步地介紹算法,學生很難真正理解并掌握這種重要的運算方法,甚至有可能對這門課程的學習失去興趣和信心。所以,若教師能先把補碼一位除法的運算規律總結一下,通過通俗易懂的方法進行說明每一步的由來,然后在教學過程中由淺入深的介紹算法原理并證明它,則教學效果必定能事半功倍。
根據所授課對象的學情考慮,再結合定點除法運算這部分內容的特殊性,給出了定點除法運算原理通俗易懂的證明。同時筆者結合學校目前教學的實際條件,我將本部分的證明內容放在芯位教育平臺相關章節部分,然后組織學生課前進行預習,并討論。最終的教學效果還是非常理想的,學生不僅會進行除法運算,更能理解每一步運算的原理,極大增強了他們繼續學習的信心與興趣。
引用
[1] 李瀟雯.以學生為中心的多元混合式教學活動設計研究與實踐:以“計算機組成原理”課程為例[J].工業和信息化教育,2022(1):52-55.
[2] 王俐.計算機組成原理課程教學改革探析[J].電腦與電信,2021 (8):61-63.
[3] 范喆,沙全友.計算機組成原理課程在線教學設計探討[J].科教文匯(下旬刊),2021(6):110-112.