ทำไม x86 ถึงน่าเกลียด? ทำไมถึงถูกมองว่าด้อยกว่าเมื่อเทียบกับคนอื่น? [ปิด]


105

เมื่อเร็ว ๆ นี้ฉันได้อ่านไฟล์เก็บถาวร SO และพบข้อความที่ต่อต้านสถาปัตยกรรม x86

และความคิดเห็นอื่น ๆ อีกมากมายเช่น

ฉันพยายามค้นหา แต่ไม่พบเหตุผลใด ๆ ฉันไม่พบว่า x86 แย่เพราะนี่เป็นสถาปัตยกรรมเดียวที่ฉันคุ้นเคย

ใครช่วยกรุณาให้เหตุผลในการพิจารณา x86 น่าเกลียด / แย่ / ด้อยกว่าเมื่อเทียบกับคนอื่น ๆ


1
ฉันใช้ S&A ตามคำตอบจนถึงตอนนี้ แต่ฉันจะทราบว่าการส่งผ่าน CISC ไม่ใช่ปัญหาสำหรับชุดคำสั่ง m68k x86 คืออะไรและคุณสามารถเก็บไว้ได้
dmckee --- อดีตผู้ดูแลลูกแมว

"S&A" คืออะไร? "CISC ไม่ใช่ปัญหาสำหรับชุดคำสั่ง m68k" -- ทำไมจะไม่ล่ะ?
กรงเล็บ

5
ชิปซีรีส์ motorala 68000 มีสถาปัตยกรรม CISC สูง แต่มีชุดคำสั่งที่เหมือนกันเป็นมุมฉากและง่ายมาก ทำไมถึงแตกต่างจาก x86? ฉันไม่รู้ แต่โปรดทราบว่ามีความแตกต่างอย่างมากระหว่างความซับซ้อนในชิปและความซับซ้อนในชุดคำสั่ง (เช่นในอินเทอร์เฟซที่โปรแกรมเมอร์แอสเซมบลีมองเห็น)
dmckee --- อดีตผู้ดูแลลูกแมว

4
+1 สำหรับคำถามที่น่าสนใจ
Turing เสร็จสมบูรณ์

1
การศึกษาล่าสุดเกี่ยวกับประสิทธิภาพการใช้พลังงานของโปรเซสเซอร์ที่แตกต่างกันพบได้ที่นี่พร้อมกับการอภิปรายที่ดีว่าอะไรเป็นปัจจัยผลักดันการออกแบบ CISC & RISC extremetech.com/extreme/…

คำตอบ:


93

สาเหตุที่เป็นไปได้สองประการ:

  1. x86 เป็นISA ที่ค่อนข้างเก่า(บรรพบุรุษของมันคือ 8086s หลังจากนั้นทั้งหมด)
  2. x86 มีการพัฒนาอย่างมีนัยสำคัญหลายครั้ง แต่ฮาร์ดแวร์จำเป็นเพื่อรักษาความเข้ากันได้แบบย้อนหลังกับไบนารีรุ่นเก่า ตัวอย่างเช่นฮาร์ดแวร์ x86 ที่ทันสมัยยังคงรองรับการเรียกใช้โค้ด 16 บิต นอกจากนี้ยังมีโมเดลการกำหนดแอดเดรสหน่วยความจำหลายรุ่นเพื่อให้โค้ดรุ่นเก่าทำงานระหว่างกันบนโปรเซสเซอร์เดียวกันเช่นโหมดจริงโหมดป้องกันโหมด 8086 เสมือนและโหมดยาว (amd64) สิ่งนี้อาจสร้างความสับสนให้กับบางคน
  3. x86 เป็นเครื่อง CISC เป็นเวลานานซึ่งหมายความว่ามันช้ากว่าเครื่อง RISC เช่น MIPS หรือ ARM เนื่องจากคำสั่งมีการพึ่งพาซึ่งกันและกันของข้อมูลและแฟล็กทำให้รูปแบบของการเรียนการสอนส่วนใหญ่ขนานกันยากที่จะนำไปใช้ การใช้งานสมัยใหม่จะแปลคำสั่ง x86 เป็นคำสั่งคล้าย RISC ที่เรียกว่า " micro-ops " ภายใต้ฝาครอบเพื่อให้การเพิ่มประสิทธิภาพประเภทนี้ใช้งานได้จริงในฮาร์ดแวร์
  4. ในบางประเด็น x86 ก็ไม่ได้ด้อยไปกว่ากัน แต่แตกต่างกัน ตัวอย่างเช่นอินพุต / เอาต์พุตได้รับการจัดการเป็นการแมปหน่วยความจำบนสถาปัตยกรรมส่วนใหญ่ แต่ไม่ใช่บน x86 (หมายเหตุ: โดยทั่วไปแล้วเครื่อง x86 ที่ทันสมัยจะมีการรองรับDMAบางรูปแบบและสื่อสารกับฮาร์ดแวร์อื่น ๆ ผ่านการแมปหน่วยความจำ แต่ISAยังคงมีคำแนะนำ I / O เช่นINและOUT)
  5. x86 ISAมีการลงทะเบียนสถาปัตยกรรมเพียงไม่กี่ตัวซึ่งสามารถบังคับให้โปรแกรมไป - กลับผ่านหน่วยความจำได้บ่อยกว่าที่จำเป็น คำแนะนำพิเศษที่จำเป็นในการทำเช่นนี้จะใช้เวลาดำเนินการทรัพยากรที่สามารถนำมาใช้ในการทำงานที่เป็นประโยชน์แม้จะมีประสิทธิภาพการจัดเก็บส่งต่อช่วยให้เวลาในการตอบสนองต่ำ การใช้งานสมัยใหม่ด้วยการเปลี่ยนชื่อรีจิสเตอร์ลงในไฟล์รีจิสเตอร์ทางกายภาพขนาดใหญ่สามารถให้คำแนะนำมากมายในการบิน แต่การขาดการลงทะเบียนสถาปัตยกรรมยังคงเป็นจุดอ่อนที่สำคัญสำหรับ x86 32 บิต การเพิ่มขึ้นของ x86-64 จาก 8 เป็น 16 จำนวนเต็มและการลงทะเบียนเวกเตอร์เป็นหนึ่งในปัจจัยที่ใหญ่ที่สุดในรหัส 64 บิตที่เร็วกว่า 32 บิต (พร้อมกับการลงทะเบียนเรียก ABI ที่มีประสิทธิภาพมากกว่า) ไม่ใช่ความกว้างที่เพิ่มขึ้นของการลงทะเบียนแต่ละรายการ การเพิ่มจำนวนเต็มจาก 16 เป็น 32 จะช่วยได้บ้าง แต่ไม่มากเท่า (AVX512 เพิ่มขึ้นเป็น 32 เวกเตอร์รีจิสเตอร์เนื่องจากโค้ดทศนิยมมีเวลาแฝงที่สูงกว่าและมักต้องการค่าคงที่มากกว่า) ( ดูความคิดเห็น )
  6. รหัสประกอบ x86 มีความซับซ้อนเนื่องจาก x86 เป็นสถาปัตยกรรมที่ซับซ้อนพร้อมคุณสมบัติมากมาย รายการคำแนะนำสำหรับเครื่อง MIPS ทั่วไปจะพอดีกับกระดาษขนาด Letter เดียว รายชื่อที่เทียบเท่าสำหรับ x86 จะเต็มไปหลายหน้าและคำแนะนำก็ทำได้มากกว่านี้ดังนั้นคุณมักต้องการคำอธิบายที่มากขึ้นเกี่ยวกับสิ่งที่พวกเขาทำมากกว่าที่รายชื่อจะสามารถให้ได้ ตัวอย่างเช่นMOVSBคำสั่งต้องการโค้ด C ที่ค่อนข้างใหญ่เพื่ออธิบายว่ามันทำอะไร:

    if (DF==0) 
      *(byte*)DI++ = *(byte*)SI++; 
    else 
      *(byte*)DI-- = *(byte*)SI--;
    

    นั่นเป็นคำสั่งเดียวในการโหลดการจัดเก็บและการเพิ่มหรือลบสองรายการ (ควบคุมโดยการป้อนค่าสถานะ) ซึ่งแต่ละคำสั่งจะเป็นคำแนะนำแยกกันในเครื่อง RISC

    ในขณะที่ MIPS (และสถาปัตยกรรมที่คล้ายกัน) ความเรียบง่ายไม่จำเป็นต้องทำให้พวกเขาเหนือกว่าการเรียนการสอนการแนะนำการเรียนประกอบมันทำให้ความรู้สึกที่จะเริ่มต้นด้วยการที่เรียบง่ายISA คลาสแอสเซมบลีบางคลาสสอนชุดย่อยที่เรียบง่ายเป็นพิเศษของ x86 ที่เรียกว่าy86ซึ่งง่ายกว่าจุดที่ไม่มีประโยชน์สำหรับการใช้งานจริง (เช่นไม่มีคำแนะนำในการเปลี่ยน) หรือบางคลาสสอนแค่คำสั่ง x86 พื้นฐาน

  7. x86 ใช้ opcodes ที่มีความยาวผันแปรได้ซึ่งจะเพิ่มความซับซ้อนของฮาร์ดแวร์ที่เกี่ยวกับการแยกวิเคราะห์คำสั่ง ในยุคปัจจุบันค่าใช้จ่ายนี้มีขนาดเล็กลงเรื่อย ๆ เนื่องจากซีพียูถูก จำกัด ด้วยแบนด์วิดท์หน่วยความจำมากขึ้นเรื่อย ๆ มากกว่าการคำนวณแบบดิบ แต่บทความและทัศนคติ "x86 ทุบตี" จำนวนมากมาจากยุคที่ค่าใช้จ่ายนี้มีขนาดใหญ่กว่ามาก
    ปรับปรุง 2016 Anandtech ได้โพสต์การอภิปรายเกี่ยวกับขนาด opcode ภายใต้ x64 และ AArch64

แก้ไข: นี่ไม่ควรจะเป็นการทุบตี x86! ปาร์ตี้. ฉันมีทางเลือกเพียงเล็กน้อย แต่ต้องทุบตีตามวิธีที่คำถามนั้นพูด แต่ยกเว้นข้อ (1) สิ่งเหล่านี้ทำด้วยเหตุผลที่ดี (ดูความคิดเห็น) นักออกแบบของ Intel ไม่ได้โง่ - พวกเขาต้องการบรรลุบางสิ่งด้วยสถาปัตยกรรมของพวกเขาและนี่คือภาษีบางส่วนที่พวกเขาต้องจ่ายเพื่อทำให้สิ่งเหล่านั้นเป็นจริง


17
มันเป็นการแลกเปลี่ยน เป็นจุดแข็งที่ขนาดไบนารีอาจเล็กลง แต่ก็เป็นจุดอ่อนที่คุณต้องมีฮาร์ดแวร์ที่ซับซ้อนมากเพื่อใช้ตัวแยกวิเคราะห์สำหรับคำแนะนำเหล่านี้ คำแนะนำส่วนใหญ่มีขนาดเท่ากัน - เหตุผลส่วนใหญ่สำหรับ opcodes ความยาวตัวแปรบน x86 คือเมื่อพวกเขาตัดสินใจที่จะเพิ่มคุณสมบัติและพบว่าพวกเขาไม่สามารถแสดงสิ่งที่ต้องการในจำนวนบิตที่พวกเขาต้องทำงานด้วย . คนส่วนใหญ่ไม่ได้กังวลกับขนาดไบนารีเกือบเท่ากับความซับซ้อนของฮาร์ดแวร์หรือการใช้พลังงาน
Billy ONeal

8
@Joey Adams: เปรียบเทียบคำแนะนำความยาวตัวแปรของ x86 กับโหมด Thumb ของ ARM ( en.wikipedia.org/wiki/ARM_architecture#Thumb ) โหมด Thumb ส่งผลให้โค้ดออบเจ็กต์สำหรับ ARM มีขนาดเล็กลงอย่างมากเนื่องจากคำแนะนำที่สั้นกว่าจะจับคู่กับคำสั่งปกติโดยตรง แต่เนื่องจากมีการแมปแบบ 1: 1 ระหว่างคำสั่งที่ใหญ่กว่าและคำสั่งที่เล็กกว่าจึงใช้งานฮาร์ดแวร์ที่แยกวิเคราะห์ได้ง่าย คำแนะนำความยาวผันแปรของ x86 ไม่มีประโยชน์เหล่านี้เนื่องจากไม่ได้ออกแบบมาตั้งแต่แรก
Billy ONeal

7
(6) ทุกโปรแกรมไม่จำเป็นต้องใช้ทุกโปรแกรม แต่ถ้าฉันต้องการ SSE3 ฉันดีใจที่มีมัน
Chris K

4
@ คริสคามินสกี: ไม่ส่งผลกระทบต่อฮาร์ดแวร์อย่างไร? แน่นอนว่าบนคอมพิวเตอร์ขนาดเต็มสมัยใหม่ไม่มีใครสนใจ แต่ถ้าฉันทำอะไรบางอย่างเช่นโทรศัพท์มือถือฉันสนใจเรื่องการใช้พลังงานมากกว่าสิ่งอื่นใดเกือบทั้งหมด opcodes ที่มีความยาวผันแปรไม่เพิ่มเวลาในการดำเนินการ แต่ฮาร์ดแวร์ถอดรหัสยังคงต้องใช้พลังงานในการทำงาน
Billy ONeal

5
ซึ่งเป็นหนึ่งในสิ่งที่ทำให้ชุดคำสั่ง x86 ดูน่าเกลียดมากเนื่องจากไม่สามารถตัดสินใจได้ว่าเป็นตัวสะสมหรือสถาปัตยกรรมที่ใช้ไฟล์ลงทะเบียน (แม้ว่าส่วนใหญ่จะแก้ไขด้วย 386 ซึ่งทำให้ชุดคำสั่งมีมุมฉากมากขึ้น โดยไม่คำนึงถึงสิ่งที่แฟน ๆ 68k บอกคุณ)
ninjalj

25

สิ่งสำคัญที่ทำให้ฉันนึกถึง x86 คือต้นกำเนิด CISC - ชุดคำสั่งมีการพึ่งพาระหว่างกันโดยปริยายมากมาย การพึ่งพาซึ่งกันและกันเหล่านี้ทำให้ยากที่จะทำสิ่งต่างๆเช่นการเรียงลำดับคำสั่งใหม่บนชิปเนื่องจากสิ่งประดิษฐ์และความหมายของการพึ่งพาระหว่างกันเหล่านั้นต้องได้รับการรักษาไว้สำหรับแต่ละคำสั่ง

ตัวอย่างเช่นคำแนะนำการเพิ่มและลบจำนวนเต็ม x86 ส่วนใหญ่จะแก้ไขการลงทะเบียนแฟล็ก หลังจากทำการบวกหรือลบแล้วการดำเนินการถัดไปมักจะดูที่แฟล็กรีจิสเตอร์เพื่อตรวจสอบการโอเวอร์โฟลว์บิตเซ็นชื่อและอื่น ๆ หากมีการเพิ่มอื่นหลังจากนั้นก็ยากที่จะบอกได้ว่าปลอดภัยหรือไม่ที่จะเริ่มดำเนินการเพิ่มครั้งที่ 2 ก่อนที่จะทราบผลลัพธ์ของการเพิ่มครั้งที่ 1

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

ชิป DEC Alpha AXP ซึ่งเป็นการออกแบบ RISC สไตล์ MIPS นั้นมีความเจ็บปวดอย่างมากในคำแนะนำที่มีอยู่ แต่ชุดคำสั่งได้รับการออกแบบมาเพื่อหลีกเลี่ยงการพึ่งพาการลงทะเบียนโดยนัยระหว่างคำสั่ง ไม่มีการลงทะเบียนสแต็กที่กำหนดด้วยฮาร์ดแวร์ ไม่มีการลงทะเบียนแฟล็กที่กำหนดโดยฮาร์ดแวร์ แม้แต่ตัวชี้คำสั่งยังถูกกำหนดระบบปฏิบัติการ - หากคุณต้องการกลับไปที่ผู้โทรคุณต้องพิจารณาว่าผู้โทรจะแจ้งให้คุณทราบว่าที่อยู่ที่จะกลับไปอย่างไร โดยปกติจะกำหนดโดยรูปแบบการเรียกระบบปฏิบัติการ แม้ว่าบน x86 จะถูกกำหนดโดยฮาร์ดแวร์ชิป

อย่างไรก็ตามกว่า 3 หรือ 4 รุ่นของการออกแบบชิป Alpha AXP ฮาร์ดแวร์ได้เปลี่ยนไปจากการใช้งานชุดคำสั่ง spartan ที่มีการลงทะเบียน 32 int และการลงทะเบียน 32 float ไปยังกลไกการดำเนินการตามคำสั่งที่มีการลงทะเบียนภายใน 80 รายการการลงทะเบียนการเปลี่ยนชื่อ การส่งต่อผลลัพธ์ (โดยที่ผลลัพธ์ของคำสั่งก่อนหน้าจะถูกส่งต่อไปยังคำสั่งในภายหลังซึ่งขึ้นอยู่กับค่า) และตัวเร่งประสิทธิภาพที่บ้าคลั่งและบ้าคลั่งทุกประเภท และด้วยเสียงระฆังและเสียงนกหวีดเหล่านั้นการตายของชิป AXP ยังคงมีขนาดเล็กกว่าการตายของชิป Pentium ที่เทียบเคียงกันได้มากในเวลานั้นและ AXP นั้นเร็วกว่ามาก

คุณไม่เห็นประสิทธิภาพที่เพิ่มขึ้นมากมายในโครงสร้างตระกูล x86 ส่วนใหญ่เนื่องจากความซับซ้อนของชุดคำสั่ง x86 ทำให้การเพิ่มประสิทธิภาพการดำเนินการหลายประเภทมีราคาแพงมากหากไม่สามารถทำได้ จังหวะแห่งความอัจฉริยะของ Intel กำลังเลิกใช้ชุดคำสั่ง x86 ในฮาร์ดแวร์อีกต่อไป - ชิป x86 ที่ทันสมัยทั้งหมดเป็นแกน RISC ที่ตีความคำสั่ง x86 ในระดับหนึ่งซึ่งแปลเป็นไมโครโค้ดภายในซึ่งจะรักษาความหมายทั้งหมดของ x86 ดั้งเดิม การเรียนการสอน แต่อนุญาตให้มี RISC ที่ไม่อยู่ในลำดับและการเพิ่มประสิทธิภาพอื่น ๆ ผ่านไมโครโค้ด

ฉันได้เขียนแอสเซมเบลอร์ x86 จำนวนมากและสามารถชื่นชมความสะดวกสบายของราก CISC ได้อย่างเต็มที่ แต่ฉันไม่เข้าใจว่า x86 ซับซ้อนแค่ไหนจนกระทั่งฉันใช้เวลาเขียน Alpha AXP แอสเซมเบลอร์ ฉันรู้สึกแย่กับความเรียบง่ายและความสม่ำเสมอของ AXP ความแตกต่างมีมากมายและลึกซึ้ง


6
ฉันจะไม่ฟัง CISC ต่อการทุบตีเว้นแต่และจนกว่าคุณจะสามารถอธิบาย m68k ได้
dmckee --- อดีตผู้ดูแลลูกแมว

2
ฉันไม่คุ้นเคยกับ m68k ดังนั้นฉันจึงไม่สามารถวิจารณ์ได้
dthorpe

4
ฉันไม่คิดว่าคำตอบนี้ไม่ดีพอที่จะลดคะแนน แต่ฉันคิดว่าอาร์กิวเมนต์ "RISC ทั้งหมดเล็กและเร็วกว่า CISC" นั้นไม่ได้มีความเกี่ยวข้องในยุคปัจจุบัน แน่นอนว่า AXP อาจเร็วขึ้นมากสำหรับเวลานี้ แต่ความจริงของเรื่องนี้ก็คือ RISC ที่ทันสมัยและ CISC สมัยใหม่นั้นมีความคล้ายคลึงกันเมื่อพูดถึงประสิทธิภาพ ดังที่ฉันได้กล่าวไว้ในคำตอบของฉันการลงโทษด้านพลังงานเล็กน้อยสำหรับการถอดรหัส x86 เป็นเหตุผลที่จะไม่ใช้ x86 สำหรับบางอย่างเช่นโทรศัพท์มือถือ แต่นั่นเป็นข้อโต้แย้งเล็กน้อยสำหรับเดสก์ท็อปหรือโน้ตบุ๊กขนาดเต็ม
Billy ONeal

4
@ บิลลี่: ขนาดเป็นมากกว่าขนาดโค้ดหรือขนาดคำสั่ง Intel ยอมจ่ายค่าปรับในพื้นที่ผิวชิปเพื่อใช้ตรรกะของฮาร์ดแวร์สำหรับคำสั่งพิเศษทั้งหมดเหล่านั้นแกนไมโครโค้ด RISC ภายใต้ประทุนหรือไม่ ขนาดของแม่พิมพ์ส่งผลโดยตรงต่อต้นทุนในการผลิตดังนั้นจึงยังคงเป็นข้อกังวลที่ถูกต้องสำหรับการออกแบบระบบที่ทันสมัย
dthorpe

1
@dthorpe: ฉันไม่เห็นด้วยกับส่วนใหญ่ถ้าไม่ใช่สิ่งที่คุณเขียนทั้งหมด นับตั้งแต่ 8086 คุณไม่ต้องกังวลถ้ามันเป็นความปลอดภัยในการดำเนินการหลังจากที่อื่นadd addกฎมีความชัดเจน นอกจากนี้คุณไม่จำเป็นต้องจัดการกับการเรียงลำดับคำสั่งใหม่ นับตั้งแต่ Pentium Pro ในช่วงกลางทศวรรษที่ 90 CPU ก็ทำเพื่อคุณ สิ่งที่คุณพูดถึงอาจเป็นปัญหาเมื่อ 20 ปีก่อน แต่ฉันไม่เห็นเหตุผลใด ๆ ที่จะต่อต้านสถาปัตยกรรม x86 ในปัจจุบัน
Nathan Fellman

21

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

โปรเซสเซอร์อื่น ๆ จากยุคเดียวกัน (เช่นตระกูล 6502) ก็มีข้อ จำกัด และนิสัยใจคอที่คล้ายคลึงกัน ที่น่าสนใจคือทั้ง 8008 ซีรีส์และซีรีส์ 6502 มีจุดมุ่งหมายเพื่อเป็นคอนโทรลเลอร์แบบฝังตัว ในตอนนั้นตัวควบคุมแบบฝังถูกคาดว่าจะได้รับการตั้งโปรแกรมไว้ในแอสเซมเบลอร์และในหลาย ๆ วิธีที่รองรับโปรแกรมเมอร์แอสเซมบลีแทนที่จะเป็นตัวเขียนคอมไพเลอร์ (ดูที่ชิป VAX สำหรับสิ่งที่เกิดขึ้นเมื่อคุณให้ความสำคัญกับการเขียนคอมไพเลอร์) นักออกแบบไม่ได้คาดหวังว่าพวกเขาจะกลายเป็นแพลตฟอร์มคอมพิวเตอร์สำหรับวัตถุประสงค์ทั่วไป นั่นคือสิ่งที่เหมือนกับรุ่นก่อน ๆ ของ POWER archicture มีไว้เพื่อ การปฏิวัติคอมพิวเตอร์ที่บ้านเปลี่ยนไปแน่นอน


4
+1 สำหรับคำตอบเดียวที่นี่จากผู้ที่ดูเหมือนจะมีภูมิหลังทางประวัติศาสตร์เกี่ยวกับปัญหานี้
Billy ONeal

3
หน่วยความจำช้ามาตลอด อาจเป็นไปได้ว่า (ค่อนข้างพูด) ในปัจจุบันช้ากว่าตอนที่ฉันเริ่มด้วย Z80s และ CP / M ในปี 1982 การสูญพันธุ์ไม่ใช่เส้นทางเดียวของวิวัฒนาการเพราะการสูญพันธุ์ทำให้ทิศทางการวิวัฒนาการหยุดลง ฉันจะบอกว่า x86 ปรับตัวได้ดีในรอบ 28 ปี (จนถึงตอนนี้)
Olof Forshell

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

3
@Olof Forshell: แอสเซมเบลอร์ที่เข้ากันได้กับรหัสแอสเซมบลี 8080 สามารถแปลเป็นรหัส 8086 ได้ จากมุมมองนั้นมันเป็นส่วนขยาย 8080 บวกเช่นเดียวกับที่คุณสามารถดู 8080 เป็น 8008 บวกส่วนขยาย
David Thornley

3
@Olof Forshell: ยกเว้นว่า 8086 ถูกออกแบบมาเพื่อให้สิ่งนั้นเกิดขึ้น มันเป็นส่วนขยายของ 8080 และคำสั่ง 8080 ส่วนใหญ่ (อาจจะทั้งหมด) แมปแบบตัวต่อตัวโดยมีความหมายคล้ายกันอย่างเห็นได้ชัด นั่นไม่เป็นความจริงสำหรับสถาปัตยกรรม IBM 360 ไม่ว่าคุณจะต้องการผลักดันไปทางใด
David Thornley

13

ฉันมีประเด็นเพิ่มเติมบางประการที่นี่:

พิจารณาการดำเนินการ "a = b / c" x86 จะใช้สิ่งนี้เป็น

  mov eax,b
  xor edx,edx
  div dword ptr c
  mov a,eax

เนื่องจากโบนัสเพิ่มเติมของคำสั่ง div edx จะมีส่วนที่เหลืออยู่

ตัวประมวลผล RISC จะต้องโหลดที่อยู่ของ b และ c ก่อนโดยโหลด b และ c จากหน่วยความจำไปยังรีจิสเตอร์ทำการแบ่งและโหลดที่อยู่ของ a แล้วจึงจัดเก็บผลลัพธ์ ไวยากรณ์ Dst, src:

  mov r5,addr b
  mov r5,[r5]
  mov r6,addr c
  mov r6,[r6]
  div r7,r5,r6
  mov r5,addr a
  mov [r5],r7

ที่นี่มักจะไม่มีเศษเหลือ

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

ข้อดีและข้อเสีย:

คำสั่ง RISC อาจผสมกับโค้ดโดยรอบเพื่อปรับปรุงการตั้งเวลาคำสั่งซึ่งมีความเป็นไปได้น้อยกว่ากับ x86 ซึ่งจะใช้งานได้ดี (มากหรือน้อยขึ้นอยู่กับลำดับ) ภายใน CPU เอง โดยทั่วไปลำดับ RISC ด้านบนจะมีความยาว 28 ไบต์ (7 คำสั่งของความกว้าง 32 บิต / 4 ไบต์แต่ละคำสั่ง) บนสถาปัตยกรรม 32 บิต สิ่งนี้จะทำให้หน่วยความจำนอกชิปทำงานมากขึ้นเมื่อดึงคำแนะนำ (การดึงข้อมูลเจ็ดครั้ง) ลำดับ x86 ที่หนาแน่นขึ้นมีคำแนะนำน้อยลงและแม้ว่าความกว้างจะแตกต่างกันไปคุณอาจกำลังดูค่าเฉลี่ย 4 ไบต์ / คำสั่งที่นั่นด้วย แม้ว่าคุณจะมีแคชคำสั่งเพื่อเร่งความเร็วในการดึงข้อมูลเจ็ดครั้งหมายความว่าคุณจะมีการขาดดุลสามส่วนที่เหลือเพื่อชดเชยเมื่อเทียบกับ x86

สถาปัตยกรรม x86 ที่มีรีจิสเตอร์น้อยกว่าในการบันทึก / กู้คืนหมายความว่ามันอาจจะทำเธรดสวิตช์และจัดการการขัดจังหวะได้เร็วกว่า RISC การลงทะเบียนเพิ่มเติมเพื่อบันทึกและกู้คืนต้องใช้พื้นที่สแต็ก RAM ชั่วคราวมากขึ้นเพื่อทำการขัดจังหวะและพื้นที่สแต็กถาวรมากขึ้นเพื่อจัดเก็บสถานะเธรด แง่มุมเหล่านี้ควรทำให้ x86 เป็นตัวเลือกที่ดีกว่าสำหรับการรัน RTOS ที่แท้จริง

ในบันทึกส่วนตัวฉันพบว่ายากที่จะเขียน RISC assembly มากกว่า x86 ฉันแก้ปัญหานี้โดยการเขียนรูทีน RISC ใน C รวบรวมและแก้ไขโค้ดที่สร้างขึ้น สิ่งนี้มีประสิทธิภาพมากกว่าจากมุมมองการผลิตโค้ดและอาจมีประสิทธิภาพน้อยกว่าจากมุมมองการดำเนินการ การลงทะเบียนทั้งหมด 32 รายการเพื่อติดตาม ด้วย x86 เป็นวิธีอื่น ๆ : การลงทะเบียน 6-8 รายการที่มีชื่อ "จริง" ทำให้ปัญหาสามารถจัดการได้มากขึ้นและสร้างความมั่นใจมากขึ้นว่าโค้ดที่สร้างจะทำงานได้ตามที่คาดไว้

น่าเกลียด? นั่นอยู่ในสายตาของคนดู ฉันชอบ "แตกต่าง"


a, b และ c ในตัวอย่างของฉันควรถูกมองว่าเป็นตัวแปรตามหน่วยความจำและไม่ใช่ค่าในทันที
Olof Forshell

... "dword ptr" ใช้เพื่อระบุขนาดของตัวแปรที่ไม่ทราบขนาดตัวอย่างเช่นหากมีการประกาศเป็นภายนอกหรือหากคุณขี้เกียจ
Olof Forshell

2
นั่นไม่ใช่ครั้งแรกที่ฉันได้ยินคำแนะนำให้เขียนเป็น C ก่อนแล้วจึงกลั่นเป็นแอสเซมเบลอร์ นั่นช่วยได้แน่นอน
Joe Plante

ในช่วงแรกโปรเซสเซอร์ทั้งหมดเป็น RISC CISC เป็นกลยุทธ์ในการบรรเทาผลกระทบสำหรับระบบหน่วยความจำแกนเฟอร์ริกที่ทำงานช้ามากดังนั้น CISC จึงมีคำสั่งที่น้อยลงและมีประสิทธิภาพมากขึ้นลดความเครียดในระบบย่อยหน่วยความจำและใช้แบนด์วิดท์ได้ดีขึ้น ในทำนองเดียวกันการลงทะเบียนเดิมคิดว่าเป็นตำแหน่งหน่วยความจำบนชิปใน CPU สำหรับการสะสม ครั้งสุดท้ายที่ฉันเปรียบเทียบเครื่อง RISC อย่างจริงจังคือปี 1993 - SPARC และ HP Prisim SPARC สยดสยองทั่วกระดาน พริซิมเร็วถึง 20 เท่าโดยเร็วเท่ากับ 486 ในการเพิ่ม / ย่อย / มัล แต่ถูกดูดโดยยอดเยี่ยม CISC ดีกว่า

@OlofForshell คุณพูดthere typically won't be a reminderแต่ wiki บอกว่ามี mips: en.wikipedia.org/wiki/MIPS_instruction_set#Integer
Alex Zhukovskiy

10

ฉันคิดว่าคำถามนี้มีข้อสันนิษฐานที่ผิด ส่วนใหญ่เป็นเพียงนักวิชาการที่หมกมุ่นอยู่กับ RISC ที่เรียก x86 ว่าน่าเกลียด ในความเป็นจริง x86 ISA สามารถทำได้ในการดำเนินการคำสั่งเดียวซึ่งจะใช้คำสั่ง 5-6 คำสั่งเกี่ยวกับ RISC ISAs แฟน ๆ ของ RISC อาจตอบโต้ว่าซีพียู x86 ที่ทันสมัยทำลายคำสั่งที่ "ซับซ้อน" เหล่านี้ลงใน microops; อย่างไรก็ตาม:

  1. ในหลาย ๆ กรณีนั่นเป็นความจริงเพียงบางส่วนหรือไม่จริงเลย คำแนะนำที่ "ซับซ้อน" ที่มีประโยชน์ที่สุดใน x86 คือสิ่งต่างๆเช่นmov %eax, 0x1c(%esp,%edi,4)โหมดการกำหนดแอดเดรสซึ่งจะไม่แยกย่อย
  2. สิ่งที่สำคัญกว่าในเครื่องสมัยใหม่มักไม่ใช่จำนวนรอบที่ใช้ไป (เนื่องจากงานส่วนใหญ่ไม่ได้ผูกกับ cpu) แต่แคชคำสั่งมีผลต่อโค้ด คำสั่งขนาดคงที่ 5-6 คำสั่ง (โดยปกติคือ 32 บิต) จะส่งผลกระทบต่อแคชมากกว่าหนึ่งคำสั่งที่ซับซ้อนซึ่งแทบจะไม่เกิน 5 ไบต์

x86 จริงๆดูดซึมทุกด้านที่ดีของริสก์ประมาณ 10-15 ปีที่ผ่านมาและมีคุณภาพที่เหลืออยู่ของ RISC (จริงกำหนดหนึ่ง - น้อยที่สุดชุดคำสั่ง) เป็นอันตรายและไม่พึงประสงค์

นอกเหนือจากค่าใช้จ่ายและความซับซ้อนของการผลิตซีพียูและความต้องการพลังงานของพวกเขา x86 เป็นของ ISA ใครก็ตามที่บอกคุณเป็นอย่างอื่นก็ปล่อยให้อุดมการณ์หรือวาระการประชุมมาขัดขวางการใช้เหตุผลของพวกเขา

ในทางกลับกันหากคุณกำหนดเป้าหมายอุปกรณ์ฝังตัวที่ต้นทุนของ CPU นับหรืออุปกรณ์ฝังตัว / มือถือที่การใช้พลังงานเป็นปัญหาอันดับต้น ๆ ARM หรือ MIPS อาจเหมาะสมกว่า โปรดทราบว่าคุณยังคงต้องจัดการกับหน่วยความจำเพิ่มเติมและขนาดไบนารีที่จำเป็นในการจัดการโค้ดที่มีขนาดใหญ่กว่า 3-4 เท่าและคุณจะไม่สามารถเข้าใกล้ประสิทธิภาพได้ เรื่องนี้ขึ้นอยู่กับสิ่งที่คุณกำลังดำเนินการอยู่มากหรือไม่


3
ในกรณีที่การใช้พลังงานเป็นปัญหาอันดับต้น ๆ ARM หรือ MIPS น่าจะสมเหตุสมผลกว่า ... ดังนั้นหากมีอย่างน้อยหนึ่งแง่มุมที่ ARM หรือ MIPS เหมาะสมกว่านี้จะทำให้ x86 ไม่จำเป็นต้องเป็น ISA ที่ดีที่สุดหรือไม่?
Shahbaz

นั่นเป็นเหตุผลว่าทำไมฉันจึงมีคุณสมบัติ "ดีที่สุด" โดย "นอกเหนือจากค่าใช้จ่าย ... และความต้องการพลังงาน"
R .. GitHub STOP HELPING ICE

1
ฉันคิดว่าการลดความเร็วของ CPU ของ Intel ลงและขนาดของแม่พิมพ์ที่เล็กลงได้กำจัดความแตกต่างของพลังงานอย่างมาก Celeron dual 64-bit CPU 64k L1 และ 1MB L2 caches เป็นชิป 7.5 วัตต์ นี่คือเครื่องแฮงเอาท์ "Starbucks" ของฉันและอายุการใช้งานแบตเตอรี่ยาวนานอย่างน่าขันและจะส่งเสียงดังรอบเครื่อง P6 ในฐานะที่เป็นผู้ชายที่ทำการคำนวณจุดลอยตัวเป็นส่วนใหญ่ฉันจึงยอมแพ้กับ RISC เมื่อนานมาแล้ว มันแค่คลาน โดยเฉพาะอย่างยิ่ง SPARC เป็นน้ำแข็งที่โหดร้าย ตัวอย่างที่สมบูรณ์แบบของสาเหตุที่ RISC ดูดคือ Intel i860 CPU Intel ไม่เคยไปที่นั่นอีกเลย

@RocketRoy: 7.5 วัตต์ไม่เป็นที่ยอมรับสำหรับอุปกรณ์ที่ใช้พลังงานตลอด 24 ชั่วโมงทุกวัน (และไม่มีการคำนวณที่เป็นประโยชน์ตลอดเวลา) หรือใช้แบตเตอรี่ 3.7v / 2000mAh
R .. GitHub STOP HELPING ICE

2
@RocketRoy "ซีพียู Intel i860 Intel ไม่เคยไปที่นั่นอีกเลย" หลังจากการวิจัยเล็ก ๆ น้อย ๆ ใน i860 เสียงมากเช่น Itanium: VLIW คอมไพเลอร์สั่งซื้อคำแนะนำและความเท่าเทียม ....
Jonathon Reinhart

9

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

ตัวอย่างเช่นในโหมด 16 บิตการกำหนดแอดเดรสอาจดูแปลกประหลาดมาก มีโหมดที่อยู่สำหรับแต่ไม่หนึ่งสำหรับ[BX+SI] [AX+BX]สิ่งต่างๆเช่นนี้มักจะทำให้การใช้งาน register มีความซับซ้อนเนื่องจากคุณต้องตรวจสอบให้แน่ใจว่าค่าของคุณอยู่ในทะเบียนที่คุณสามารถใช้ได้ตามต้องการ

(โชคดีที่โหมด 32 บิตนั้นปลอดภัยกว่ามาก (แม้ว่าจะยังแปลกอยู่บ้างในบางครั้งเช่นการแบ่งส่วน) และรหัส x86 16 บิตนั้นส่วนใหญ่ไม่เกี่ยวข้องอีกต่อไปนอกตัวโหลดบูตและสภาพแวดล้อมแบบฝังบางส่วน)

นอกจากนี้ยังมีของเหลือจากสมัยก่อนเมื่อ Intel พยายามทำให้ x86 เป็นสุดยอดโปรเซสเซอร์ คำแนะนำสองสามไบต์ที่มีความยาวซึ่งดำเนินงานที่ไม่มีใครทำอีกต่อไปแล้วทำให้พวกเขารู้สึกประหลาดใจช้าหรือซับซ้อนเกินไป คำแนะนำ ENTER และLOOPสำหรับสองตัวอย่างโปรดทราบว่ารหัสเฟรมสแต็กของ C จะเหมือนกับ "push ebp; mov ebp, esp" และไม่ใช่ "enter" สำหรับคอมไพเลอร์ส่วนใหญ่


2
ฉันเชื่อว่าปัญหา "enter" กับ "push / mov" เกิดขึ้นเนื่องจากในโปรเซสเซอร์บางตัว "push / mov" นั้นเร็วกว่า ในโปรเซสเซอร์บางตัว "enter" จะเร็วกว่า C'est la vie
Dietrich Epp

4
เมื่อฉันถูกบังคับให้ใช้เครื่องที่ใช้ x86 และเริ่มดูมัน (มีพื้นหลัง m68k) ฉันเริ่มรู้สึกว่าการเขียนโปรแกรม asm น่าหงุดหงิด ... เช่นถ้าฉันได้เรียนรู้การเขียนโปรแกรมด้วยภาษาเช่น C แล้วเป็น ถูกบังคับให้ติดต่อกับ asm ... คุณ "รู้สึก" สูญเสียพลังในการแสดงออกความง่ายความชัดเจน "การเชื่อมโยงกัน" "ความสามารถในการหยั่งรู้" ฉันแน่ใจว่าถ้าฉันจะเริ่มการเขียนโปรแกรม asm ด้วย x86 ฉันคงคิดว่า มันก็ไม่เลวร้ายนัก ... บางที ... ฉันก็เล่น MMIX และ MIPS ด้วยและ "asm lang" ของพวกเขาดีกว่า x86 มาก (ถ้านี่คือ PoV ที่ถูกต้องสำหรับ Q แต่อาจจะไม่ใช่)
ShinTakezou

ปัญหาโหมดการกำหนดแอดเดรสได้รับการแก้ไขใน 80386 โค้ด 16 บิตเท่านั้นที่มีโหมดการกำหนดแอดเดรสที่ จำกัด โค้ด 32 บิตดีกว่ามาก คุณสามารถรับโหมดการกำหนดแอดเดรส 32 บิตในรหัส 16 บิตโดยใช้คำนำหน้าพิเศษและในทางกลับกัน
fuz

@FUZxxl: ใช่ ... ฉันน่าจะพูดถึงความอัปลักษณ์ส่วนใหญ่จะจำกัด อยู่ที่รหัส 16 บิต คงที่ (ฉันคิดว่า) :)
cHao

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

3

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

ฉันคิดว่าความเท่าเทียมกันเป็นปัจจัยที่สำคัญที่สุดอย่างหนึ่งในปัจจุบัน - อย่างน้อยสำหรับอัลกอริทึมที่ทำงานเร็วพอที่จะใช้งานได้ การแสดงความเท่าเทียมกันสูงในซอฟต์แวร์ทำให้ฮาร์ดแวร์สามารถตัดจำหน่าย (หรือมักจะซ่อนทั้งหมด) เวลาแฝงของหน่วยความจำ แน่นอนว่าอนาคตของสถาปัตยกรรมที่ไปไกลกว่านั้นน่าจะเป็นในบางสิ่งเช่นคอมพิวเตอร์ควอนตัม

ฉันเคยได้ยินจาก nVidia ว่าข้อผิดพลาดประการหนึ่งของ Intel คือพวกเขาเก็บรูปแบบไบนารีไว้ใกล้กับฮาร์ดแวร์ PTX ของ CUDA ทำการลงทะเบียนอย่างรวดเร็วโดยใช้การคำนวณ (การระบายสีกราฟ) ดังนั้น nVidia จึงสามารถใช้เครื่องลงทะเบียนแทนเครื่องสแต็กได้ แต่ยังคงมีเส้นทางการอัปเกรดที่ไม่ทำลายซอฟต์แวร์เก่าทั้งหมด


9
RISC ไม่ได้ออกแบบมาโดยคำนึงถึงนักพัฒนาที่เป็นมนุษย์ แนวคิดอย่างหนึ่งที่อยู่เบื้องหลัง RISC คือการลดความซับซ้อนของชิปลงไปที่ใครก็ตามที่เขียนแอสเซมบลี การลงทะเบียนที่มากขึ้นหมายถึงการใช้หน่วยความจำน้อยลงและการพึ่งพาระหว่างคำสั่งน้อยลงทำให้ไปป์ไลน์ที่ลึกขึ้นและประสิทธิภาพที่สูงขึ้น โปรดทราบว่า x86-64 มีการลงทะเบียนทั่วไปเป็นสองเท่าของ x86 และสิ่งนี้มีส่วนรับผิดชอบต่อการเพิ่มประสิทธิภาพอย่างมีนัยสำคัญ และคำแนะนำเกี่ยวกับชิป x86 ส่วนใหญ่จะถูกถอดรหัสก่อนที่จะถูกแคชไม่ใช่หลังจากนั้น (ขนาดจึงไม่สำคัญที่นี่)
Dietrich Epp

3
@Dietrich Epp: นั่นไม่เป็นความจริงทั้งหมด x86-64 มีรีจิสเตอร์ที่มองเห็นได้มากขึ้นใน ISA แต่การใช้งาน x86 สมัยใหม่มักจะมีไฟล์รีจิสเตอร์สไตล์ RISC ซึ่งแมปกับการลงทะเบียนของ ISA ตามความต้องการเพื่อเร่งการดำเนินการ
Billy ONeal

"ฉันเคยได้ยินจาก nVidia ว่าความผิดพลาดอย่างหนึ่งของ Intel คือพวกเขาเก็บรูปแบบไบนารีไว้ใกล้กับฮาร์ดแวร์" - ฉันไม่ได้รับสิ่งนี้และส่วน PTX ของ CUDA
กรงเล็บ

1
@Dietrech Epp: "และคำแนะนำเกี่ยวกับชิป x86 ส่วนใหญ่จะถูกถอดรหัสก่อนที่จะถูกแคชไม่ใช่หลังจากนั้น" นั่นไม่เป็นความจริง พวกเขาจะถูกแคชก่อนที่จะถูกถอดรหัส ฉันเชื่อว่า Pentium 4 มีแคชติดตามเพิ่มเติมที่แคชไว้หลังจากถอดรหัส แต่มันถูกยกเลิกไปแล้ว
Nathan Fellman

ที่ไม่เป็นความจริงโปรเซสเซอร์ "sandy bridge" ใหม่ล่าสุดใช้ trace cache (แบบนั้นสำหรับ pentium 4 โอ้เด็กเก่าคนนั้น: D) เทคโนโลยีจึงหายไปและกลับมา ...
Quonux

3

นอกจากเหตุผลที่ผู้คนกล่าวถึงแล้ว:

  • x86-16 มีรูปแบบการกำหนดหน่วยความจำที่ค่อนข้างแปลกซึ่งทำให้สามารถระบุตำแหน่งหน่วยความจำเดียวได้ถึง 4096 วิธีที่แตกต่างกัน RAM จำกัด ไว้ที่ 1 MB และบังคับให้โปรแกรมเมอร์จัดการกับตัวชี้สองขนาดที่แตกต่างกัน โชคดีที่การย้ายไปเป็น 32 บิตทำให้คุณสมบัตินี้ไม่จำเป็น แต่ชิป x86 ยังคงมีส่วนสำคัญในการลงทะเบียนส่วน
  • ในขณะที่ไม่ได้เป็นความผิดของ x86 ต่อ se , x86 ประชุมเรียกร้องไม่ได้มาตรฐานเช่น MIPS เป็น (ส่วนใหญ่เป็นเพราะ MS-DOS ไม่ได้มาพร้อมกับคอมไพเลอร์มี) ออกจากเรากับระเบียบของ__cdecl, __stdcall, __fastcallฯลฯ

อืม .. เมื่อฉันคิดถึงคู่แข่ง x86 ฉันไม่คิดถึง MIPS ARM หรือ PowerPC อาจจะ ....
Billy ONeal

@Billy: x86 อยู่ใกล้ ๆ ตลอดไป ครั้งหนึ่ง MIPS เป็นคู่แข่ง x86 อย่างที่ฉันจำได้ว่า x86 มีการตัดการทำงานเพื่อไปสู่ระดับที่สามารถแข่งขันกับ MIPS ได้ (ย้อนกลับไปเมื่อ MIPS และ SPARC ต่อสู้กันในเวทีเวิร์กสเตชัน)
Shannon Severance

@Shannon Severance: เพียงเพราะบางสิ่งครั้งหนึ่งไม่ได้หมายถึงสิ่งที่เป็นอยู่
Billy ONeal

2
@supercat: สิ่งที่ผู้คนในยุคของโมเดลหน่วยความจำ x86-32 แบบแบนมักจะลืมคือ 16 บิตหมายถึงหน่วยความจำ 64k (ใครก็ตามที่รบกวนการคำนวณจะเข้าใจว่าเวทมนตร์เป็นไปไม่ได้ที่ 8086 ไม่ใช่ การลงโทษที่น่ารังเกียจสำหรับโปรแกรมเมอร์ที่ไม่สงสัย) มีไม่กี่วิธีในการใช้งาน 64k แต่โซลูชัน 8086 เป็นการประนีประนอมที่ดี
Olof Forshell

2
@OlofForshell: ฉันคิดว่าหลายคนคร่ำครวญถึงความจริงที่ว่า 8086 ไม่ดีเท่า 68000 (ซึ่งมีพื้นที่กำหนดแอดเดรสเชิงเส้น 16MB และเส้นทางที่ชัดเจนถึง 4 กิ๊ก) แน่นอนว่าการใช้โปรเซสเซอร์ 32 บิตจะทำให้เข้าถึงได้ง่ายกว่า 64K แต่ 8086 เป็นสถาปัตยกรรม 16 บิตซึ่งออกแบบมาให้เพิ่มขึ้นจาก 8 บิต 8080 ฉันไม่เห็นเหตุผลที่ Intel ควรจะก้าวกระโดด โดยตรงจาก 8 บิตเป็น 32 บิต
supercat

3

ฉันคิดว่าคุณจะได้รับคำตอบหากคุณเคยพยายามเขียนคอมไพเลอร์ที่กำหนดเป้าหมาย x86 หรือถ้าคุณเขียนโปรแกรมจำลองเครื่อง x86 หรือแม้ว่าคุณจะพยายามใช้ ISA ในการออกแบบฮาร์ดแวร์

แม้ว่าฉันจะเข้าใจว่า "x86 น่าเกลียด!" ข้อโต้แย้งฉันยังคิดว่ามันสนุกกว่าการเขียนแอสเซมบลี x86 มากกว่า MIPS (เช่น) - อันหลังนั้นน่าเบื่อ การคอมไพเลอร์ควรเป็นเรื่องดีเสมอไปมากกว่าที่จะเป็นมนุษย์ ฉันไม่แน่ใจว่าชิปอาจเป็นศัตรูกับนักเขียนคอมไพเลอร์ได้มากกว่านี้ถ้ามันพยายาม ...

ส่วนที่น่าเกลียดที่สุดสำหรับฉันคือวิธีการแบ่งส่วน (โหมดจริง) ที่ใช้งานได้นั่นคือที่อยู่ทางกายภาพใด ๆ ที่มีส่วน 4096: นามแฝงออฟเซ็ต คุณต้องการสิ่งนั้นครั้งสุดท้ายเมื่อไหร่? สิ่งต่างๆจะง่ายกว่านี้มากถ้าส่วนของเซ็กเมนต์เป็นบิตลำดับที่สูงกว่าของแอดเดรส 32 บิต


m68k สนุกกว่ามากและดีสำหรับมนุษย์มากกว่า x86 (ซึ่งดูเหมือนจะไม่เป็น "มนุษย์" สำหรับโปรแกรมเมอร์ m68k หลายคน) ถ้า PoV ที่ถูกต้องคือวิธีที่มนุษย์สามารถเขียนโค้ดในชุดประกอบเหล่านั้นได้
ShinTakezou

กลุ่ม: การกำหนดแอดเดรสออฟเซ็ตเป็นความพยายามที่จะให้เข้ากันได้กับโลก CP / M ในระดับหนึ่ง หนึ่งในการตัดสินใจที่เลวร้ายที่สุดที่เคยมีมา
Turing เสร็จสมบูรณ์

@Turing Complete: segment: การชดเชยไม่ได้เป็นความพยายามที่จะอยู่ร่วมกับโลก CP / M เป็นหลัก สิ่งนี้เป็นความพยายามที่ประสบความสำเร็จอย่างมากในการอนุญาตให้โปรเซสเซอร์ 16 บิตสามารถจัดการกับข้อมูลมากกว่า 64 KBytes โดยการวางโค้ดข้อมูลสแต็กและพื้นที่หน่วยความจำอื่น ๆ ในเซ็กเมนต์ต่างๆ
Olof Forshell

1
ในความเป็นจริงการวางข้อมูลและสแต็กในส่วนต่างๆนั้นไร้ประโยชน์อย่างยิ่งสำหรับ C; มันใช้งานได้สำหรับ asm เท่านั้น ใน C ตัวชี้สามารถชี้ไปที่ข้อมูลที่มีระยะเวลาการจัดเก็บแบบคงที่อัตโนมัติหรือแบบไดนามิกดังนั้นจึงไม่มีวิธีใดที่จะนำส่วนนี้ออกไปได้ บางทีมันอาจจะมีประโยชน์สำหรับภาษาปาสคาลหรือฟอร์แทรนหรืออะไรบางอย่าง แต่ไม่ใช่สำหรับภาษา C ซึ่งเป็นภาษาที่โดดเด่นอยู่แล้วในเวลานั้น ...
R .. GitHub STOP HELPING ICE

2
@Bernd: เหตุผลที่ fs / gs ถูกเลือกสำหรับพื้นที่จัดเก็บเธรดโลคัลไม่ใช่ว่าการลงทะเบียนเซ็กเมนต์นั้นดีสำหรับสิ่งนี้ เป็นเพียงการที่ x86 ถูกอดอาหารอย่างจริงจังสำหรับการลงทะเบียนและการลงทะเบียนเซ็กเมนต์นั้นไม่ได้ใช้ รีจิสเตอร์วัตถุประสงค์ทั่วไปที่ชี้ไปที่โครงสร้างเธรดจะใช้งานได้ดีและในความเป็นจริงระบบ RISC จำนวนมากที่มีรีจิสเตอร์จำนวนมากใช้ระบบหนึ่งเป็นตัวชี้เธรด
R .. GitHub STOP HELPING ICE

1
  1. x86 มีชุดการลงทะเบียนสำหรับวัตถุประสงค์ทั่วไปที่ จำกัด มาก

  2. มันส่งเสริมรูปแบบการพัฒนาที่ไม่มีประสิทธิภาพมากในระดับต่ำสุด (นรก CISC) แทนที่จะเป็นวิธีการโหลด / จัดเก็บที่มีประสิทธิภาพ

  3. Intel ได้ทำการตัดสินใจที่น่าสยดสยองในการนำเสนอเซ็กเมนต์ / ออฟเซ็ตที่ดูโง่เขลาอย่างชัดเจน - โมเดลการยึดหน่วยความจำเพื่อให้เข้ากันได้กับเทคโนโลยีที่ล้าสมัย (ในเวลานี้แล้ว!)

  4. ในช่วงเวลาที่ทุกคนใช้ 32 บิต x86 ได้รั้งโลกพีซีกระแสหลักไว้ด้วยการเป็นเพียง 16 บิต (ส่วนใหญ่ - 8088 - แม้จะมีเส้นทางข้อมูลภายนอก 8 บิตเท่านั้นซึ่งก็น่ากลัวกว่า!)


สำหรับฉัน (และฉันเป็นทหารผ่านศึก DOS ที่ได้เห็นพีซีทุกรุ่นจากมุมมองของนักพัฒนา!) จุดที่ 3 นั้นแย่ที่สุด

ลองนึกภาพสถานการณ์ต่อไปนี้ในช่วงต้นทศวรรษที่ 90 (กระแสหลัก!):

a) ระบบปฏิบัติการที่มีข้อ จำกัด ที่บ้าคลั่งเนื่องจากเหตุผลเดิม (640kB ของ RAM ที่เข้าถึงได้ง่าย) - DOS

b) ส่วนขยายระบบปฏิบัติการ (Windows) ที่สามารถทำได้มากกว่าในแง่ของ RAM แต่มีข้อ จำกัด เมื่อพูดถึงสิ่งต่างๆเช่นเกม ฯลฯ ... และไม่ใช่สิ่งที่เสถียรที่สุดในโลก (โชคดีที่สิ่งนี้เปลี่ยนแปลงในภายหลัง แต่ฉัน ฉันพูดถึงต้นยุค 90 ที่นี่)

c) ซอฟต์แวร์ส่วนใหญ่ยังคงเป็น DOS และเราต้องสร้างดิสก์สำหรับบูตบ่อยๆสำหรับซอฟต์แวร์พิเศษเนื่องจากมี EMM386.exe นี้ที่บางโปรแกรมชอบคนอื่นเกลียด (โดยเฉพาะนักเล่นเกม - และฉันเป็นนักเล่นเกม AVID ในเวลานี้ - รู้ว่าฉันทำอะไร ฉันพูดถึงที่นี่)

d) เราถูก จำกัด ไว้ที่ MCGA 320x200x8 บิต (โอเคมีเทคนิคพิเศษอีกเล็กน้อย 360x480x8 เป็นไปได้ แต่ไม่มีการรองรับไลบรารีรันไทม์เท่านั้น) อย่างอื่นยุ่งและน่ากลัว ("VESA" - lol)

e) แต่ในแง่ของฮาร์ดแวร์เรามีเครื่อง 32 บิตพร้อม RAM และการ์ด VGA ไม่กี่เมกะไบต์พร้อมรองรับสูงสุด 1024x768

เหตุผลสำหรับสถานการณ์เลวร้ายนี้?

การตัดสินใจในการออกแบบที่เรียบง่ายโดย Intel ระดับคำสั่งเครื่องจักร (ไม่ใช่ระดับไบนารี!) เข้ากันได้กับบางสิ่งที่กำลังจะตายฉันคิดว่ามันคือ 8085 ปัญหาอื่น ๆ ที่ดูเหมือนจะไม่เกี่ยวข้องกัน (โหมดกราฟิก ฯลฯ ... สถาปัตยกรรมที่ใส่ใจแพลตฟอร์ม x86 ที่นำมาด้วยตัวเอง

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


ปัญหาสำคัญประการเดียวของสถาปัตยกรรมแบบแบ่งส่วน 8086 คือมีการลงทะเบียนเซกเมนต์ (ES) ที่ไม่เฉพาะเจาะจงเพียงตัวเดียวและภาษาโปรแกรมไม่ได้ออกแบบมาให้ทำงานกับมันได้อย่างมีประสิทธิภาพ รูปแบบของการกำหนดขนาดที่อยู่ที่ใช้จะทำงานได้ดีในภาษาเชิงวัตถุซึ่งไม่คาดว่าวัตถุจะสามารถเริ่มต้นที่ที่อยู่ที่กำหนดเองได้ (ถ้าวัตถุหนึ่งจัดแนววัตถุบนขอบเขตย่อหน้าการอ้างอิงวัตถุจะต้องมีเพียงสองไบต์เท่านั้น สี่). หากเปรียบเทียบรหัส Macintosh รุ่นแรกกับรหัสพีซี 8086 ดูดีจริงๆเมื่อเทียบกับ 68000
supercat

@supercat: ที่จริงแล้ว es ลงทะเบียนเฉพาะกับบางสิ่งบางอย่างกล่าวคือคำแนะนำสตริงที่ต้องจัดเก็บ (movs, stos) หรือการสแกน (cmps และ scas) กำหนดที่อยู่ 64KiB จากทุกเซกเมนต์รีจิสเตอร์ es ยังให้ "ลิงค์ที่ขาดหายไป" ไปยังหน่วยความจำนอกเหนือจากรหัสข้อมูลและหน่วยความจำสแต็ก (cs, ds, ss) การลงทะเบียนเซ็กเมนต์จัดเตรียมรูปแบบการป้องกันหน่วยความจำซึ่งคุณไม่สามารถจัดการกับหน่วยความจำ 64Kib ของรีจิสเตอร์ได้ คุณเสนอวิธีแก้ปัญหาอะไรที่ดีกว่าเนื่องจาก x86 เป็นสถาปัตยกรรม 16 บิตและข้อ จำกัด ของการพิมพ์หินในแต่ละวัน
Olof Forshell

@OlofForshell: ES ถูกใช้สำหรับคำสั่งสตริง แต่สามารถใช้เป็นรีจิสเตอร์ที่ไม่มีข้อผูกมัดสำหรับรหัสที่ไม่ได้ใช้ วิธีที่จะลดปัญหาคอขวดของ seg-reg โดยไม่ต้องใช้พื้นที่ opcode มากเกินไปคือต้องมีคำนำหน้า "rseg" ซึ่งจะระบุว่าสำหรับคำสั่งรูปแบบ r / m ต่อไปนี้ช่อง "r" จะเลือกจาก CS / SS / DS / ES / FS / GS / ?? / ?? แทน AX / BX / CX / DX / SI / DI / SP / BP และมีคำนำหน้าสำหรับ FS / GS และคำแนะนำสำหรับ LFS และ LGS (เช่น LDS และ LES) ฉันไม่รู้ว่าสถาปัตยกรรมขนาดเล็กสำหรับ 8086 ถูกวางไว้อย่างไร แต่ฉันคิดว่าบางอย่างจะได้ผล
supercat

@supercat: อย่างที่ฉันเขียนว่า "register es ยังให้ลิงค์ที่ขาดไปยังหน่วยความจำอื่นที่ไม่ใช่ ... " Fs และ gs ยังไม่มาถึง 386 เท่าที่ฉันจำได้
Olof Forshell

1
@OlofForshell: พวกเขาไม่ได้ทำให้สถาปัตยกรรม 80286 แย่กว่าสถาปัตยกรรม 8086 ในแง่ส่วนใหญ่ ประเด็นของฉันคือการเพิ่มการลงทะเบียนเซกเมนต์อีกสองสามเซกเมนต์ (หรือแม้แต่อันเดียวสำหรับเรื่องนั้น) จะทำให้สถาปัตยกรรม 8086 มีประโยชน์มากขึ้นและชุดคำสั่งน่าจะสะอาดกว่าและมีประโยชน์มากขึ้นหากสามารถเข้าถึงการลงทะเบียนเซ็กเมนต์ได้เหมือนกับ คนอื่น ๆ
supercat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.