บทความนี้ต้องการการอ้างอิงเพิ่มเติมเพื่อการตรวจสอบโปรด ( กรกฎาคม 2020 ) |
ในการคำนวณเอนเดียนเนสคือลำดับที่ไบต์ภายในคำของข้อมูลดิจิทัลถูกส่งผ่านสื่อการสื่อสารข้อมูลหรือระบุที่อยู่ (โดยที่อยู่ที่เพิ่มขึ้น) ในหน่วยความจำคอมพิวเตอร์โดยนับเฉพาะความสำคัญ ของไบต์ เมื่อเทียบกับความเก่าแก่ เอนเดียนเนสแสดงเป็นหลักเป็นบิ๊กเอนเดียน (BE) หรือลิตเทิลเอนเดียน (LE) ซึ่งเป็นคำศัพท์ที่ แดนนี่ โคเฮนแนะนำในวิทยาการคอมพิวเตอร์สำหรับการเรียงลำดับข้อมูลในInternet Experiment Noteที่ตีพิมพ์ในปี 1980 [1]คำคุณศัพท์เอนเดียนมีต้นกำเนิดมาจากงานเขียนของ โจนา ธาน สวิฟต์ นักเขียนแองโกลไอริชในศตวรรษที่ 18 ในนวนิยายGulliver's Travels ที่ ตีพิมพ์ในปี 1726 เขาบรรยายถึงความขัดแย้งระหว่างนิกายของชาวลิลลิพุตที่แบ่งออกเป็นนิกายที่ทำลายเปลือกไข่ต้มจากบิ๊กเอนด์หรือจากลิตเทิลเอนด์[2] [3]โดยการเปรียบเทียบ ซีพียูอาจอ่านคำดิจิทัลว่าบิ๊กเอนด์ก่อนหรือลิตเทิลเอนด์ก่อน
คอมพิวเตอร์จัดเก็บข้อมูลในกลุ่มของบิตไบนารีที่มีขนาดต่างกัน แต่ละกลุ่มจะได้รับหมายเลขที่เรียกว่าที่อยู่ซึ่งคอมพิวเตอร์จะใช้ในการเข้าถึงข้อมูลนั้น ในคอมพิวเตอร์สมัยใหม่ส่วนใหญ่ กลุ่มข้อมูลที่เล็กที่สุดที่มีที่อยู่จะมีความยาวแปดบิตและเรียกว่าไบต์ กลุ่มข้อมูลที่ใหญ่กว่าจะประกอบด้วยไบต์สองไบต์ขึ้นไป ตัวอย่างเช่น คำ ขนาด 32 บิตจะมีสี่ไบต์ คอมพิวเตอร์สามารถกำหนดหมายเลขไบต์แต่ละไบต์ในกลุ่มข้อมูลที่ใหญ่กว่าได้สองวิธี โดยเริ่มจากปลายด้านใดด้านหนึ่ง เอนเดียนเนสทั้งสองประเภทใช้กันอย่างแพร่หลายในงานวิศวกรรมอิเล็กทรอนิกส์ดิจิทัล การเลือกเอนเดียนเนสเบื้องต้นของการออกแบบใหม่มักจะไม่แน่นอน แต่การปรับปรุงและอัปเดตเทคโนโลยีในภายหลังทำให้เอนเดียนเนสที่มีอยู่คงอยู่ต่อไปเพื่อรักษาความเข้ากันได้แบบย้อนหลัง
ระบบบิ๊กเอนเดียนจะจัดเก็บไบต์ที่สำคัญที่สุดของคำไว้ในที่อยู่หน่วยความจำ ที่เล็กที่สุด และไบต์ที่สำคัญที่สุดไว้ในที่อยู่หน่วยความจำที่ใหญ่ที่สุด ในทางตรงกันข้าม ระบบบิ๊กเอนเดียนจะจัดเก็บไบต์ที่สำคัญที่สุดไว้ในที่อยู่หน่วยความจำที่เล็กที่สุด[4] [5] [6]จากทั้งสองระบบ บิ๊กเอนเดียนจึงใกล้เคียงกับวิธีการเขียนตัวเลขจากซ้ายไปขวาในภาษาอังกฤษมากกว่า โดยเปรียบเทียบตัวเลขกับไบต์ไบเอนเดียนเป็นคุณสมบัติที่ได้รับการสนับสนุนจากสถาปัตยกรรมคอมพิวเตอร์จำนวนมากที่มีคุณสมบัติแบบสลับเอนเดียนได้ในการดึงและจัดเก็บข้อมูลหรือในการดึงคำสั่ง การจัดลำดับอื่นๆ เรียกโดยทั่วไปว่ามิดเดิลเอนเดียนหรือแบบผสมเอนเดียน [ 7] [8] [9] [10]
บิ๊กเอนเดียนเนสเป็นการจัดลำดับที่โดดเด่นในโปรโตคอลเครือข่าย เช่น ในชุดโปรโตคอลอินเทอร์เน็ตซึ่งเรียกว่าการจัดลำดับเครือข่ายโดยส่งไบต์ที่สำคัญที่สุดก่อน ในทางกลับกัน ลิตเติ้ลเอนเดียนเนสเป็นการจัดลำดับที่โดดเด่นสำหรับสถาปัตยกรรมโปรเซสเซอร์ ( x86 , การใช้งาน ARM ส่วนใหญ่, การใช้งาน RISC-Vพื้นฐาน) และหน่วยความจำที่เกี่ยวข้องรูปแบบไฟล์สามารถใช้การจัดลำดับแบบใดแบบหนึ่งก็ได้ บางรูปแบบใช้การผสมผสานของทั้งสองแบบหรือมีตัวบ่งชี้ว่าใช้การจัดลำดับแบบใดตลอดทั้งไฟล์[11]
หน่วยความจำของคอมพิวเตอร์ประกอบด้วยลำดับเซลล์จัดเก็บข้อมูล ( หน่วย ที่สามารถระบุตำแหน่งได้ เล็กที่สุด ) ในเครื่องที่รองรับการระบุตำแหน่งไบต์หน่วยเหล่านี้เรียกว่าไบต์แต่ละไบต์จะถูกระบุและเข้าถึงในฮาร์ดแวร์และซอฟต์แวร์โดยใช้ที่อยู่หน่วยความจำหากจำนวนไบต์ทั้งหมดในหน่วยความจำคือnที่อยู่จะถูกนับจาก 0 ถึงn − 1
โปรแกรมคอมพิวเตอร์มักใช้โครงสร้างข้อมูลหรือฟิลด์ที่อาจประกอบด้วยข้อมูลมากกว่าที่สามารถจัดเก็บในไบต์เดียวได้ ในบริบทของบทความนี้ ซึ่งประเภทของข้อมูลนั้นไม่สามารถซับซ้อนได้ตามอำเภอใจ "ฟิลด์" ประกอบด้วยลำดับไบต์ที่ต่อเนื่องกันและแสดงถึง "ค่าข้อมูลธรรมดา" ซึ่งอย่างน้อยก็อาจจัดการได้ด้วยคำสั่งฮาร์ดแวร์เพียงคำสั่งเดียวในระบบส่วนใหญ่ ที่อยู่ของค่าข้อมูลธรรมดาหลายไบต์คือที่อยู่ของไบต์แรก (ไบต์ที่มีที่อยู่ต่ำสุด) มีข้อยกเว้นสำหรับกฎนี้ ตัวอย่างเช่น คำสั่ง Add ของIBM 1401จะระบุฟิลด์ความยาวแปรผันที่ตำแหน่งลำดับต่ำ (ที่อยู่สูงสุด) โดยความยาวของฟิลด์ถูกกำหนดโดยเครื่องหมายคำที่ตั้งค่าไว้ที่ตำแหน่งลำดับสูง (ที่อยู่ต่ำสุด) เมื่อดำเนินการเช่นการบวก โปรเซสเซอร์จะเริ่มต้นที่ตำแหน่งลำดับต่ำที่อยู่สูงสุดของฟิลด์ทั้งสองและทำงานลงไปจนถึงลำดับสูง[ จำเป็นต้องอ้างอิง ]
คุณสมบัติที่สำคัญอีกประการหนึ่งของการที่ไบต์เป็นส่วนหนึ่งของ "ฟิลด์" คือ "ความสำคัญ" ของไบต์ คุณสมบัติเหล่านี้ของส่วนต่างๆ ของฟิลด์มีบทบาทสำคัญในลำดับการเข้าถึงไบต์โดยฮาร์ดแวร์คอมพิวเตอร์ กล่าวคือ โดยอัลกอริทึมระดับต่ำที่นำไปสู่ผลลัพธ์ของคำสั่งคอมพิวเตอร์
ระบบตัวเลขตามตำแหน่ง (ส่วนใหญ่ใช้ฐาน 2 หรือไม่ค่อยใช้ฐาน 10) เป็นวิธีหลักในการแสดงและโดยเฉพาะการจัดการข้อมูลจำนวนเต็มโดยคอมพิวเตอร์ ในรูปแบบบริสุทธิ์ วิธีนี้จะใช้ได้กับจำนวนเต็มที่ไม่เป็นลบที่มีขนาดปานกลาง เช่น ประเภทข้อมูล C unsigned
ในระบบตัวเลขดังกล่าวค่าของหลักที่ประกอบเป็นจำนวนเต็มนั้นจะถูกกำหนดไม่เพียงแค่จากค่าของหลักเดียวเท่านั้น แต่ยังรวมถึงตำแหน่งที่หลักนั้นถืออยู่ในจำนวนเต็มด้วย ซึ่งเรียกว่า ความสำคัญของหลักนั้น ตำแหน่งเหล่านี้สามารถแมปไปยังหน่วยความจำได้สองวิธีหลัก: [12]
ในสำนวนเหล่านี้ คำว่า "จุดสิ้นสุด" หมายถึงจุดที่ ความ สำคัญน้อยใหญ่ถูกเขียนไว้ก่อน กล่าวคือ จุด ที่ สนามเริ่มต้น
ข้อมูลจำนวนเต็มที่สนับสนุนโดยตรงจากฮาร์ดแวร์คอมพิวเตอร์จะมีความกว้างคงที่ของกำลังต่ำ 2 เช่น 8 บิต ≙ 1 ไบต์, 16 บิต ≙ 2 ไบต์, 32 บิต ≙ 4 ไบต์, 64 บิต ≙ 8 ไบต์, 128 บิต ≙ 16 ไบต์ ลำดับการเข้าถึงระดับต่ำไปยังไบต์ของฟิลด์ดังกล่าวขึ้นอยู่กับการดำเนินการที่จะดำเนินการ ไบต์ที่มีนัยสำคัญน้อยที่สุดจะถูกเข้าถึงก่อนสำหรับการบวก ลบและคูณไบต์ที่มีนัยสำคัญมากที่สุดจะถูกเข้าถึงก่อนสำหรับการหารและการเปรียบเทียบดู § ลำดับการคำนวณ
เมื่อต้องเปรียบเทียบสตริงอักขระ (ข้อความ) กันเอง เช่น เพื่อรองรับกลไกบางอย่าง เช่นการเรียงลำดับมักจะทำการเปรียบเทียบแบบเรียงตามพจนานุกรมซึ่งองค์ประกอบตำแหน่งเดียว (อักขระ) ก็มีค่าตำแหน่งเช่นกัน การเปรียบเทียบแบบเรียงตามพจนานุกรมทำได้แทบทุกที่ อักขระตัวแรกจะมีอันดับสูงสุด เช่น ในสมุดโทรศัพท์ เครื่องจักรเกือบทั้งหมดที่สามารถทำสิ่งนี้ได้โดยใช้คำสั่งเดียวเป็นแบบบิ๊กเอนเดียนหรืออย่างน้อยก็แบบผสมเอนเดียน[ จำเป็นต้องอ้างอิง ]
ตัวเลขเต็มที่เขียนเป็นข้อความนั้นจะแสดงเป็นหลักสำคัญที่สุดก่อนในหน่วยความจำเสมอ ซึ่งคล้ายกับบิ๊กเอนเดียน โดยไม่ขึ้นอยู่กับทิศทางของข้อความ
เมื่อไบต์หน่วยความจำถูกพิมพ์แบบต่อเนื่องกันจากซ้ายไปขวา (เช่น ในการถ่ายโอนข้อมูลแบบเลขฐานสิบหก ) การแสดงจำนวนเต็มแบบ little-endian จะมีความสำคัญเพิ่มขึ้นจากซ้ายไปขวา กล่าวอีกนัยหนึ่ง คือ เมื่อแสดงภาพแล้ว จะดูเหมือนย้อนกลับ ซึ่งอาจขัดกับสัญชาตญาณ
พฤติกรรมดังกล่าวเกิดขึ้น เช่น ในFourCCหรือเทคนิคที่คล้ายคลึงกัน ซึ่งเกี่ยวข้องกับการบรรจุอักขระลงในจำนวนเต็ม เพื่อให้กลายเป็นลำดับของอักขระเฉพาะในหน่วยความจำ ตัวอย่างเช่น ใช้สตริง "JOHN" ซึ่งจัดเก็บในรูปแบบASCII เลขฐาน สิบหก บนเครื่องบิ๊กเอนเดียน ค่าจะปรากฏจากซ้ายไปขวา ซึ่งตรงกับลำดับสตริงที่ถูกต้องสำหรับการอ่านผลลัพธ์ ("JOH N") แต่บนเครื่องลิตเทิลเอนเดียน เราจะเห็น "NHO J" เครื่องมิดเดิลเอนเดียนทำให้เรื่องนี้ซับซ้อนยิ่งขึ้น ตัวอย่างเช่น บนPDP-11ค่า 32 บิตจะถูกจัดเก็บเป็นคำ 16 บิตสองคำคือ "JO" "HN" ในรูปแบบบิ๊กเอนเดียน โดยอักขระในคำ 16 บิตจะถูกจัดเก็บในรูปแบบลิตเทิลเอนเดียน ส่งผลให้ได้ "OJN H" [ ต้องการอ้างอิง ]
การสลับไบต์ประกอบด้วยการจัดเรียงไบต์ใหม่เพื่อเปลี่ยนค่าเอนเดียน คอมไพเลอร์หลายตัวมีบิวต์ อิน ที่มักจะถูกคอมไพล์เป็นคำสั่งของโปรเซสเซอร์เนทีฟ ( bswap
/ movbe
) เช่น__builtin_bswap32
อินเทอร์เฟซซอฟต์แวร์สำหรับการสลับได้แก่:
winsock2.h
.endian.h
(จาก/ถึง BE และ LE สูงสุด 64 บิต) [14]OSByteOrder.h
(จาก/ถึง BE และ LE สูงสุด 64 บิต)std::byteswap
ก์ชั่นในC++23 [ 15]ชุดคำสั่ง CPUบางชุดให้การสนับสนุนดั้งเดิมสำหรับการสลับไบต์เอนเดียน เช่นbswap
[16] ( x86 — 486และใหม่กว่า, i960 — i960Jx และใหม่กว่า[17] ) และrev
[18] ( ARMv6และใหม่กว่า)
คอมไพเลอร์บางตัวมีสิ่งอำนวยความสะดวกในตัวสำหรับการสลับไบต์ ตัวอย่างเช่น คอมไพเลอร์ Intel Fortranรองรับตัวระบุที่ไม่เป็นมาตรฐานCONVERT
เมื่อเปิดไฟล์ เช่น: คอมไพเลอร์อื่นๆ มีตัวเลือกสำหรับการสร้างโค้ดที่เปิดใช้งานการแปลงสำหรับการดำเนินการ IO ของไฟล์ทั้งหมดทั่วโลก ซึ่งช่วยให้สามารถนำโค้ดกลับมาใช้ใหม่บนระบบที่มีเอนเดียนตรงกันข้ามได้โดยไม่ต้องแก้ไขโค้ดOPEN(unit, CONVERT='BIG_ENDIAN',...)
ในระบบส่วนใหญ่ ที่อยู่ของค่าหลายไบต์คือที่อยู่ของไบต์แรก (ไบต์ที่มีที่อยู่ต่ำสุด) ระบบ little-endian ของประเภทนั้นมีคุณสมบัติที่ว่าสำหรับค่าข้อมูลต่ำเพียงพอ ค่าเดียวกันสามารถอ่านได้จากหน่วยความจำที่ความยาวต่างกันโดยไม่ต้องใช้ที่อยู่ต่างกัน (แม้ว่าจะ มีการกำหนดข้อจำกัด การจัด ตำแหน่ง ) ตัวอย่างเช่น ตำแหน่งหน่วยความจำ 32 บิตที่มีเนื้อหา4A 00 00 00
สามารถอ่านได้ที่ที่อยู่เดียวกันกับ8 บิต (ค่า = 4A), 16 บิต (004A), 24 บิต (00004A) หรือ32 บิต (0000004A) ซึ่งทั้งหมดจะรักษาค่าตัวเลขเดียวกันไว้ แม้ว่าคุณสมบัติ little-endian นี้แทบจะไม่ได้ใช้โดยตรงโดยโปรแกรมเมอร์ระดับสูง แต่บางครั้งก็ใช้โดยโปรแกรมปรับแต่งโค้ดและ โปรแกรมเมอร์ ภาษาแอสเซมบลีแม้ว่า C++ จะไม่อนุญาตให้ใช้ แต่ โค้ด การเล่นคำประเภท ดังกล่าว ได้รับอนุญาตให้ "กำหนดโดยการใช้งาน" โดยมาตรฐาน C11 [19]และใช้กันทั่วไป[20]ในโค้ดที่โต้ตอบกับฮาร์ดแวร์[21]
การดำเนินการบางอย่างในระบบตัวเลขตำแหน่งมีลำดับตามธรรมชาติหรือตามลำดับที่ต้องการซึ่งขั้นตอนพื้นฐานจะต้องถูกดำเนินการ ลำดับนี้อาจส่งผลต่อประสิทธิภาพการทำงานบนโปรเซสเซอร์และไมโครคอนโทรลเลอร์ ที่สามารถระบุตำแหน่งไบต์ขนาดเล็กได้ อย่างไรก็ตาม โปรเซสเซอร์ประสิทธิภาพสูงมักจะดึงตัวดำเนินการหลายไบต์จากหน่วยความจำในระยะเวลาเดียวกับที่ดึงไบต์เดียว ดังนั้นความซับซ้อนของฮาร์ดแวร์จึงไม่ได้รับผลกระทบจากการจัดลำดับไบต์
การบวก ลบ และคูณจะเริ่มจากตำแหน่งหลักที่มีนัยสำคัญน้อยที่สุด จากนั้นจึงส่งต่อค่าที่เกินไปยังตำแหน่งที่มีความสำคัญมากขึ้นตามลำดับ ในระบบส่วนใหญ่ ที่อยู่ของค่าหลายไบต์คือที่อยู่ของไบต์แรก (ไบต์ที่มีที่อยู่ต่ำสุด) การดำเนินการเหล่านี้จะง่ายขึ้นเล็กน้อยเมื่อใช้เครื่อง little-endian ซึ่งไบต์แรกนี้ประกอบด้วยหลักที่มีนัยสำคัญน้อยที่สุด
การเปรียบเทียบและการหารเริ่มต้นที่หลักที่มีนัยสำคัญที่สุดและส่งต่อค่าพาดที่เป็นไปได้ไปยังหลักที่มีนัยสำคัญน้อยกว่าในลำดับถัดไป สำหรับค่าตัวเลขที่มีความยาวคงที่ (โดยทั่วไปคือความยาว 1,2,4,8,16) การดำเนินการเหล่านี้จะง่ายกว่าเล็กน้อยในเครื่องบิ๊กเอนเดียน
โปรเซสเซอร์ big-endian บางตัว (เช่น IBM System/360 และรุ่นต่อๆ มา) มีคำสั่งฮาร์ดแวร์สำหรับการเปรียบเทียบสตริงอักขระที่มีความยาวต่างกันตามลำดับตัวอักษร
การขนส่งข้อมูลตามปกติด้วย คำสั่ง กำหนดค่าโดยหลักการแล้วจะไม่ขึ้นอยู่กับเอนเดียนเนสของโปรเซสเซอร์
โปรเซสเซอร์ในอดีตและปัจจุบันจำนวนมากใช้การแสดงหน่วยความจำแบบบิ๊กเอนเดียน ไม่ว่าจะใช้เฉพาะหรือเป็นตัวเลือกการออกแบบIBM System/360ใช้ลำดับไบต์แบบบิ๊กเอนเดียน เช่นเดียวกับรุ่นต่อๆ มาอย่างSystem/370 , ESA/390และz/Architecture PDP -10ใช้การกำหนดแอดเดรสแบบบิ๊กเอนเดียนสำหรับคำสั่งที่เน้นไบต์ มินิคอมพิวเตอร์ IBM Series/1ใช้ลำดับไบต์แบบบิ๊กเอนเดียน โปรเซสเซอร์ Motorola 6800/6801 , 6809และซีรีส์ 68000 ใช้รูปแบบบิ๊กเอนเดียน สถาปัตยกรรมบิ๊กเอนเดียนเท่านั้น ที่ รวมถึง IBM z/ArchitectureและOpenRISC
Datapoint 2200ใช้ลอจิกแบบบิตอนุกรมง่ายๆ พร้อมลิตเติ้ลเอนเดียนเพื่ออำนวยความสะดวกในการแพร่กระจายการพก พา เมื่อ Intel พัฒนา ไมโครโปรเซสเซอร์ 8008สำหรับ Datapoint พวกเขาใช้ลิตเติ้ลเอนเดียนเพื่อความเข้ากันได้ อย่างไรก็ตาม เนื่องจาก Intel ไม่สามารถส่งมอบ 8008 ได้ทันเวลา Datapoint จึงใช้การผสานรวมขนาดกลางที่เทียบเท่า แต่ความเป็นลิตเติ้ลเอนเดียนนั้นยังคงอยู่ในดีไซน์ของ Intel ส่วนใหญ่ รวมถึงMCS-48และ8086และตัวต่อๆ มาx86 [22] [23] DEC Alpha , Atmel AVR , VAX , ตระกูล MOS Technology 6502 (รวมถึงWestern Design Center 65802และ65C816 ), Zilog Z80 (รวมถึงZ180และeZ80 ), Altera Nios IIและโปรเซสเซอร์และตระกูลโปรเซสเซอร์อื่นๆ อีกมากมายก็เป็นลิตเติ้ลเอนเดียนเช่นกัน
ซึ่งแตกต่างจากโปรเซสเซอร์ Intel รุ่นอื่นๆ Intel 8051คาดว่าจะมีที่อยู่ 16 บิตสำหรับ LJMP และ LCALL ในรูปแบบบิ๊กเอนเดียน อย่างไรก็ตาม คำสั่ง xCALL จะจัดเก็บที่อยู่ส่งกลับลงในสแต็กในรูปแบบลิตเทิลเอนเดียน[24]
สถาปัตยกรรมชุดคำสั่ง IA -32และx86-64ใช้รูปแบบ little-endian สถาปัตยกรรมชุดคำสั่งอื่นๆ ที่ปฏิบัติตามอนุสัญญานี้ ซึ่งอนุญาตเฉพาะโหมด little-endian ได้แก่Nios II , Andes Technology NDS32 และQualcomm Hexagon
สถาปัตยกรรมชุดคำสั่งบางชุดเป็น "ไบเอนเดียน" และอนุญาตให้เรียกใช้ซอฟต์แวร์ที่เป็นแบบไบเอนเดียน ได้แก่Power ISA , SPARC , ARM AArch64 , C-Sky และRISC-V IBM AIXและIBM iทำงานในโหมดบิ๊กเอนเดียนบน Power ISA แบบไบเอนเดียน เดิมที Linuxทำงานในโหมดบิ๊กเอนเดียน แต่ในปี 2019 IBM ได้เปลี่ยนไปใช้โหมดลิตเติ้ลเอนเดียนสำหรับ Linux เพื่อให้การพอร์ตซอฟต์แวร์ Linux จาก x86 ไปยัง Power ง่ายขึ้น[25] [26] SPARC ไม่มีการปรับใช้แบบลิตเติ้ลเอนเดียนที่เกี่ยวข้อง เนื่องจากทั้งOracle Solarisและ Linux ทำงานในโหมดบิ๊กเอนเดียนบนระบบ SPARC แบบไบเอนเดียน และสามารถถือเป็นแบบบิ๊กเอนเดียนได้ในทางปฏิบัติ ARM, C-Sky และ RISC-V ไม่มีการปรับใช้แบบบิ๊กเอนเดียนที่เกี่ยวข้อง และสามารถถือเป็นแบบลิตเติ้ลเอนเดียนได้ในทางปฏิบัติ
สถาปัตยกรรมบางรุ่น (รวมถึงARMเวอร์ชัน 3 ขึ้นไปPowerPC , Alpha , SPARC V9, MIPS , Intel i860 , PA-RISC , SuperH SH-4และIA-64 ) มีการตั้งค่าที่อนุญาตให้สลับเอนเดียนได้ในการดึงและจัดเก็บข้อมูล การดึงคำสั่ง หรือทั้งสองอย่าง คุณลักษณะนี้สามารถปรับปรุงประสิทธิภาพหรือทำให้ตรรกะของอุปกรณ์เครือข่ายและซอฟต์แวร์ง่ายขึ้น คำว่าไบเอนเดียนเมื่อกล่าวถึงฮาร์ดแวร์ หมายถึงความสามารถของเครื่องในการคำนวณหรือส่งข้อมูลในรูปแบบเอนเดียน
สถาปัตยกรรมเหล่านี้หลายรายการสามารถสลับได้ทางซอฟต์แวร์เพื่อให้เป็นรูปแบบเอนเดียนเริ่มต้นโดยเฉพาะ (โดยปกติจะทำเมื่อคอมพิวเตอร์เริ่มต้น) อย่างไรก็ตาม ในระบบบางระบบ ฮาร์ดแวร์บนเมนบอร์ดจะเลือกรูปแบบเอนเดียนเริ่มต้น และไม่สามารถเปลี่ยนแปลงได้ทางซอฟต์แวร์ (เช่น Alpha ซึ่งทำงานในโหมดบิ๊กเอนเดียนบนCray T3E เท่านั้น )
คำว่าไบเอนเดียนหมายถึงวิธีการที่โปรเซสเซอร์จัดการการเข้าถึงข้อมูล การเข้าถึงคำสั่ง (การดึงคำสั่ง) บนโปรเซสเซอร์ที่กำหนดอาจยังคงถือว่ามีเอนเดียนคงที่ แม้ว่าการเข้าถึงข้อมูลจะเป็นไบเอนเดียนอย่างสมบูรณ์ก็ตาม แม้ว่าจะไม่ใช่กรณีเสมอไป เช่น บน CPU Itanium ที่ใช้ IA-64 ของ Intel ซึ่งอนุญาตให้ใช้ทั้งสองแบบ
CPU แบบไบเอนเดียนบางตัวต้องการความช่วยเหลือจากเมนบอร์ดเพื่อสลับเอนเดียนอย่างสมบูรณ์ ตัวอย่างเช่น โปรเซสเซอร์ PowerPC ที่เน้นเดสก์ท็อป 32 บิต ในโหมดลิตเติ้ลเอนเดียนจะทำหน้าที่เป็นลิตเติ้ลเอนเดียนจากมุมมองของโปรแกรมที่กำลังทำงาน แต่ต้องให้เมนบอร์ดทำการสลับ 64 บิตในทุกเลน 8 ไบต์เพื่อให้แน่ใจว่ามุมมองแบบลิตเติ้ลเอนเดียนของสิ่งต่างๆ จะนำไปใช้กับ อุปกรณ์ I/Oในกรณีที่ไม่มีฮาร์ดแวร์เมนบอร์ดที่ผิดปกตินี้ ซอฟต์แวร์ไดรเวอร์อุปกรณ์จะต้องเขียนไปยังที่อยู่ที่แตกต่างกันเพื่อเลิกทำการแปลงที่ไม่สมบูรณ์ และจะต้องทำการสลับไบต์ปกติด้วย[ งานวิจัยดั้งเดิม? ]
CPU บางตัว เช่น โปรเซสเซอร์ PowerPC จำนวนมากที่ออกแบบมาเพื่อการฝังตัว และโปรเซสเซอร์ SPARC เกือบทั้งหมด อนุญาตให้เลือกความละเอียดแบบเอนเดียนในแต่ละเพจได้
โปรเซสเซอร์ SPARC ตั้งแต่ช่วงปลายทศวรรษ 1990 (โปรเซสเซอร์ที่สอดคล้องกับ SPARC v9) อนุญาตให้เลือกความเป็น endianness ของข้อมูลได้กับแต่ละคำสั่งที่โหลดจากหรือจัดเก็บลงในหน่วยความจำ
สถาปัตยกรรมARMรองรับโหมดบิ๊กเอนเดียนสองโหมด เรียกว่าBE-8และBE-32 [ 27] CPU จนถึง ARMv5 รองรับเฉพาะโหมด BE-32 หรือโหมดไม่แปรเปลี่ยนคำเท่านั้น การเข้าถึงแบบ 32 บิตที่จัดตำแหน่งตามธรรมชาติจะทำงานเหมือนในโหมดลิตเติ้ลเอนเดียน แต่การเข้าถึงไบต์หรือคำขนาด 16 บิตจะถูกส่งต่อไปยังที่อยู่ที่สอดคล้องกัน และไม่อนุญาตให้เข้าถึงแบบไม่จัดตำแหน่ง ARMv6 แนะนำโหมด BE-8 หรือโหมดไม่แปรเปลี่ยนไบต์ ซึ่งการเข้าถึงไบต์เดียวจะทำงานเหมือนในโหมดลิตเติ้ลเอนเดียน แต่การเข้าถึงคำขนาด 16 บิต 32 บิต หรือ (เริ่มต้นด้วย ARMv8) 64 บิต จะส่งผลให้มีการสลับไบต์ของข้อมูล วิธีนี้ช่วยลดความซับซ้อนในการเข้าถึงหน่วยความจำแบบไม่จัดตำแหน่ง รวมถึงการเข้าถึงรีจิสเตอร์อื่นๆ ที่ไม่ใช่ 32 บิตโดยแมปหน่วยความจำ
โปรเซสเซอร์หลายตัวมีคำสั่งในการแปลงคำในรีจิสเตอร์ให้เป็นเอนเดียนตรงกันข้าม นั่นคือ สลับลำดับของไบต์ในคำขนาด 16, 32 หรือ 64 บิต
ซีพียูที่มีสถาปัตยกรรม x86 และ x86-64 ของ Intel ล่าสุดมีคำสั่ง MOVBE ( Intel Coreตั้งแต่เจเนอเรชัน 4 หลังจากAtom ) [28]ซึ่งดึงคำในรูปแบบบิ๊กเอนเดียนจากหน่วยความจำหรือเขียนคำลงในหน่วยความจำในรูปแบบบิ๊กเอนเดียน โปรเซสเซอร์เหล่านี้เป็นแบบลิตเทิลเอนเดียนอย่างแท้จริง
นอกจากนี้ยังมีอุปกรณ์ที่ใช้รูปแบบต่างๆ ในสถานที่ต่างๆ เช่น เครื่องวัดแบตเตอรี่ BQ27421 ของ Texas Instrumentsใช้รูปแบบ little-endian สำหรับรีจิสเตอร์และรูปแบบ big-endian สำหรับหน่วยความจำแบบเข้าถึงโดยสุ่ม
SPARCเคยใช้บิ๊กเอนเดียนมาโดยตลอดจนถึงเวอร์ชัน 9 ซึ่งเป็นแบบไบเอนเดียน ในทำนองเดียวกัน โปรเซสเซอร์ IBM POWER รุ่นแรกๆ ก็เป็นแบบบิ๊กเอนเดียน แต่ รุ่นต่อๆ มาของ PowerPCและPower ISAก็เป็นแบบไบเอนเดียนแล้วสถาปัตยกรรม ARMเป็นแบบลิตเติ้ลเอนเดียนก่อนเวอร์ชัน 3 ซึ่งกลายมาเป็นไบเอนเดียน
แม้ว่าโปรเซสเซอร์หลายตัวจะใช้พื้นที่จัดเก็บแบบ little-endian สำหรับข้อมูลทุกประเภท (จำนวนเต็ม จุดลอยตัว) แต่ก็มีสถาปัตยกรรมฮาร์ดแวร์จำนวนหนึ่งที่ ตัวเลข จุดลอยตัวแสดงในรูปแบบบิ๊กเอนเดียนในขณะที่จำนวนเต็มแสดงในรูปแบบลิตเติลเอนเดียน[29]มี โปรเซสเซอร์ ARMที่มีการแสดงตัวเลขจุดลอยตัวแบบผสมเอนเดียนสำหรับตัวเลขความแม่นยำสองเท่า โดยคำ 32 บิตทั้งสองคำจะถูกจัดเก็บเป็นลิตเติลเอนเดียน แต่คำที่สำคัญที่สุดจะถูกจัดเก็บก่อนVAX float point จะจัดเก็บคำ 16 บิตแบบลิตเติลเอนเดียนตามลำดับบิ๊กเอนเดียน เนื่องจากมีรูปแบบจุดลอยตัวจำนวนมากที่ไม่มีการแสดงมาตรฐานเครือข่ายสำหรับรูปแบบเหล่านี้ มาตรฐาน XDRจึงใช้ IEEE 754 บิ๊กเอนเดียนเป็นการแสดง ดังนั้นอาจดูแปลกที่ มาตรฐานจุดลอยตัว IEEE 754 ที่แพร่หลาย ไม่ได้ระบุถึงความเป็นเอนเดียน[30]ในทางทฤษฎี นั่นหมายความว่าแม้แต่ข้อมูลจุดลอยตัว IEEE มาตรฐานที่เขียนโดยเครื่องหนึ่งก็อาจไม่สามารถอ่านได้โดยเครื่องอื่น อย่างไรก็ตาม ในคอมพิวเตอร์มาตรฐานสมัยใหม่ (เช่น การใช้งาน IEEE 754) เราสามารถสันนิษฐานได้อย่างปลอดภัยว่าค่าเอนเดียนของจำนวนจุดลอยตัวจะเหมือนกันกับจำนวนเต็ม ซึ่งทำให้การแปลงทำได้ง่ายขึ้นโดยไม่คำนึงถึงประเภทข้อมูล อย่างไรก็ตามระบบฝังตัว ขนาดเล็ก ที่ใช้รูปแบบจุดลอยตัวพิเศษอาจเป็นอีกเรื่องหนึ่ง
คำสั่งส่วนใหญ่ที่พิจารณาจนถึงขณะนี้มีขนาด (ความยาว) ของตัวดำเนินการภายในโค้ดการดำเนินการความยาวตัวดำเนินการที่พร้อมใช้งานคือ 1, 2, 4, 8 หรือ 16 ไบต์ แต่ยังมีสถาปัตยกรรมที่ความยาวของตัวดำเนินการอาจอยู่ในฟิลด์แยกต่างหากของคำสั่งหรือกับตัวดำเนินการเอง เช่น โดยใช้เครื่องหมายคำวิธีการดังกล่าวอนุญาตให้มีความยาวตัวดำเนินการได้ถึง 256 ไบต์หรือใหญ่กว่า ประเภทข้อมูลของตัวดำเนินการดังกล่าวคือสตริงอักขระหรือBCDเครื่องที่สามารถจัดการข้อมูลดังกล่าวด้วยคำสั่งเดียว (เช่น เปรียบเทียบ เพิ่ม) ได้แก่IBM 1401 , 1410 , 1620 , System/360 , System/370 , ESA/390และz/Architectureซึ่งทั้งหมดเป็นประเภทบิ๊กเอนเดียน
การจัดลำดับอื่นๆ อีกมากมาย เรียกกันทั่วไปว่าเอนเดียนกลางหรือเอนเดียนผสมเป็นไปได้
โดยหลักการแล้ว PDP -11เป็นระบบ little-endian ขนาด 16 บิต คำสั่งในการแปลงระหว่างค่าจุดลอยตัวและจำนวนเต็มในโปรเซสเซอร์จุดลอยตัวเสริมของ PDP-11/45, PDP-11/70 และในโปรเซสเซอร์รุ่นหลังบางรุ่นนั้น จะเก็บค่า "จำนวนเต็ม long แบบ double precision" ขนาด 32 บิต โดยที่ครึ่งหนึ่งของ 16 บิตจะสลับจากลำดับ little-endian ที่คาดไว้ คอม ไพเลอร์ UNIX Cใช้รูปแบบเดียวกันสำหรับจำนวนเต็ม long แบบ 32 บิต การจัดลำดับนี้เรียกว่าPDP-endian [31 ]
UNIX เป็นระบบแรกๆ ที่อนุญาตให้คอมไพล์โค้ดเดียวกันสำหรับแพลตฟอร์มที่มีการแสดงผลภายในที่แตกต่างกัน หนึ่งในโปรแกรมแรกๆ ที่แปลงมาควรจะพิมพ์ออกมาUnix
แต่ใน Series/1 กลับพิมพ์ออกnUxi
มาแทน[32]
วิธีหนึ่งในการตีความความเป็นเอนเดียนนี้คือการจัดเก็บจำนวนเต็ม 32 บิตเป็นคำที่มีขนาด 16 บิตแบบเอนเดียนน้อยสองคำ โดยมีการจัดลำดับคำแบบเอนเดียนใหญ่:
ออฟเซ็ตไบต์ | ค่า 8 บิต | ค่าลิตเติ้ลเอนเดียน 16 บิต |
---|---|---|
0 | 0Bh | 0A0Bh |
1 | 0Ah | |
2 | 0Dh | 0C0Dh |
3 | 0Ch |
ตัวระบุเซกเมนต์ของIA-32และโปรเซสเซอร์ที่เข้ากันได้จะรักษาที่อยู่ฐาน 32 บิตของเซกเมนต์ที่จัดเก็บตามลำดับเอนเดียนน้อย แต่ในไบต์ที่ไม่ต่อเนื่องกันสี่ไบต์ที่ตำแหน่งสัมพันธ์ 2, 3, 4 และ 7 ของตัวระบุเริ่มต้น[33]
ภาษาที่ใช้บรรยายฮาร์ดแวร์ (HDL) เพื่อแสดงลอจิกดิจิทัล มักรองรับเอนเดียนตามอำเภอใจ โดยมีความละเอียดตามอำเภอใจ ตัวอย่างเช่น ในSystemVerilogคำๆ หนึ่งสามารถกำหนดเป็นเอนเดียนน้อยหรือเอนเดียนใหญ่ได้[ จำเป็นต้องอ้างอิง ]
การจดจำเอนเดียนเนสเป็นสิ่งสำคัญเมื่ออ่านไฟล์หรือระบบไฟล์ที่สร้างบนคอมพิวเตอร์ที่มีเอนเดียนเนสต่างกัน
ไฟล์ฟอร์แทรนแบบต่อเนื่องที่ไม่ได้จัดรูปแบบซึ่งสร้างขึ้นด้วยเอนเดียนเนสแบบหนึ่งนั้นมักจะไม่สามารถอ่านได้บนระบบที่ใช้เอนเดียนเนสอีกแบบหนึ่ง เนื่องจากฟอร์แทรนมักจะใช้ เรก คอร์ด (ซึ่งกำหนดเป็นข้อมูลที่เขียนโดยคำสั่งฟอร์แทรนเดียว) เป็นข้อมูลที่อยู่ก่อนและหลังฟิลด์นับ ซึ่งเป็นจำนวนเต็มที่เท่ากับจำนวนไบต์ในข้อมูล การพยายามอ่านไฟล์ดังกล่าวโดยใช้ฟอร์แทรนบนระบบที่มีเอนเดียนเนสอีกแบบหนึ่งนั้นจะส่งผลให้เกิดข้อผิดพลาดระหว่างการทำงาน เนื่องจากฟิลด์นับไม่ถูกต้อง
ข้อความ Unicodeสามารถเริ่มต้นด้วยเครื่องหมายลำดับไบต์ (BOM) เพื่อส่งสัญญาณความเป็นเอนเดียนของไฟล์หรือสตรีม จุดรหัสคือ U+FEFF ตัวอย่างเช่น ใน UTF-3200 00 FE FF
ไฟล์แบบบิ๊กเอนเดียนควรเริ่มต้นด้วย ; ไฟล์แบบลิตเทิลเอนเดียนควรเริ่มต้นด้วยFF FE 00 00
.
รูปแบบข้อมูลไบนารีของแอปพลิเคชัน เช่น ไฟล์ MATLAB .matหรือ รูปแบบข้อมูล .bilที่ใช้ในโทโพกราฟี มักจะไม่ขึ้นกับเอนเดียน ซึ่งทำได้โดยจัดเก็บข้อมูลในเอนเดียนคงที่หนึ่งค่าเสมอ หรือพกสวิตช์เพื่อระบุเอนเดียนไปกับข้อมูล ตัวอย่างรูปแบบแรกคือรูป แบบ ไฟล์ไบนารี XLSที่สามารถพกพาได้ระหว่างระบบ Windows และ Mac และเป็นแบบเอนเดียนน้อยเสมอ ทำให้แอปพลิเคชัน Mac ต้องสลับไบต์เมื่อโหลดและบันทึกเมื่อทำงานบนโปรเซสเซอร์ Motorola 68K หรือ PowerPC ที่มีเอนเดียนใหญ่[34]
ไฟล์ภาพ TIFFเป็นตัวอย่างของกลยุทธ์ที่สอง ซึ่งส่วนหัวของไฟล์จะสั่งให้แอปพลิเคชันทราบถึงความเป็นเอนเดียนของจำนวนเต็มไบนารีภายใน หากไฟล์เริ่มต้นด้วยลายเซ็นMM
แสดงว่าจำนวนเต็มแสดงเป็นบิ๊กเอนเดียน ในขณะที่II
หมายถึงลิตเติ้ลเอนเดียน ลายเซ็นเหล่านี้ต้องการคำ 16 บิตเพียงคำเดียว และเป็นพาลินโดรมดังนั้นจึงเป็นอิสระจากความเป็นเอนเดียI
น ย่อมาจากIntelและM
ย่อมาจากMotorola CPU ของ Intel เป็นแบบลิตเติ้ลเอนเดียน ในขณะที่ CPU ของ Motorola 680x0 เป็นแบบบิ๊กเอนเดียน ลายเซ็นที่ชัดเจนนี้ช่วยให้โปรแกรมอ่าน TIFF สามารถสลับไบต์ได้หากจำเป็น เมื่อไฟล์ที่กำหนดสร้างขึ้นโดยโปรแกรมเขียน TIFF ที่ทำงานบนคอมพิวเตอร์ที่มีความเป็นเอนเดียนที่แตกต่างกัน
เนื่องจากมีผลจากการนำไปใช้งานเดิมบนแพลตฟอร์ม Intel 8080 ระบบไฟล์ File Allocation Table (FAT) ที่ไม่ขึ้นกับระบบปฏิบัติการ จึงได้รับการกำหนดโดยใช้การเรียงลำดับไบต์แบบ little-endian แม้กระทั่งบนแพลตฟอร์มที่ใช้ระบบ endianness อื่นโดยตรง จึงจำเป็นต้องใช้การดำเนินการสลับไบต์เพื่อดูแลรักษา FAT บนแพลตฟอร์มเหล่านี้
ZFSซึ่งรวมระบบไฟล์และตัวจัดการวอลุ่มลอจิคัล เข้าด้วยกัน เป็นที่ทราบกันว่ามีเอนเดียนแบบปรับตัวได้และทำงานได้กับทั้งระบบบิ๊กเอนเดียนและลิตเทิลเอนเดียน[35]
RFC ของ IETFจำนวนมากใช้คำว่าลำดับเครือข่ายซึ่งหมายถึงลำดับการส่งข้อมูลสำหรับไบต์ผ่านสายในโปรโตคอลเครือข่าย RFC 1700 ในอดีตได้กำหนดลำดับเครือข่ายสำหรับโปรโตคอลในชุดโปรโตคอลอินเทอร์เน็ตให้เป็นแบบบิ๊กเอนเดียน[36]
อย่างไรก็ตาม ไม่ใช่โปรโตคอลทั้งหมดจะใช้ลำดับไบต์แบบบิ๊กเอนเดียนเป็นลำดับเครือข่าย โปรโตคอล Server Message Block (SMB) จะใช้ลำดับไบต์แบบลิตเติลเอนเดียน ในCANopenพารามิเตอร์หลายไบต์จะถูกส่งเป็นไบต์ที่มีนัยสำคัญน้อยที่สุดก่อนเสมอ (ลิตเติลเอนเดียน) เช่นเดียวกับEthernet Powerlink [ 37]
Berkeley Sockets APIกำหนดชุดฟังก์ชันในการแปลงค่าจำนวนเต็ม 16 และ 32 บิตไปเป็นและมาจากลำดับไบต์ของเครือข่าย: ฟังก์ชันhtons
(โฮสต์ถึงเครือข่ายสั้น) และhtonl
(โฮสต์ถึงเครือข่ายยาว) จะแปลงค่า 16 และ 32 บิตตามลำดับจากเครื่อง ( โฮสต์ ) ไปเป็นลำดับเครือข่าย ฟังก์ชัน ntohs
และntohl
จะแปลงจากลำดับเครือข่ายไปเป็นโฮสต์[38] [39]ฟังก์ชันเหล่านี้อาจเป็นแบบno-opบนระบบ big-endian
ในขณะที่โปรโตคอลเครือข่ายระดับสูงมักถือว่าไบต์ (ส่วนใหญ่หมายถึงอ็อกเท็ต ) เป็นหน่วยอะตอม แต่เลเยอร์ต่ำสุดของสแต็กเครือข่ายอาจเกี่ยวข้องกับการสั่งของบิตภายในไบต์