next up previous contents index
Next: ALU Up: การบวก และ การลบ Previous: การบวก และ การลบ   Contents   Index

การบวกลบค่าไบนารี่

จงบวกค่าไบนารี่ $6_{ten}$ และ $7_{ten}$ และจากนั้นให้ทำการลบค่า $6_{ten}$ ออกจาก $7_{ten}$

                   0000 0000 0000 0000 0000 0000 0000 0111 = 7
              +    0000 0000 0000 0000 0000 0000 0000 0110 = 6
                 _________________________________________
              =    0000 0000 0000 0000 0000 0000 0000 1101 = 13

รูป 3.1 แสดงขั้นตอนการบวก ตัวทดแสดงในวงเล็บ และ ลูกศรแสดงการทด

Figure 3.1: ขั้นตอนการบวก เริ่มจากการบวกบิตทางขวาสุด $0+1$ ได้ผลลัพธ์ $1$, และมีตัวทดเท่ากับ $0$ ต่อมาทำการบวกบิตที่สอง $0+1+1 = 0$, และมีตัวทดเท่ากับ $1$, ในหลักที่สามจะเป็นการบวก $1+1+1$ ได้ผลลัพธ์ $1$, และมีตัวทดเท่ากับ $1$, ในหลักสุดท้าย $1+0+0$ ได้ผลลัพธ์ $1$, และมีตัวทดเท่ากับ $0$
\includegraphics[width=4.5in]{fig/Chapter_3/Figure_3.2.eps}

ในการลบค่า $6_{ten}$ ออกจาก $7_{ten}$ สามารถทำได้โดยตรงดังนี้

                   0000 0000 0000 0000 0000 0000 0000 0111 = 7
              -    0000 0000 0000 0000 0000 0000 0000 0110 = 6
                 _________________________________________
              =    0000 0000 0000 0000 0000 0000 0000 0001 = 1

ในคอมพิวเตอร์ จะทำการแปลงค่าให้เป็นเลขลบใน 2's และทำการบวกค่าเข้าด้วยกัน

                   0000 0000 0000 0000 0000 0000 0000 0111 =  7
              +    1111 1111 1111 1111 1111 1111 1111 1010 = -6
                 _________________________________________
              =    0000 0000 0000 0000 0000 0000 0000 0001 =  1

การ Overflow จะเกิดขึ้นเมื่อขนาดรีจีสเตอร์ในฮาร์ดแวร์ไม่เพียงพอที่จะเก็บค่าของตัวแปรที่ได้จากการคำนวณ คำถามที่ตามมาได้แก่ ``ในกรณีใดที่สามารถเกิด overflow ได้'' ในการบวกเลขที่มีเครื่องหมายต่างกันนั้นไม่สามารถเกิด overflow ได้เนื่องจากค่าที่ได้จะมีค่าน้อยกว่าตัวกระทำตัวหนึ่งเสมอ จึงไม่เกิดการ overflow เช่น $-10 + 4 = -6$ ค่าผลลัพธ์จะมีค่าน้อยกว่าตัวกระทำ และสามารถอยู่ในย่านแสดงค่าของ 32 บิตได้

ในกรณีของการลบ เงื่อนไขการเกิด Overflow จะตรงข้ามกับการบวก ถ้าตัวกระทำมีเครื่องหมายเหมือนกัน จะไม่เกิด Overflow สามารถสังเกตได้จากสมการ $x-y = x+(-y)$

กรณีของ Overflow จะเกิดเมื่อมีการบวกหรือลบของไบนารี่ขนาด 32 บิต แล้ว ผลลัพธ์ต้องการพื้นที่ขนาด 33 บิตในการแสดงค่า การเกิด Overflow จะส่งผลให้บิต 32 ที่เป็น Sign bit ถูกตั้งให้เป็นค่าของตัวแปร และบิต 33 เป็นค่า Sign bit หรือเกิดการทดเลข เข้าไปยัง Sign Bit

การเกิด Overflow จะเกิดในการลบเมื่อทำการลบค่าตัวเลขลบออกจากตัวเลขบวก และได้ผลลัพธ์เป็นค่าเลขลบ หรือเมื่อทำการลบค่าตัวเลขบวกออกจากค่าเลขลบ และได้ผลลัพธ์เป็นบวก ซึ่งเป็นการยืมค่ามาจาก Sign Bit รูป 3.2 แสดงกรณีต่างๆ ที่จะเกิด Overflow ในการบวกลบเลข

Figure 3.2: กรณีของ Overflow สำหรับการบวกหรือลบ
\begin{figure}\centering
\begin{tabular}{@{}cccc@{}}\toprule
& & & Result\\
Op...
...- B$ & $< 0$ & $\geq 0$ & $\geq 0$  \bottomrule
\end{tabular}
\end{figure}

ในหลายกรณี ระบบซอฟต์แวร์และฮาร์ดแวร์ ไม่ดำเนินการใดๆ เมื่อเกิด Overflow ขึ้น เช่น การคำนวณตำแหน่งแอดเดรสในหน่วยความจำ และการคำนวณ ในภาษา C ซึ่งต่างจากภาษา Fortran ที่มีการจัดการกับเครื่องหมาย และ Overflow ตามความเหมาะสม สำหรับการคำนวณดังกล่าวคอมพิวเตอร์ MIPS มีคำสั่งสำหรับการคำนวณตัวเลขที่พิจารณาเครื่องหมายดังต่อไปนี้

ในกรณีที่คอมพิวเตอร์ MIPS ตรวจสอบพบ Overflow ที่ต้องสร้าง Exception หรือบางครั้งเรียกว่า Interrupt Exception หรือ Interrupt เป็นการเรียกฟังก์ชั่นที่ไม่ได้มีการเตรียมการตามการทำงานของโปรแกรม ตำแหน่งของคำสั่งที่ก่อให้เกิด Overflow จะถูกเก็บไว้ในรีจีสเตอร์ และคอมพิวเตอร์จะทำการกระโดดการทำงานไปยังตำแหน่งที่ถูกกำหนดไว้สำหรับการจัดการกับ Exception หรือ Interrupt นั้นๆ ในคอมพิวเตอร์ MIPS มี Exception Program Counter (EPC) สำหรับเก็บแอดเดรสของคำสั่งที่ก่อให้เกิด Exception

การที่จะตรวจจับ Overflow คอมพิวเตอร์ MIPS สามารถทำได้จากชุดคำสั่งดังต่อไปนี้

addu $t0, $t1, $t2 # $t0 = sum, but don't trap
xor $t3, $t1, $t2 # check if signs differ
slt $t3, $t3, $zero # $t3 = 1 if sign differ
bne $t3, $zero, No_overflow # $t1, $t2 sign !=, so no overflow
xor $t3, $t0, $t1 # signs =; sign of sum match too?
                  # $t3 negative if sum sign different
slt $t3, $t3, $zero # $t3 = 1 if sum sign different
bne $t3, $zero, Overflow # All three signs !=; go to overflow

สำหรับการบวกแบบไม่พิจารณาเครื่องหมายสามารถตรวจจับ Overflow ได้โดย

addu $t0, $t1, $t2 # $t0 = sum
nor $t3, $t1, $zero # $t3 = NOT $t1
                    # (2's comp - 1: 2^32 - $t1 -1)
sltu $t3, $t3, $t2 # (2^32 - $t1 -1) < $t2
bne $t3, $zero, overflow # if (2^32 - 1 < $t1 +$t2) go to overflow


next up previous contents index
Next: ALU Up: การบวก และ การลบ Previous: การบวก และ การลบ   Contents   Index
Vara Varavithya 2006-11-06