คำถามติดแท็ก x86

x86 เป็นสถาปัตยกรรมที่มาจาก CPU Intel 8086 ตระกูล x86 ประกอบด้วยสถาปัตยกรรม 32 บิต IA-32 และ 64 บิต x86-64 รวมถึงสถาปัตยกรรม 16 บิตแบบเดิม คำถามเกี่ยวกับคำถามหลังควรติดแท็ก [x86-16] และ / หรือ [emu8086] ใช้แท็ก [x86-64] หากคำถามของคุณเฉพาะกับ x86-64 64 บิต สำหรับ x86 FPU ให้ใช้แท็ก [x87] สำหรับ SSE1 / 2/3/4 / AVX * ยังใช้ [sse] และ [avx] / [avx2] / [avx512] ตัวใดก็ได้

1
คำแนะนำ x86 ต้องการการเข้ารหัสของตัวเองรวมถึงข้อโต้แย้งทั้งหมดของพวกเขาที่จะปรากฏในหน่วยความจำในเวลาเดียวกันหรือไม่?
ฉันพยายามที่จะคิดออกว่าเป็นไปได้ในการเรียกใช้ Linux VM ซึ่ง RAM ได้รับการสนับสนุนโดยเพจฟิสิคัลเดียวหรือไม่ หากต้องการจำลองสิ่งนี้ฉันได้แก้ไขตัวจัดการข้อผิดพลาดหน้าซ้อนใน KVM เพื่อลบบิตปัจจุบันออกจากรายการตารางหน้าที่ซ้อนกัน (NPT) ทั้งหมดยกเว้นรายการที่สอดคล้องกับข้อบกพร่องของเพจที่ประมวลผลในปัจจุบัน ในขณะที่พยายามเริ่มต้นแขกลินุกซ์ฉันสังเกตว่าคำแนะนำการประกอบที่ใช้ตัวถูกดำเนินการหน่วยความจำเช่น add [rbp+0x820DDA], ebp นำไปสู่การวนรอบข้อบกพร่องของหน้าจนกว่าฉันจะคืนค่าบิตปัจจุบันสำหรับหน้าที่มีคำสั่งเช่นเดียวกับหน้าอ้างอิงในตัวถูกดำเนินการ (ในตัวอย่างนี้ [rbp+0x820DDA] ) ฉันสงสัยว่าทำไมในกรณีนี้ ซีพียูไม่ควรเข้าถึงหน้าหน่วยความจำตามลำดับหรือไม่เช่นอ่านคำสั่งก่อนจากนั้นจึงเข้าถึงตัวถูกดำเนินการหน่วยความจำ หรือ x86 ต้องการหน้าคำสั่งเช่นเดียวกับหน้าตัวถูกดำเนินการทั้งหมดในเวลาเดียวกันหรือไม่? ฉันกำลังทดสอบกับ AMD Zen 1

2
การทดสอบการหารได้เร็วขึ้นกว่าตัวดำเนินการ%
ฉันสังเกตเห็นสิ่งที่อยากรู้ในคอมพิวเตอร์ของฉัน *การทดสอบการหารด้วยลายมือเขียนเร็วกว่า%ผู้ปฏิบัติงานอย่างมาก ลองพิจารณาตัวอย่างน้อยที่สุด: * AMD Ryzen Threadripper 2990WX, GCC 9.2.0 static int divisible_ui_p(unsigned int m, unsigned int a) { if (m <= a) { if (m == a) { return 1; } return 0; } m += a; m >>= __builtin_ctz(m); return divisible_ui_p(m, a); } ตัวอย่างที่ถูก จำกัด ด้วยแปลกและa m > …

1
เหตุใดการเริ่มต้นรวม GCC ของอาร์เรย์จึงเติมเต็มทั้งศูนย์ด้วยก่อนรวมถึงองค์ประกอบที่ไม่ใช่ศูนย์
ทำไม gcc เติมทั้งอาร์เรย์ด้วยศูนย์แทนที่จะเป็นจำนวนเต็ม 96 เท่านั้นที่เหลือ? initializers ที่ไม่ใช่ศูนย์ทั้งหมดอยู่ที่จุดเริ่มต้นของอาร์เรย์ void *sink; void bar() { int a[100]{1,2,3,4}; sink = a; // a escapes the function asm("":::"memory"); // and compiler memory barrier // forces the compiler to materialize a[] in memory instead of optimizing away } MinGW8.1 และ gcc9.2 สร้าง asm เช่นนี้ ( Godbolt …

1
เหตุใด DOS จึงตั้งค่า SP register เป็น 0xFFFE หลังจากโหลดไฟล์. COM
ในหน้า wikpedia เกี่ยวกับไฟล์. COM https://en.wikipedia.org/wiki/COM_fileจะอ่าน: ไฟล์. COM ใน DOS ตั้งค่าเซกเมนต์ x86 ทั้งหมดที่ลงทะเบียนเป็นค่าเดียวกันและ SP (ตัวชี้สแต็ค) ลงทะเบียนเป็น 0xFFFE ดังนั้นสแต็กจะเริ่มต้นที่ด้านบนสุดของเซ็กเมนต์หน่วยความจำและทำงานจากที่นั่น แต่นี่จะเป็นการตั้งค่าสแต็กให้เริ่มหนึ่งคำด้านล่างด้านบนของกลุ่ม เมื่อกดค่าบนสแต็ก CPU จะลด SP เป็น 0xFFFC และเก็บค่าไว้ที่นั่น สาเหตุที่ DOS ไม่ตั้งค่า SP เป็น 0 แทนคืออะไร

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