การเปรียบเทียบจำนวนเต็มทำงานอย่างไรภายใน


18

เช่นเมื่อเปรียบเทียบจำนวนเต็มสองจำนวนดังนี้ในภาษา C-like:

if (3 > 2) {
    // do something
}

การตัดสินว่า 3 นั้นมากกว่า 2 (จริง) หรือไม่ (เท็จ) ที่ทำขึ้นภายใน?


19
คำตอบในปัจจุบันมี ok สำหรับกรณีที่เมื่อ comparation เป็นเรื่องเกี่ยวกับการแสดงออกของตัวแปร แต่ขาดคำปฏิเสธว่าคอมไพเลอร์ที่ทันสมัยมากจะดูที่ชิ้นส่วนของรหัสตรวจสอบว่าการแสดงออกมักจะเป็นจริง (เพราะตัวอักษร) และก็ไม่สนใจifโดยสิ้นเชิง do somethingจะตรงไปที่การเข้ารหัส
SJuan76

3
สำเนาที่เป็นไปได้ของคอมพิวเตอร์ทำงานอย่างไร

3
@Snowman ฉันไม่เห็นด้วย คำถามเกี่ยวกับการเขียนโปรแกรม "ทำงานอย่างไร" ใด ๆ สามารถย่อลงไปถึงคำถามนั้นได้ แต่นั่นไม่ได้ทำให้ซ้ำซ้อน
user1643723

1
@ user1643723 มันทำเมื่อฟังก์ชั่นดังกล่าวเป็น opcode เฉพาะ
chrylis -on strike-

1
@ user1643723 คำถามที่ถามเกี่ยวกับวิธีการที่คอมพิวเตอร์ทำการดำเนินการขั้นพื้นฐานและคำตอบยอดนิยมกล่าวถึงประตูตรรกะและตารางตรรกะ สองหัวข้อที่ครอบคลุมอย่างกว้างขวางในคำตอบยอดนิยมของเป้าหมายที่เป็นเป้าหมายซึ่งตอบคำถามของคุณด้วย

คำตอบ:


61

ลงไปสู่หลุมกระต่ายใช่มั้ย ตกลงฉันจะลองดู

ขั้นตอน 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 และอื่น ๆ

Half-Adder

การลบเป็นอย่างไร การลบเป็นอีกรูปแบบหนึ่งของการเพิ่ม:

A - B = A + (-B)

ALU คำนวณ-Bโดยการเติมเต็มสองBของ เมื่อมันถูกแปลงเป็นค่าลบการส่งค่าไปยังตัวบวกจะส่งผลให้เกิดการลบ

ขั้นตอนที่ 4: ขั้นตอนสุดท้าย: ทรานซิสเตอร์บนชิป

การดำเนินงานของงูจะถูกดำเนินการโดยใช้การรวมกันของชิ้นส่วนไฟฟ้าที่โต้ตอบที่จะสร้าง 'ประตูตรรกะ' เช่นที่พบในตรรกะ transitor ทรานซิสเตอร์หรือ TTL หรือในCMOS คลิกที่นี่เพื่อดูตัวอย่างเพื่อดูว่ามีการต่อสายอย่างไร

บนชิปแน่นอน "วงจร" เหล่านี้มีการใช้งานในวัสดุบิตที่เป็นสื่อกระแสไฟฟ้าและไม่นำไฟฟ้านับล้าน ๆ ชิ้น แต่หลักการก็เหมือนกับว่าพวกมันเป็นส่วนประกอบขนาดใหญ่บนเขียงหั่นขนม ดูวิดีโอนี้ซึ่งแสดงให้คุณเห็นทรานซิสเตอร์ทั้งหมดบนไมโครชิปผ่านเลนส์ของกล้องจุลทรรศน์อิเล็กทรอนิกส์

หมายเหตุเพิ่มเติมบางส่วน:

  1. รหัสที่คุณเขียนจะถูกคอมไพล์เลอร์จริง ๆ แล้วไม่ประมวลผล ณ รันไทม์เนื่องจากประกอบด้วยค่าคงที่เพียงอย่างเดียว

  2. คอมไพเลอร์บางตัวไม่คอมไพล์รหัสเครื่อง แต่แนะนำเลเยอร์อื่นเช่น Java bytecode หรือ. NET ภาษากลาง แต่ในที่สุดมันก็ถูกเรียกใช้ผ่านภาษาเครื่อง

  3. การคำนวณทางคณิตศาสตร์บางอย่างนั้นไม่ได้คำนวณจริง พวกมันถูกค้นหาในตารางขนาดใหญ่บนหน่วยประมวลผลร่วมทางคณิตศาสตร์หรือมีการรวมกันของการค้นหาและการคำนวณหรือการแก้ไข ตัวอย่างจะเป็นฟังก์ชันในการคำนวณสแควร์รูท พีซีซีพียูสมัยใหม่แต่ละตัวมีหน่วยประมวลผลร่วมจุดลอยตัวที่สร้างขึ้นในซีพียูแต่ละคอร์


3
FWIW การอ้างถึง TTL อาจทำให้สับสนเนื่องจากแทบไม่มีโปรเซสเซอร์ที่ทันสมัยใช้การส่งสัญญาณ TTL ส่วนใหญ่ใช้ CMOS FETs และแรงดันไฟฟ้าต่ำกว่าแทน 5v BJT
whatsisname

2
CMOSจะเป็นการอ้างอิงที่ดีกว่า TTL อย่างที่ @whatsisname แนะนำเพราะไม่เพียง แต่จะแม่นยำมากขึ้นสำหรับสิ่งที่เกิดขึ้นในโปรเซสเซอร์สมัยใหม่มันยังมีแนวคิดที่เรียบง่ายกว่ามาก
จูลส์

3
@JackAidley นั่นคือความหมายของส่วนนี้: "ในคำอื่น ๆ 2 ถูกลบออกจาก 3 ในหนึ่งคำสั่งและคำสั่งต่อไปตรวจสอบเพื่อดูว่ามันล้น"
KutuluMike

1
Nitpicking: ฉันคิดว่าCMPน่าจะใช้ไม่ใช่SUB- แต่หลังจากนั้นอีกครั้งซึ่งมีมากหรือน้อย " SUBเมื่อผลลัพธ์ถูกเพิกเฉยและมีการตั้งค่าเฉพาะธง"
Hagen von Eitzen

5
คำจำกัดความของคุณครึ่งบวกและเต็มบวกไม่ถูกต้อง adder ครึ่งใช้สองอินพุต 1 บิตและส่งกลับผลรวมและดำเนินการ แอดเดอร์แบบเต็มใช้อินพุทของการพกพาเพิ่ม แต่ยังคงเป็นบิตเดียว มีหลายวิธีในการสร้าง adder N-bit วิธีที่ง่ายที่สุดคือ adder ที่มีระลอกคลื่นกระเพื่อมซึ่งเป็นเพียงห่วงโซ่ของ N แอดเดอร์แบบเต็ม ในทางปฏิบัติสำหรับ Ns ที่ใหญ่กว่านี้มีความล่าช้าค่อนข้างแย่ดังนั้นการออกแบบที่ซับซ้อนมากขึ้นจะใช้ในการออกแบบ CPU ที่ทันสมัย
Voo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.