โปรแกรมดำเนินการที่ระดับ CPU อย่างไร


14

ฉันรู้ว่านี่เป็นคำถามที่พบบ่อยมาก แต่ฉันมีมุมที่แตกต่างในใจของฉัน ฉันจะพยายามทำให้ชัดเจนที่นี่

จากสิ่งที่ฉันรู้ทุกคำสั่งที่ CPU ดำเนินการอยู่ในภาษาเครื่องและ CPU ทั้งหมดสามารถทำได้คือการดำเนินการทางคณิตศาสตร์ด้วย ALU และทรานซิสเตอร์ (ถ้าเราไปที่ระดับฮาร์ดแวร์)

อย่างไรก็ตามวิธีนี้ง่ายกว่าการพิมพ์เพื่อทำความเข้าใจ ดังนั้นหาก CPU ทั้งหมดทำการบวกลบออกแล้วเป็นอย่างไรโปรแกรมพูดว่าโปรแกรม JAVA ว่าพิมพ์ Hello World ดำเนินการกับการคำนวณทางคณิตศาสตร์เหล่านี้อย่างไร

ฉันหมายถึงโปรแกรมนี้ถูกแปลงเป็นสิ่งที่เป็นเพียงส่วนเสริมสำหรับซีพียูอย่างไร

ป.ล. หากคำถามนี้ใช้ไม่ได้กับเว็บไซต์นี้ฉันต้องขออภัย

----- ตอนที่สอง -----

ตกลง. ขอบคุณทุกคนที่ตอบคำถามนี้อย่างรวดเร็วและด้วยความกระตือรือร้น ฉันคิดว่าการแก้ไขคำถามของฉันจะดีกว่าไปแสดงความคิดเห็นต่อคำตอบทั้งหมดแล้วถามพวกเขาอีกครั้ง

ดังนั้นนี่คือ

ก่อนอื่นทุกคนตอบคำถามตัวอย่างของ Hello World โดยเฉพาะ นี่คือความผิดของฉัน ฉันควรเก็บยาสามัญนี้ไว้ สวัสดีตัวอย่างโลกนำมาซึ่งคำถามเกี่ยวกับอุปกรณ์ส่งออกและวิธีการประมวลผลของมันไม่ได้ จำกัด อยู่เพียงแค่ CPU ซึ่งถูกนำขึ้นมาอย่างถูกต้องในคำตอบของคุณ

ยังมีพวกคุณหลายคนที่ทราบว่า CPU ทำมากกว่าแค่เพิ่ม ฉันเห็นด้วยกับที่ ฉันไม่ได้เขียนมันและคิดไปตลอดทาง จากสิ่งที่ฉันเข้าใจนี่คือกระบวนการ:

  1. อ่านคำแนะนำจากหน่วยความจำ (โดยใช้ข้อมูลและที่อยู่รถประจำทางและสิ่งที่เคาน์เตอร์โปรแกรม)

    1. เก็บข้อมูลใน register ภายใน CPU
    2. ตอนนี้ ALU จะดำเนินการทางคณิตศาสตร์แน่นอนหลังจากถอดรหัสคำแนะนำหรือกระโดดถ้ามันเป็นคำสั่งถ้าชอบ
    3. แล้วสื่อสารกับทรัพยากรอื่น ๆ ถ้าจำเป็นเช่นอุปกรณ์เอาท์พุทเป็นต้น กระบวนการที่นอกเหนือจากนี้เป็นเพียงเล็กน้อยในตอนนี้

ดังนั้นในขั้นตอนที่ 3 ที่ CPU ถอดรหัสการเรียนการสอนและตัดสินใจที่จะดำเนินการทางคณิตศาสตร์ (ที่นี่เรากำลังสมมติว่าไม่มีการดำเนินการอื่น ๆ เช่นกระโดดคำสั่งปัจจุบัน .. ส่วนใหญ่การดำเนินการทางคณิตศาสตร์เสร็จแล้ว .. ดังนั้นเราจะ ) นี่คือที่การสร้างภาพข้อมูลของฉันสิ้นสุดลง วิธีการเรียนการสอนจากโปรแกรมของฉันเป็นเพียงการดำเนินการทางคณิตศาสตร์สำหรับ CPU มันใช้การดำเนินการทางคณิตศาสตร์และคำสั่งนั้นเพื่อจุดประสงค์ของมัน

ฉันหวังว่าฉันจะทำให้ตัวเองชัดเจนในครั้งนี้

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


ฉันเข้าใจว่าคอมไพเลอร์แปลงโปรแกรมเป็นภาษาเครื่อง ฉันแค่มองไม่เห็นภาพของโปรแกรมเป็นการดำเนินการทางคณิตศาสตร์ แม้ว่าโปรแกรมจะเพิ่มตัวเลขสองตัว แต่ก็เป็นที่เข้าใจได้ :)
2827893

1
บางทีคุณควรเริ่มดูชุดคำสั่งจริงของ CPU เช่นตัวง่าย ๆ อย่าง MC6502, Z80 ... จากนั้นดูว่ามีคำแนะนำในการเข้าถึงหน่วยความจำคำแนะนำในการประมวลผลข้อมูลสาขา ... คุณสามารถเดาได้ว่ามันจะเป็นอย่างไร รวมกันสำหรับการใช้อัลกอริทึมใด ๆ
TEMLIB

3
ซีพียูสามารถทำได้มากกว่านี้แน่นอน สิ่งสำคัญคือต้องพูดถึงว่า CPU สามารถทำการเปรียบเทียบและข้ามได้
Theodoros Chatzigiannakis

1
คุณ (ดูเหมือน) ยังคงปฏิเสธที่จะเห็น IF (การตัดสินใจ) และ MOVE (อ่านและเก็บข้อมูล) อย่างแน่นหนาการเขียนโปรแกรมคือ 99% IF และ MOVE เลขคณิตนั้นเป็นโมฆะ ตัวอย่างแรกของคุณ (Hello world) ไม่มีเลขคณิตเลย
edc65

1
1. ฉันคิดว่าคุณมีแนวโน้มที่จะได้รับคำตอบที่ดีถ้าคุณถามคำถามใหม่ด้วยความสับสนใหม่แทนที่จะแก้ไขคำถามนี้เพื่อเปลี่ยนสิ่งที่คุณถาม คุณได้รับคำตอบที่ดีสำหรับคำถามต้นฉบับของคุณและคำถามเดิมของคุณดูเหมือนว่าจะสามารถยืนได้ด้วยตัวเองดังนั้นทำไมไม่ลบการแก้ไขและถามคำถามใหม่ 2. ที่กล่าวมาฉันไม่สามารถเข้าใจส่วนใหม่ คำถามของคุณเกี่ยวกับชิ้นส่วนใหม่คืออะไร? เมื่อคุณพูดว่า "นี่คือที่การสร้างภาพของฉันสิ้นสุด" คุณหมายความว่าคุณไม่เข้าใจขั้นตอนที่ 3 หรือคุณไม่เข้าใจขั้นตอนที่ 3? ถ้าคุณทำคุณไม่เข้าใจอะไร
DW

คำตอบ:


7

คุณสามารถลองใช้โปรแกรมอย่างง่ายและรวบรวมเป็นรหัสเครื่องดั้งเดิม (โดยปกติ Java จะคอมไพล์กับรหัส JVM แต่ Andrew Tennenbaum มีหนังสือที่เขาอธิบายวิธีการออกแบบ CPU ที่ทำงานในลักษณะนั้นดังนั้นมันจะทำ) บน GCC คุณให้คอมไพเลอร์-Sสวิตช์

สิ่งนี้จะบอกคุณว่ามีสิ่งใดที่ยุ่งยากเช่น I / O ถูกนำไปใช้โดยเรียกใช้ระบบปฏิบัติการ ในขณะที่คุณสามารถดาวน์โหลดซอร์สไปยังเคอร์เนล Linux และทำสิ่งเดียวกันสิ่งที่เกิดขึ้นภายใต้ประทุนคือ: ทุกอย่างกำลังจัดการสถานะของหน่วยความจำของคอมพิวเตอร์ตัวอย่างเช่นรายการกระบวนการทำงานหรืออื่น ๆ ที่พูดถึงฮาร์ดแวร์โดยใช้ ที่อยู่หน่วยความจำพิเศษที่ควบคุมหรือใช้คำสั่ง CPU พิเศษเช่นinและoutบน x86 โดยทั่วไปแล้วเฉพาะโปรแกรมพิเศษที่เรียกว่าไดรเวอร์อุปกรณ์จะพูดคุยกับฮาร์ดแวร์เฉพาะและระบบปฏิบัติการจะส่งคำขอเพื่อใช้ฮาร์ดแวร์ไปยังไดรเวอร์ที่ถูกต้อง

หากคุณพิมพ์ "สวัสดีโลก!" คอมไพเลอร์ของคุณจะเปลี่ยนเป็นชุดคำสั่งที่โหลดสตริงลงในตำแหน่งเฉพาะ (ตัวอย่างเช่นการโหลดที่อยู่ของสตริงในหน่วยความจำไปยัง%rdiรีจิสเตอร์) และเรียกใช้ฟังก์ชันไลบรารีด้วยcallคำสั่ง ฟังก์ชันไลบรารีนี้อาจค้นหาความยาวของสตริงด้วยการวนซ้ำจากนั้นเรียกการเรียกของระบบwrite()เพื่อเขียนจำนวนไบต์จากสตริงไปยังไฟล์ descriptor number 1 ซึ่งเป็นเอาต์พุตมาตรฐาน ณ จุดนั้นระบบปฏิบัติการจะค้นหาว่าหมายเลขไฟล์ 1 ของกระบวนการนั้นคืออะไรและตัดสินใจว่าการเขียนนั้นหมายถึงอะไร หากเขียนไปยังเอาต์พุตมาตรฐานพิมพ์บนหน้าจอของคุณจะมีกระบวนการบางอย่างเช่นการคัดลอกไบต์ไปยังบัฟเฟอร์ซึ่งจะถูกอ่านโดยโปรแกรมเทอร์มินัลของคุณซึ่งจะบอกระบบหน้าต่างที่ตัวอักษรจะใส่ที่ใดในแบบอักษร ระบบหน้าต่างจะตัดสินใจอย่างชัดเจนว่าควรมีลักษณะอย่างไรและบอกให้ไดรเวอร์อุปกรณ์วางพิกเซลบนหน้าจอซึ่งทำได้โดยการเปลี่ยนหน่วยความจำวิดีโอ


ขอบคุณ @Lorehead คำอธิบายนี้ดูเป็นตัวอย่างที่ดีของ Hello world
2827893

5

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

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

ในท้ายที่สุดซีพียูของคุณบอกแค่ชิปอื่น ๆ ให้สวยโปรดปรับเปลี่ยนสัญญาณไปยังจอภาพดังนั้นดูเหมือนว่า "Hello World"

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

หาก CPU ของคุณตั้งค่าบรรทัดทั้งหมดสำหรับ H ถึงสูง 7-Segment จะแสดง H แม้ว่า H จะไม่ใช่ตัวเลขที่ CPU จะเพิ่มหรือลบออก

ตอนนี้ถ้าทุกเลเยอร์เห็นด้วยกับสิ่งที่จำเป็นในการทำให้ 7-Segment-display H (ตั้งค่าเฉพาะ 5 บรรทัดสูง) คอมไพเลอร์ Java สามารถสร้างโค้ดเพื่อให้มันแสดง H ได้แน่นอนว่าค่อนข้างไม่สะดวก - ดังนั้นเลเยอร์เริ่มต้น เป็นนามธรรม เลเยอร์ต่ำสุดจะเริ่มต้นด้วย: "โย่มีตัวอักษร 26 ตัวลองกำหนดตัวเลขให้กับตัวอักษรแต่ละตัว - แล้วเราจะให้ตัวอักษร 'H' หมายเลข '72' ได้อย่างไรจากนั้นคุณก็บอกได้ว่า" แสดงตัวอักษร 72 " แทนที่จะเป็น "Set line 309 high, set line 310 high, set line 498 high, set line 549 high, set line 3 high" ดังนั้นแต่ละเลเยอร์จึงเริ่มต้นเป็นข้อมูลนามธรรมวิธีการบรรลุผลลัพธ์ที่แน่นอนดังนั้นคุณไม่จำเป็นต้อง เพื่อดูแลเกี่ยวกับพวกเขา

ดังนั้นมันจึงสรุปได้ถึงการทำแผนที่ huuuuge ของตัวเลขหรือบิตซีพียูสามารถประมวลผลได้จริงตามความหมายที่ทุกคนในโซ่ตกลงกัน


3

ในวิทยาลัยซึ่งเป็นส่วนหนึ่งของหลักสูตรปริญญา CS ฉันได้ศึกษาตัวอย่างเพิ่มเติมของภาษาการถ่ายโอนการลงทะเบียนซึ่งกำหนด CPU ฉันได้รับแรงบันดาลใจให้นำสิ่งที่แตกต่างออกไปและเขียนโปรแกรมจำลองที่ยอมรับสัญกรณ์ดังกล่าวเป็นคำนิยามและเผยแพร่ว่าในฉบับที่ฝังตัวการเขียนโปรแกรมระบบ (ฉบับเดือนมีนาคม 1989) เป็นวิธีการตอบคำถามแบบเดียวกับที่คุณถาม สร้างความเข้าใจที่เข้าใจง่ายของสิ่งเหล่านี้

ในชั้นเรียนเราได้ทำการกลั่นกรองการลงทะเบียนเพื่อถ่ายโอนเข้าสู่ประตูตรรกะจริง ๆ ในรีจิสเตอร์! มันเขียนตัวเอง: ดูทุกอย่างที่มีการลงทะเบียน 'A' เป็นปลายทางและรหัส A = (case1) หรือ (case2) ... และที่ได้รับการแสดงเป็นผลรวมของผลิตภัณฑ์หรือรูปแบบผลรวมของผลิตภัณฑ์ normallized

ในตอนท้ายของหลักสูตรฉันเรียนรู้ว่านี่เป็น CPU จริง: PDP-8 ถ้าฉันจำได้ถูกต้อง

วันนี้คุณสามารถป้อนเกตไดอะแกรมลงในชิปอาเรย์ตรรกะที่ตั้งโปรแกรมได้

นั่นคือส่วนสำคัญของมัน: การลงทะเบียนถูกตั้งค่าด้วยผลลัพธ์ของ AND และ OR หรือทางเข้ากลับสู่รีจิสเตอร์อื่น หนึ่งในค่าที่จะรวมคือค่า opcode

ลองจินตนาการดู: A: = (opcode == 17 & X + Y) | (opcode == 18 & X + Z) | ...

ซีพียูที่ทันสมัยมีความซับซ้อนมากขึ้นด้วยท่อและบัส แต่หน่วยย่อยของแต่ละบุคคลเช่นเดียวกับ ALU ทำงานอย่างนั้น


2

คุณกำลังพิจารณา CPU ที่นี่ แต่มีองค์ประกอบอื่นที่เกี่ยวข้องเมื่อใช้งาน 'Hello World': จอแสดงผล!

สำหรับ CPU ค่าในหน่วยความจำเป็นเพียงตัวเลขที่แสดงเป็นจำนวนบิตที่กำหนด (0's และ 1's)

การเปลี่ยนเป็นตัวอักษรบนหน้าจอเป็นอีกเรื่องหนึ่ง: จอแสดงผลยังมีหน่วยความจำ หน่วยความจำนี้ (หน่วยความจำกราฟิก) ถูกแมปกับ 'พิกเซล' บนหน้าจอ แต่ละพิกเซลถูกเข้ารหัสด้วยค่า: หากเป็นหน้าจอขาวดำพื้นฐานมากค่านั้นเป็นเพียงความเข้มสำหรับการแสดงสีค่าคือการรวมกันของสีแดงสีเขียวและสีน้ำเงิน (RGB) ซึ่งสามารถเข้ารหัสได้หลายวิธี

ดังนั้นเมื่อ CPU 'เขียน' ค่าที่กำหนดลงในหน่วยความจำการแสดงผลพิกเซลจะสว่างขึ้น ในการเขียนตัวอักษรจริง ๆ แล้วเราต้องการแสงหลายพิกเซล โดยทั่วไปคอมพิวเตอร์จะมีชุดอักขระ (จริง ๆ แล้วมีหลายชุด) ที่กำหนดไว้ในระบบปฏิบัติการ (ทำให้นามธรรมของ 'แบบอักษร' ตัวเองที่แมปกับความหมายของสิ่งที่ตัวอักษรแต่ละตัวควรมีลักษณะเหมือนบนหน้าจอ)

ดังนั้นเมื่อมีการคอมไพล์โค้ดมันจะรวมทุกสิ่งที่มาจากไลบรารี่ OS รวมถึงฟอนต์ / char set เป็นต้นซึ่งทำให้ซีพียูรู้ว่าจะเขียนตำแหน่งใดในหน่วยความจำกราฟิก (มันค่อนข้างซับซ้อน แต่เป็นแนวคิดทั่วไป: คอมไพเลอร์มีโค้ดมากกว่าสิ่งที่อยู่ในรหัส 'สวัสดีโลก' ของคุณเพียงอย่างเดียวผ่านทางห้องสมุดที่นำเข้า)

ในท้ายที่สุดมีหลายสิ่งที่เกิดขึ้นตามที่คุณสงสัย แต่คุณไม่จำเป็นต้องเขียนโค้ดทั้งหมด


1

นี่คือวิธีการอย่างเป็นทางการสำหรับคำถามของคุณจากสาขาวิทยาการคอมพิวเตอร์เชิงทฤษฎี

โดยทั่วไปเราสามารถกำหนดการแมประหว่างโมเดลการคำนวณของ CPU และเครื่องทัวริง มีการพิสูจน์ทางทฤษฎีว่าชุดของโปรแกรมทัวริงทั้งหมดที่สามารถจินตนาการได้ (และดังนั้นโปรแกรมที่สามารถจินตนาการได้ทั้งหมดที่ปฏิบัติการได้บนซีพียู) จึงนับไม่สิ้นสุด ซึ่งหมายความว่าเราสามารถระบุทุกโปรแกรมด้วยหมายเลขธรรมชาติที่ไม่ซ้ำกันรวมถึงโปรแกรมที่จะขยายหมายเลขธรรมชาติไปยังเครื่องทัวริ

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

หมายเหตุ: นี่ง่ายเกินไป แต่ในความคิดของฉันให้สัญชาตญาณที่ดี


1

สิ่งที่อาจช่วยได้คือเปลี่ยนความคิดของคุณให้ห่างจาก "การคำนวณทางคณิตศาสตร์" หากคุณกำลังพยายามที่จะขุดสิ่งที่คอมพิวเตอร์กำลังทำอยู่ภายใต้ฝากระโปรงเพื่อพิมพ์ "Hello World" ดีที่สุดที่จะคิดว่าลดลงหนึ่งระดับ "สถานะ" ของคอมพิวเตอร์สามารถอธิบายได้ว่าเป็นชุดของบิตที่เก็บไว้โดยสวิตช์ทรานซิสเตอร์ซึ่งเปิดหรือปิด (หรือตัวเก็บประจุที่มีประจุหรือไม่ประจุ) คอมพิวเตอร์จัดการบิตเหล่านั้นตามกฎ วิธีที่คอมพิวเตอร์อนุญาตให้จัดการบิตเหล่านั้นจะถูกเขียนลงบน CPU ในรูปแบบของทรานซิสเตอร์ซึ่งทำงานของการเปลี่ยนบิตจาก 0 เป็น 1 หรือ 1 เป็น 0

เมื่อ ALU "ทำเลขคณิต" นั่นหมายความว่าจริง ๆ แล้วมันเปลี่ยนสถานะของคอมพิวเตอร์ในลักษณะที่สอดคล้องกับกฎของเลขคณิตของเรา สิ่งที่มันทำคือเปลี่ยนบางส่วน มันเป็นความหมายที่อยู่เบื้องหลังซอฟต์แวร์ที่อธิบายว่าทำไมเราควรคิดว่ามันเป็นการบวกหรือการลบ CPU ไม่ "รู้" ว่ากำลังทำอะไร มันเปลี่ยนจากรัฐหนึ่งไปอีกรัฐและนั่นคือทั้งหมด (อย่างน้อยก็จนกว่า Skynet จะเข้าครอบครอง)

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

IO นั้นไม่แตกต่างกันอย่างแท้จริงเพียงแค่เปลี่ยนบิต ข้อแตกต่างเพียงเล็กน้อยคือบิตเหล่านั้นเชื่อมต่อกับทรานซิสเตอร์ซึ่งในที่สุดจะนำไปสู่การเพิ่มความสว่างของตัวละครบนหน้าจอของคุณ ถ้าฉันอาจจะหวนกลับมาอีกไม่กี่ทศวรรษเมื่อ "Hello World" เรียบง่ายจริง ๆ ก็มีพื้นที่หน่วยความจำที่ถ้าคุณเขียนบิตที่สอดคล้องกับอักขระ ASCII สำหรับ "Hello World" ตัวละครเหล่านั้นจะถูกแสดงโดยตรงไปยัง จอภาพ ทุกวันนี้มันซับซ้อนกว่านี้เล็กน้อยเพราะเรามีการ์ดกราฟิกและระบบปฏิบัติการที่ยุ่งกับมัน แต่แนวคิดพื้นฐานก็เหมือนกัน คุณมีชุดทรานซิสเตอร์ที่เปิดหรือปิดซึ่งเชื่อมโยงกับวงจรไฟฟ้าเพื่อแสดงพิกเซลบนหน้าจอ เราตั้งค่าให้ถูกต้องและดูเหมือนว่า "Hello World" จะปรากฏบนหน้าจอ

ความสับสนเป็นเพียงเรื่องของไวยากรณ์เทียบกับความหมาย พฤติกรรมของ "การเพิ่มครึ่ง" หรือ "การเพิ่มแบบเต็ม" ใน ALU คือไวยากรณ์ มันกำหนดว่าบิตจะออกมาเมื่อคุณใส่บิตความหมายของมันคือแนวคิดของความสามารถในการเพิ่ม คุณและฉันรู้ว่า ALU สามารถ "ทำเพิ่ม" แต่เพื่อให้เข้าใจสิ่งที่เกิดขึ้นภายใต้คุณต้องจำไว้ว่า ALU จะจัดการบิตและไบต์ของไวยากรณ์เท่านั้น


0

ซีพียูทำงานเช่นนี้:

  • เรียกคำสั่งปัจจุบันเพิ่มตัวชี้ "คำสั่งปัจจุบัน"

  • ถอดรหัสมัน (เช่นค้นหาคำสั่งนี้บอกให้ CPU ทำ)

  • ดำเนินการ (ทำตามคำสั่งที่บอกไว้) - ตัวชี้คำสั่งปัจจุบันอาจถูกแก้ไขหากคำสั่งนั้นคล้ายกับ "กระโดด"

  • ทำซ้ำตลอดไป

CPU สมัยใหม่มีความซับซ้อนมากขึ้นและพยายามทับซ้อนกันอย่างหนักและแม้แต่ทำนายส่วนต่างๆของกระบวนการนั้น (เช่นเริ่มดำเนินการในขณะที่ 10 คำแนะนำอื่น ๆ กำลังถอดรหัสในขณะที่ CPU กำลังดึงข้อมูลไปข้างหน้าของตัวชี้ "คำสั่งปัจจุบัน" เพื่อรักษา กระบวนการที่สำคัญเหมือนกันจริงๆ

มีคำแนะนำหลายประเภทตัวอย่างส่วนใหญ่คือ:

  • คำแนะนำ "ย้าย" สิ่งเหล่านี้สามารถคัดลอก X ไปยัง X อื่นโดยที่ X คือหน่วยความจำ (RAM), รีจิสเตอร์หรือที่อยู่ในพื้นที่ I / O หาก CPU รองรับแนวคิดดังกล่าว

  • คำแนะนำในการจัดการสแต็กรวมถึงป๊อปอัปลงทะเบียนกดลงทะเบียนบนสแต็ค ฯลฯ เป็นกรณีพิเศษของคำสั่ง "ย้าย" ที่ใช้และอัพเดตการลงทะเบียน "ตัวชี้สแต็ก"

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

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

  • มีคำแนะนำสาขาที่ข้ามไปยังที่อยู่หน่วยความจำหากตั้งค่าสถานะเฉพาะ จำธง "ศูนย์" ที่กล่าวถึงข้างต้นได้หรือไม่ นอกจากนี้ยังเพิ่มเป็นสองเท่าของการตั้งค่าสถานะ "ถ้าเท่ากับ" ดังนั้นคุณจะเห็นคำแนะนำเช่นเดียวBEQกับ CPU หลายตัวที่แตกแขนงหากตั้งค่าสถานะ "ศูนย์"

  • คำแนะนำที่ดำเนินการทางตรรกะ (AND, OR, NOT), shift shift และบิตทดสอบ พวกเขาอาจส่งผลกระทบต่อธงเช่นคำแนะนำทางคณิตศาสตร์ขึ้นอยู่กับ CPU

  • คำแนะนำที่กระโดดโดยไม่มีเงื่อนไข

  • คำแนะนำที่กระโดดและบันทึกที่อยู่ผู้ส่งคืนบนสแต็ก ("การโทร") และคำแนะนำอื่น ๆ ที่ปรากฏที่อยู่ออกจากสแต็ก ("การส่งคืน")

  • คำแนะนำพิเศษเช่นคำสั่งที่หยุด CPU ระบุ CPU หรือการเรียกตัวจัดการขัดจังหวะ

  • "ไม่มีการทำงาน" - ซีพียูเกือบทั้งหมดมีคำสั่ง "no-op" ที่สิ้นเปลืองวงจรและเดินหน้าต่อไป

นี่เป็นเพียงตัวอย่างเท่านั้นมีซีพียูที่มีคำแนะนำน้อยกว่าและซีพียูที่มีมากขึ้น

ประเด็นก็คือเพื่อแสดงให้เห็นว่ามีคำแนะนำหลายประเภทนอกเหนือจากคำแนะนำทางคณิตศาสตร์ใน CPU ทุกอย่างในภาษาระดับสูงจะแบ่งออกเป็นประเภทของการดำเนินการด้านบนและมีเพียงบางส่วนเท่านั้นที่จะเป็นคำแนะนำทางคณิตศาสตร์หรือ ALU

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.