ระบบตัวเลข, Machine code, และ Register
เลขฐานสองและไมโครโปรเซสเซอร์ ไมโครโปรเซสเซอร์สร้างจากวงจรดิจิตอล ดังนั้นนอกจากส่วนที่เป็นวงจร หรือ Hardware แล้ว ทุกอย่างที่เกี่ยวข้องกับไมโครโปรเซสเซอร์จะอยู่ ในรูปของสัญญาณดิจิตอล หรือเลขฐานสองเสมอเช่น ตัวเลข ตัวอักษร หรือค่าสีของจอแสดงผล ที่เก็บอยู่ในตัวแปรหรือ ค่าคงที่ต่างๆ ภาษาเครื่องที่เก็บไว้ในหน่วยความจำ ฮาร์ดดิสก์ หรือทัมบ์ไดรฟ์ สัญญาณที่รับส่งกันผ่าน Data Bus, Address Bus และ Control Bus
ชนิดข้อมูลของไมโครโปรเซสเซอร์ เลขฐานสองขนาด 1 บิท สามารถแสดงข้อมูลได้แค่ 2 แบบเช่น 0 หรือ 1, ถูก หรือ ผิด, ซ้ายหรือขวา, ขาว หรือ ดำ เป็นต้น ดังนั้นถ้าต้องการแสดงตัวเลข หรือข้อมูลมากกว่า 2 แบบ จำเป็นต้องใช้เลข ฐาน 2 ขนาดใหญ่กว่า 1 บิท มาใช้ เลขฐาน 2 ขนาด n bit สามารถแสดงได้ทั้งหมด 2n รูปแบบ ซึ่งจะเป็น อะไรก็ได้ ตั้งแต่ตัวเลข สัญลักษณ์ หรือตัวอักษร ตัวอย่างเช่น ถ้าให้ n = 2 00 = 0, 01 = 1, 10 = 2, 11 = 3 หรือ 00 = เดินหน้า, 01 = ถอยหลัง, 10 = เลี้ยวซ้าย, 11 = เลี้ยวขวา
ชนิดข้อมูลของไมโครโปรเซสเซอร์ ขนาดมาตรฐานของเลขฐานสองที่ใช้ในไมโครโปรเซอร์มีดังต่อไปนี้ 4 bits = 1 Nibble 8 bits = 1 Byte 16 bits = 1 Word 32 bits = 1 Double Word
ชนิดข้อมูลของไมโครโปรเซสเซอร์ ข้อมูลที่เก็บไว้ในไมโครโปรเซสเซอร์, หน่วยความจำ หรือดิสก์ สามารถแบ่ง ออกเป็น ข้อมูลตัวเลข เลขจำนวนเต็มไม่คิดเครื่องหมาย เลขจำนวนเต็มคิดเครื่องหมาย เลขทศนิยมลอยตัว ตัวอักษร (ASCII, UTF-8, UTF-16) ภาษาเครื่อง (Machine Code)
เลขจำนวนเต็มไม่คิดเครื่องหมาย เลขจำนวนเต็มไม่คิดเครื่องหมาย หมายถึงเลขจำนวนเต็มบวกและศูนย์ เท่านั้นไม่มีจำนวนเต็มลบ โดยที่เลขจำนวนเต็มไม่คิดเครื่องหมายของ MPLAB XC32 สามารถกำหนดได้หลายขนาด และแต่ละขนาดมี ขอบเขตของเลขจำนวนเต็มบวกที่สามารถแสดงได้ดังนี้ ชนิดตัวแปร ขนาด ขอบเขตของตัวเลข unsigned char 8 bit 0~255 unsigned short 16 bit 0~65535 unsigned int, unsigned long 32 bit 0~232-1 ชนิดตัวแปร ขนาด ขอบเขตของตัวเลข unsigned long long 64 0~264-1
เลขจำนวนเต็มไม่คิดเครื่องหมาย การบวกเลขจำนวนเต็มไม่คิดเครื่องหมาย ขนาด 8 bit 2010 0001 01002 + 3010 + 0001 11102 5010 0011 00102 จากตัวอย่างนี้จะเห็นว่าผลลัพธ์ของการบวกมีค่าเท่ากับ 50 ซึ่งสามารถเก็บ ในเลขจำนวนเต็มไม่มีเครื่องหมายขนาด 8 bit ได้
เลขจำนวนเต็มไม่คิดเครื่องหมาย การบวกเลขจำนวนเต็มไม่คิดเครื่องหมาย ขนาด 8 bit 12010 0111 10002 + 23010 +1110 01102 35010 1 0101 11102 จากตัวอย่างที่ 2 พบว่าผลลัพธ์ของการบวกมีตัวทดจากบิทที่ 7 ไปยังบิทที่ 8 (Carry Flag) ดังนั้นไม่สามารถเก็บผลลัพธ์ไว้ในเลขจำนวนเต็ม ขนาด 8 bit ได้ ทำให้ผลลัพธ์ของการคำนวณผิดพลาด (0101 11102 = 9410)
เลขจำนวนเต็มไม่คิดเครื่องหมาย การบวกเลขจำนวนเต็มไม่คิดเครื่องหมาย ขนาด 16 bit 12010 0000 0000 0111 10002 + 23010 +0000 0000 1110 01102 35010 0000 0001 0101 11102 จากตัวอย่างที่ 3 พบว่าถ้าเปลี่ยนไปใช้การบวกเลขจำนวนเต็มไม่คิด เครื่องหมายขนาด 16 บิทจะสามารถเก็บผลลัพธ์ไว้ในเลขจำนวนเต็มขนาด 16 bit ได้ ทำให้ผลลัพธ์ไม่ผิดพลาด
เลขจำนวนเต็มไม่คิดเครื่องหมาย ข้อดีของตัวเลขขนาดใหญ่คือมีขอบเขตของตัวเลขที่กว้าง สามารถนำไปใช้ คำนวณผลลัพธ์ที่มีค่ามากได้ แต่ข้อเสียคือทำให้ไมโครโปรเซสเซอร์เสียเวลาในการประมวลผลนานขึ้น ส่วนตัวเลขขนาดเล็กคำนวณเร็ว แต่มีโอกาสที่ผลลัพธ์ของการคำนวณเกิด การผิดพลาดได้ ดังนั้นการเลือกขนาดของตัวเลขจึงมีความสำคัญมากในการใช้งาน ไมโครโปรเซสเซอร์
เลขจำนวนเต็มคิดเครื่องหมาย เลขจำนวนเต็มคิดเครื่องหมาย หมายถึงเลขจำนวนเต็มบวก, ศูนย์, และ จำนวนเต็มลบ โดยคิดแบบ 2’s complement เลขจำนวนเต็มคิดเครื่องหมายของ MPLAB XC32 มีดังนี้ ชนิดตัวแปร ขนาด ขอบเขตของตัวเลข char, signed char 8 bit -128~127 short, signed short 16 bit -32768~32767 ชนิดตัวแปร ขนาด ขอบเขตของตัวเลข int, signed int, long, signed long 32 -231~231-1 long long, signed long long 64 -263~263-1
ตัวอย่างเลข 2’s Complement เลขจำนวนเต็มคิดเครื่องหมายขนาด 8 bit 0101 11102 = +94 1010 00102 = -94 เลขจำนวนเต็มคิดเครื่องหมายขนาด 16 bit 0001 1011 0010 11012 = +6957 1110 0100 1101 00112 = -6957
ตัวอย่างเลข 2’s Complement บิทซ้ายสุดของเลขจำนวนเต็มคิดเครื่องหมายเป็นตัวกำหนดเครื่องหมาย ของตัวเลขนั้น ถ้าเป็น 0 แสดงว่าเป็นเลขบวก ถ้าเป็น 1 แสดงว่าเป็นเลขลบ เราเรียกบิทซ้ายสุดของเลขจำนวนเต็มคิดเครื่องหมายว่าบิทเครื่องหมาย (Sign Bit)
การคำนวณเลขจำนวนเต็มคิดเครื่องหมาย การบวกเลขจำนวนเต็มคิดเครื่องหมาย ขนาด 8 bit 2010 0001 01002 - 3010 + 1110 00102 - 1010 1111 01102 ข้อสังเกต ในตัวอย่างนี้การบวกเลขไม่มีตัวทดจากบิทที่ 6 ไปยังบิทที่ 7 และไม่มี ตัวทดจากบิทที่ 7 ไปยังบิทที่ 8 ผลลัพธ์ออกมาถูกต้อง
การคำนวณเลขจำนวนเต็มคิดเครื่องหมาย การบวกเลขจำนวนเต็มคิดเครื่องหมาย ขนาด 8 bit 3010 0001 11102 - 2010 + 1110 11002 1010 1 0000 10102 ข้อสังเกต ในตัวอย่างนี้การบวกเลขมีตัวทดจากบิทที่ 6 ไปยังบิทที่ 7 และมีตัวทด จากบิทที่ 7 ไปยังบิทที่ 8 ผลลัพธ์ออกมาถูกต้อง
การคำนวณเลขจำนวนเต็มคิดเครื่องหมาย การบวกเลขจำนวนเต็มคิดเครื่องหมาย ขนาด 8 bit 11310 0111 00012 + 2010 + 0001 01002 13310 1000 01012 = -12310 ข้อสังเกต ในตัวอย่างนี้การบวกเลขมีตัวทดจากบิทที่ 6 ไปยังบิทที่ 7 แต่ไม่มีตัวทด จากบิทที่ 7 ไปยังบิทที่ 8 ผลลัพธ์ออกมาผิดพลาด
การคำนวณเลขจำนวนเต็มคิดเครื่องหมาย การบวกเลขจำนวนเต็มคิดเครื่องหมาย ขนาด 8 bit - 11310 1000 11112 - 2010 + 1110 11002 - 13310 1 0111 10112 = 12310 ข้อสังเกต ในตัวอย่างนี้การบวกเลขไม่มีตัวทดจากบิทที่ 6 ไปยังบิทที่ 7 แต่มีตัวทด จากบิทที่ 7 ไปยังบิทที่ 8 ผลลัพธ์ออกมาผิดพลาด
การตรวจสอบความถูกต้องของการคำนวณ การบวกเลขจำนวนเต็มไม่คิดเครื่องหมาย ขนาด n bit ผลลัพธ์ออกมาถูกต้อง ถ้าไม่มีตัวทดจากบิทที่ n-1 ไปยังบิทที่ n ถ้ามีตัวทดจากบิทที่ n-1 ไปยังบิทที่ n เราเรียกบิทที่ n นี้ว่า Carry Flag
การตรวจสอบความถูกต้องของการคำนวณ การบวกเลขจำนวนเต็มคิดเครื่องหมาย ขนาด n bit ผลลัพธ์ออกมาถูกต้อง ถ้าไม่มีตัวทดจากบิทที่ n-2 ไปยังบิทที่ n-1 และไม่มีตัวทดจากบิทที่ n-1 ไปยัง บิทที่ n ถ้ามีตัวทดจากบิทที่ n-2 ไปยังบิทที่ n-1 และมีตัวทดจากบิทที่ n-1 ไปยังบิทที่ n ผลลัพธ์ออกมาถูกต้อง เราเรียกว่าการเกิด Overflow ถ้าไม่มีตัวทดจากบิทที่ n-2 ไปยังบิทที่ n-1 แต่มีตัวทดจากบิทที่ n-1 ไปยังบิทที่ n ถ้ามีตัวทดจากบิทที่ n-2 ไปยังบิทที่ n-1 แต่ไม่มีตัวทดจากบิทที่ n-1 ไปยังบิทที่ n
MSB และ LSB เลขฐาน 2 ในแต่ละบิทมีความสำคัญไม่เท่ากัน บิทที่อยู่ด้านซ้ายสุดจะเป็น บิทที่มีความสำคัญที่สุด (Most Significant Bit: MSB) และบิท ที่ 0 เป็นบิทที่มีความสำคัญน้อยที่สุด (Least Significant Bit: LSB) ตัวอย่างที่ 1 เลขจำนวนเต็มขนาด 8 bit จะมี MSB อยู่ที่บิทที่ 7 B7B6B5B4 B3B2B1B0 1001 00102 = 14610 หรือ -110 0001 00102 = 1810
MSB และ LSB ตัวอย่างที่ 2 เลขจำนวนเต็มขนาด 8 bit จะมี LSB อยู่ที่บิทที่ 0 B7B6B5B4 B3B2B1B0 1001 00102 = 14610 หรือ -110 1001 00112 = 14710 หรือ -109 จากทั้ง 2 ตัวอย่างจะเห็นว่าถ้าค่าของ LSB ไม่เท่ากัน ค่าของตัวเลขจะ ต่างกันเพียงแค่ 1 แต่ถ้าค่าของ MSB ไม่เท่ากัน ค่าของตัวเลขจะแตกต่างกันมาก ดังนั้น MSB จึงมีความสำคัญมากที่สุด
จำนวนจุดลอยตัว (Floating Point) จำนวนจุดลอยตัวเป็นวิธีที่นิยมใช้ในการแทนเลขทศนิยมด้วยเลขฐาน 2 รูปแบบ จำนวนจุดลอยตัวขนาด 32 บิท ประกอบด้วย 1 บิทเครื่องหมาย 8 บิท Exponent และ 23 บิท mantissa s e7…e0 1.m21…m0
จำนวนจุดลอยตัว (Floating Point) sign bit exponent mantissa
จำนวนจุดลอยตัว (Floating Point) จำนวนจุดลอยตัวของ MPLAB XC32 มีดังนี้ ชนิดตัวแปร Man ตัวคูณ float, double 23 บิท -1.9999997615814208984375~1.9999997615814208984375 8 บิท 2-127~2128 long double 52 บิท -1.9999999999999995559107901499374~1.9999999999999995559107901499374 11 บิท 2-1023~21024
รหัส ASCII เป็นการใช้จำนวนตัวเลขแทน ตัวหนังสือและรหัสพิเศษต่างๆ เช่น 48105710 แทน ‘0’‘9’ 65109010 แทน ‘A’‘Z’ 971012210 แทน ‘a’‘z’
การแปลงรหัส ASCII การแปลงตัวพิมพ์เล็กให้เป็นตัวพิมพ์ใหญ่ ‘B’ = ‘b’ – ‘a’ + ‘A’ การแปลงตัวพิมพ์ใหญ่ให้เป็นตัวพิมพ์เล็ก ‘j’ = ‘J’ – ‘A’ + ‘a’
การตรวจสอบรหัส ASCII การตรวจสอบตัวแปร var1 ว่าเป็นรหัส ASCII ‘-’ if(var1==‘-’) การตรวจสอบตัวแปร var2 ว่าเป็นรหัส ASCII ‘a’‘z’ if( var2 >= ‘a’ & var2 <= ‘z’) การตรวจสอบตัวแปร var3 ว่าเป็นรหัส ASCII ‘0’‘9’ if( var3 >= ‘0’ & var3 <= ‘9’)
ภาษาเครื่อง (Machine Code) เนื่องจากไมโครโปรเซสเซอร์ สร้างจากวงจร ดิจิตอล ดังนั้นคำสั่งที่ใช้ควบคุมการทำงาน ไมโครโปรเซสเซอร์จึงต้องเป็นเลขฐาน 2 เช่นเดียวกัน เราเรียกเลขฐาน 2 ที่เป็นคำสั่งควบคุม ไมโครโปรเซสเซอร์นี้ว่า ภาษาเครื่องหรือ Machine Code
ภาษาเครื่อง (Machine Code) แต่เนื่องจากความยากในการเขียนโปรแกรมเป็นภาษาเครื่อง ดังนั้นในเวลา ต่อมาจึงมีการพัฒนาจากภาษาเครื่องให้เป็นภาษา Assembly, C หรือ C# เพื่อให้สามารถเขียนโปรแกรมได้ง่ายขึ้น แต่อย่างไรก็ตามเมื่อเขียนโปรแกรมเสร็จจะต้องมีการแปลงภาษาต่างๆ เหล่านั้นให้เป็นภาษาเครื่องก่อนที่จะนำไปเก็บไว้ในหน่วยความจำโปรแกรม ของไมโครโปรเซสเซอร์ เพื่อให้ไมโครโปรเซสเซอร์สามารถเข้าใจและ ทำงานตามคำสั่งเหล่านั้นได้
อุปกรณ์เก็บข้อมูลของไมโครโปรเซสเซอร์ อุปกรณ์ที่ใช้ในการจัดเก็บข้อมูลของไมโครโปรเซสเซอร์มีอยู่หลายชนิด คือ Register เป็นอุปกรณ์เก็บข้อมูลที่อยู่ในไมโครโปรเซสเซอร์ สร้างจากวงจร Flip-Flop เป็นอุปกรณ์จัดเก็บข้อมูลที่ทำงานได้เร็วที่สุด แต่สามารถเก็บข้อมูลได้น้อยที่สุด เมื่อ เทียบกับอุปกรณ์เก็บข้อมูลแบบอื่น ใช้เก็บข้อมูลชั่วคราวในระหว่างที่ไมโครโปรเซสเซอร์กำลังคำนวณ
อุปกรณ์เก็บข้อมูลของไมโครโปรเซสเซอร์ Memory (หน่วยความจำ) เป็นอุปกรณ์เก็บข้อมูลที่อยู่ ภายนอกไมโครโปรเซสเซอร์ มีอยู่หลายชนิดเช่น EPROM, SRAM หรือ DRAM เป็นต้น ทำงานได้ช้ากว่า Register แต่เก็บข้อมูลได้มากกว่า Register หน่วยความจำโปรแกรม (Program Memory) ใช้เก็บ โปรแกรมภาษาเครื่องสำหรับควบคุมการทำงานไมโครโปรเซสเซอร์ หน่วยความจำข้อมูล (Data Memory) ใช้เก็บตัวแปรหรือ ค่าคงที่
อุปกรณ์เก็บข้อมูลของไมโครโปรเซสเซอร์ ฮาร์ดดิสก์ และ ทัมบ์ไดร์ฟ เป็นอุปกรณ์ต่อพ่วง (Peripheral Device) ของไมโครโปรเซสเซอร์ ทำงานได้ช้าที่สุดแต่สามารถข้อมูลได้มากที่สุด ใช้ในการเก็บโปรแกรมภาษาเครื่องแบบถาวร ทุกครั้งที่เปิดเครื่อง โปรแกรมภาษาเครื่องจะถูกโหลดจากฮาร์ดดิสก์หรือทัมบ์ไดร์ฟไปใส่ ในหน่วยความจำโปรแกรมเพื่อใช้ควบคุมการทำงาน ไมโครโปรเซสเซอร์ ใช้เก็บข้อมูลประเภทตัวแปรหรือค่าคงที่แบบถาวร
Address ของหน่วยความจำ Address เหล่านี้เป็นเลขจำนวนเต็มไม่คิดเครื่องหมาย มีขนาด เท่ากับขนาดของ Address Bus ของไมโครโปรเซสเซอร์ ดังนั้นขนาดสูงสุดของหน่วยความจำที่สามารถใช้เก็บโปรแกรม หรือข้อมูล จะขึ้นกับขนาดของ Address Bus เช่นถ้า Address Bus มีขนาด 32 bit ไมโครโปรเซสเซอร์สามารถ เก็บข้อมูลในหน่วยความจำข้อมูลได้มากที่สุด 4 GB ในทางปฏิบัติ หน่วยความจำที่ต่อกับไมโครโปรเซสเซอร์อาจจะมี ขนาดเล็กกว่าขนาดสูงสุดที่ไมโครโปรเซสเซอร์สามารถเก็บได้ 0007H 2CH 0006H 4DH 0005H 7FH 0004H 9AH 0003H 21H 0002H 72H 0001H 3AH 0000H 02H
วิธีเก็บข้อมูลในหน่วยความจำ Little Endian เป็นการเก็บข้อมูลโดยเรียงจาก Byte ต่ำสุด ไปยัง Byte สูงสุด ตัวอย่างเช่น การเก็บเลขจำนวนเต็มขนาด 16 bit 1101 1110 1100 0001 Byte 1 Byte 0 0003H … 0002H 0001H 1101 1110 0000H 1100 0001
วิธีเก็บข้อมูลในหน่วยความจำ Big Endian เป็นการเก็บข้อมูลโดยเรียงจาก Byte สูงสุดไป ยัง Byte ต่ำสุด ตัวอย่างเช่น การเก็บเลขจำนวนเต็มขนาด 16 bit 1101 1110 1100 0001 Byte 1 Byte 0 0003H … 0002H 0001H 1100 0001 0000H 1101 1110
หน่วยความจำ Stack หน่วยความจำ Stack เป็นพื้นที่พิเศษในหน่วยความจำที่มีการเก็บข้อมูล แบบ First In Last Out (FILO) นั่นคือข้อมูลที่ถูกนำไปเก็บไว้ใน หน่วยความจำ Stack ก่อน จะถูกดึงออกมาทีหลังสุด Stack Pointer (SP) เป็น Register พิเศษที่ใช้เก็บ Address ถัดไปที่จะนำข้อมูลมาเก็บไว้ในหน่วยความจำ Stack