เช่นเมื่อเปรียบเทียบจำนวนเต็มสองจำนวนดังนี้ในภาษา C-like:
if (3 > 2) {
// do something
}
การตัดสินว่า 3 นั้นมากกว่า 2 (จริง) หรือไม่ (เท็จ) ที่ทำขึ้นภายใน?
เช่นเมื่อเปรียบเทียบจำนวนเต็มสองจำนวนดังนี้ในภาษา C-like:
if (3 > 2) {
// do something
}
การตัดสินว่า 3 นั้นมากกว่า 2 (จริง) หรือไม่ (เท็จ) ที่ทำขึ้นภายใน?
คำตอบ:
ลงไปสู่หลุมกระต่ายใช่มั้ย ตกลงฉันจะลองดู
ขั้นตอน 1. จาก C ถึงภาษาเครื่อง
คอมไพเลอร์ C แปลงเปรียบเทียบของคุณเพื่อopcodes เก็บไว้ในภาษาเครื่อง ภาษาเครื่องเป็นชุดตัวเลขที่ CPU ตีความตามคำแนะนำ ในกรณีนี้จะมีสองรหัส: "ลบด้วยพก" และ "กระโดดถ้าพก" กล่าวอีกนัยหนึ่งคือ 2 จะถูกลบออกจาก 3 ในหนึ่งคำสั่งและคำสั่งถัดไปจะตรวจสอบว่ามันล้นหรือไม่ คำแนะนำเหล่านี้จะนำหน้าด้วยสองคำแนะนำเพื่อโหลดตัวเลข 2 และ 3 ไปยังตำแหน่งที่สามารถเปรียบเทียบ
MOV AX, 3 ; Store 3 in register AX
MOV BX, 2 ; Store 2 in register BX
SUB AX, BX ; Subtract BX from AX
JC Label ; If the previous operation overflowed, continue processing at memory location "Label"
แต่ละข้อด้านบนมีการแสดงไบนารี ตัวอย่างเช่นรหัสสำหรับSUB
เป็นเลข2D
ฐานสิบหกหรือเป็น00101101
เลขฐานสอง
ขั้นตอน 2. Opcodes ถึง ALU
opcodes เลขคณิตชอบADD
, SUB
, MUL
และDIV
ดำเนินการทางคณิตศาสตร์พื้นฐานจำนวนเต็มใช้ALU หรือหน่วยคำนวณและตรรกะที่สร้างขึ้นในซีพียู ตัวเลขถูกเก็บไว้ในการลงทะเบียนโดย opcodes บางตัว opcodes อื่น ๆ สั่งให้ชิปเรียก ALU เพื่อทำคณิตศาสตร์เกี่ยวกับสิ่งที่เก็บไว้ในทะเบียนเวลา
หมายเหตุ: ณ จุดนี้เราไม่มีอะไรที่วิศวกรซอฟต์แวร์จะกังวลหากทำงานกับ3GLเช่น C
ขั้นตอนที่ 3. ALU, half-adder และ full-adder
คุณรู้หรือไม่ว่าการดำเนินการทางคณิตศาสตร์ทั้งหมดที่คุณรู้จักสามารถลดลงเป็นชุดปฏิบัติการ NOR ได้หรือไม่? และนั่นคือวิธีการทำงานของ ALU
ALU รู้วิธีทำงานกับตัวเลขไบนารีเท่านั้นและสามารถดำเนินการทางตรรกะเช่น OR, NOT, AND และ XOR เท่านั้น นอกจากนี้การดำเนินงานของไบนารีและลบจะประสบความสำเร็จกับชุดของตรรกะการดำเนินงานจัดวิธีการบางอย่างในระบบย่อยที่เป็นที่รู้จักในฐานะที่เป็นบวก ระบบย่อยเหล่านี้ประกอบด้วยเครือข่ายของ "half-adders" ที่ทำงานบนสองบิตและกำหนดผลรวมบิตเดียวและแฟล็กดำเนินการบิตเดียว ด้วยการโยงเหล่านี้เข้าด้วยกัน ALU สามารถดำเนินการกับตัวเลขด้วยบิต 8, 16, 32 และอื่น ๆ
การลบเป็นอย่างไร การลบเป็นอีกรูปแบบหนึ่งของการเพิ่ม:
A - B = A + (-B)
ALU คำนวณ-B
โดยการเติมเต็มสองB
ของ เมื่อมันถูกแปลงเป็นค่าลบการส่งค่าไปยังตัวบวกจะส่งผลให้เกิดการลบ
ขั้นตอนที่ 4: ขั้นตอนสุดท้าย: ทรานซิสเตอร์บนชิป
การดำเนินงานของงูจะถูกดำเนินการโดยใช้การรวมกันของชิ้นส่วนไฟฟ้าที่โต้ตอบที่จะสร้าง 'ประตูตรรกะ' เช่นที่พบในตรรกะ transitor ทรานซิสเตอร์หรือ TTL หรือในCMOS คลิกที่นี่เพื่อดูตัวอย่างเพื่อดูว่ามีการต่อสายอย่างไร
บนชิปแน่นอน "วงจร" เหล่านี้มีการใช้งานในวัสดุบิตที่เป็นสื่อกระแสไฟฟ้าและไม่นำไฟฟ้านับล้าน ๆ ชิ้น แต่หลักการก็เหมือนกับว่าพวกมันเป็นส่วนประกอบขนาดใหญ่บนเขียงหั่นขนม ดูวิดีโอนี้ซึ่งแสดงให้คุณเห็นทรานซิสเตอร์ทั้งหมดบนไมโครชิปผ่านเลนส์ของกล้องจุลทรรศน์อิเล็กทรอนิกส์
หมายเหตุเพิ่มเติมบางส่วน:
รหัสที่คุณเขียนจะถูกคอมไพล์เลอร์จริง ๆ แล้วไม่ประมวลผล ณ รันไทม์เนื่องจากประกอบด้วยค่าคงที่เพียงอย่างเดียว
คอมไพเลอร์บางตัวไม่คอมไพล์รหัสเครื่อง แต่แนะนำเลเยอร์อื่นเช่น Java bytecode หรือ. NET ภาษากลาง แต่ในที่สุดมันก็ถูกเรียกใช้ผ่านภาษาเครื่อง
การคำนวณทางคณิตศาสตร์บางอย่างนั้นไม่ได้คำนวณจริง พวกมันถูกค้นหาในตารางขนาดใหญ่บนหน่วยประมวลผลร่วมทางคณิตศาสตร์หรือมีการรวมกันของการค้นหาและการคำนวณหรือการแก้ไข ตัวอย่างจะเป็นฟังก์ชันในการคำนวณสแควร์รูท พีซีซีพียูสมัยใหม่แต่ละตัวมีหน่วยประมวลผลร่วมจุดลอยตัวที่สร้างขึ้นในซีพียูแต่ละคอร์
CMP
น่าจะใช้ไม่ใช่SUB
- แต่หลังจากนั้นอีกครั้งซึ่งมีมากหรือน้อย " SUB
เมื่อผลลัพธ์ถูกเพิกเฉยและมีการตั้งค่าเฉพาะธง"
if
โดยสิ้นเชิงdo something
จะตรงไปที่การเข้ารหัส