# MIPS Multiplication 在MIPS組合語言中,乘法涉及到使用HI和LO register 來存儲64位的乘積。以下是有關MIPS中乘法的一些相關信息: * HI和LO register : HI和LO register 是用來存儲64位乘積的兩個32位 register 。HI register 存儲乘積的最高32位,而LO register 存儲乘積的最低32位。 * mult和multu指令: 這兩個指令用於進行 Signed 和 Unsigned 的32位乘法。 * `mult rs, rt` 和 `multu rs, rt` 的執行會在HI和LO register 中生成64位的乘積。 ## Unsigned Multiply ![image](https://hackmd.io/_uploads/B1QChlS5T.png) 解釋: * 這種乘法遵循類似十進制乘法的過程,但使用二進制數字(0 和 1)。 * 乘數的每一位確定是放置被乘數的一份複製(如果是 1)還是放置 0(如果是 0)。 * 最終結果,二進制為 01001000,對應到十進制的 72。 在二進制中,乘法的規則簡化為: * 0對應於將0放在該位上(0 × 被乘數) * 1對應於將被乘數的一份複製放在該位上(1 × 被乘數) ### 乘法觀察 每位兩步驟: 由於multiplier和產品 register 合併,所以每位需要兩個步驟。這是因為每位都需要進行相乘和將結果加到總和中的步驟。 Hi和Lo register : MIPS register 中的Hi和Lo分別代表了產品 register 的左半部分和右半部分。這對應到MIPS指令MultU,其中U表示Unsigned Multiply。 Signed Multiply: 最簡單的解決方法是將兩個數都當作正數處理,然後在最後根據需要對產品進行補碼。 使用2的補碼的定義,可以在運算過程中對部分乘積進行符號擴展,最後進行減法操作。 Booth's Algorithm是一種優雅的方式,使用相同的硬體結構,以更有效的方式實現 Signed Multiply,同時節省時脈。 ## Signed Multiply ![image](https://hackmd.io/_uploads/rJ6X3gSqp.png) 解釋: * 乘法過程與Unsigned Multiply類似,但需要額外處理符號位和2的補碼。 * 被乘數是1001,乘數也是1001。當兩者相乘時,得到的部分乘積為11111001。 * 進行進一步的位移和加法操作,最終得到結果00110001,這對應於十進制的49。 在 Signed Multiply 中,有兩條規則: * 規則1:被乘數進行符號擴展(Sign Extension): 確保被乘數進行符號擴展,以使其符號位擴展到更高的位數。 * 規則2:乘數的符號位: * 如果符號位(s)為0,則乘數為正,乘法運算將進行正常的乘法。 * 如果符號位(s)為1,則乘數為負,乘法運算將將乘數視為負數進行運算。 * 規則2確保在 Signed Multiply 中正確處理符號位。