คำถามติดแท็ก 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] ตัวใดก็ได้

5
ทะเบียน“ FS” /“ GS” มีไว้เพื่ออะไร?
ดังนั้นฉันจึงรู้ว่าการลงทะเบียนต่อไปนี้และการใช้งานควรจะเป็นอย่างไร: CS = กลุ่มรหัส (ใช้สำหรับ IP) DS = กลุ่มข้อมูล (ใช้สำหรับ MOV) ES = ส่วนปลายทาง (ใช้สำหรับ MOVS ฯลฯ ) SS = Stack Segment (ใช้สำหรับ SP) แต่การลงทะเบียนต่อไปนี้มีไว้เพื่อใช้ทำอะไร? FS = "ส่วนของไฟล์"? GS = ??? หมายเหตุ: ฉันไม่ได้ถามเกี่ยวกับระบบปฏิบัติการใด ๆ - ฉันกำลังถามเกี่ยวกับสิ่งที่พวกเขาตั้งใจจะใช้กับ CPU ถ้ามีอะไร

3
CPU Privilege Rings: ทำไมไม่ใช้วงแหวน 1 และ 2?
คำถามสองสามข้อเกี่ยวกับวงแหวนสิทธิ์ของ CPU x86: เหตุใดระบบปฏิบัติการส่วนใหญ่จึงไม่ใช้วงแหวน 1 และ 2 เป็นเพียงการรักษาความเข้ากันได้ของรหัสกับสถาปัตยกรรมอื่น ๆ หรือมีเหตุผลที่ดีกว่านี้? มีระบบปฏิบัติการใดที่ใช้วงแหวนเหล่านั้นจริงหรือไม่? หรือไม่ได้ใช้อย่างสมบูรณ์?
103 x86  cpu  privileges 

5
ฟังก์ชั่นของคำสั่ง push / pop ที่ใช้กับ register ใน x86 assembly คืออะไร?
เมื่ออ่านเกี่ยวกับแอสเซมเบลอร์ฉันมักจะเจอคนเขียนว่าพวกเขาดันรีจิสเตอร์ของโปรเซสเซอร์และเปิดขึ้นมาอีกครั้งในภายหลังเพื่อกู้คืนสถานะก่อนหน้า คุณจะกดลงทะเบียนได้อย่างไร? มันดันอยู่ตรงไหน? เหตุใดจึงจำเป็น สิ่งนี้ทำให้คำสั่งโปรเซสเซอร์ตัวเดียวเดือดหรือซับซ้อนกว่านี้หรือไม่?

11
การคำนวณจุดลอยตัวเทียบกับจำนวนเต็มบนฮาร์ดแวร์สมัยใหม่
ฉันกำลังทำงานที่มีความสำคัญต่อประสิทธิภาพใน C ++ และขณะนี้เรากำลังใช้การคำนวณจำนวนเต็มสำหรับปัญหาที่เกิดจากจุดลอยตัวเนื่องจาก "เร็วกว่า" สิ่งนี้ทำให้เกิดปัญหาที่น่ารำคาญมากมายและเพิ่มรหัสที่น่ารำคาญมากมาย ตอนนี้ฉันจำได้ว่าอ่านเกี่ยวกับวิธีการคำนวณจุดลอยตัวช้ามากประมาณ 386 วันซึ่งฉันเชื่อว่า (IIRC) มีตัวเลือกร่วมที่เป็นตัวเลือก แต่ในปัจจุบันด้วยซีพียูที่ซับซ้อนและทรงพลังมากขึ้นอย่างทวีคูณทำให้ "ความเร็ว" ไม่แตกต่างกันหากทำการคำนวณทศนิยมหรือจำนวนเต็ม? โดยเฉพาะอย่างยิ่งเนื่องจากเวลาในการคำนวณจริงนั้นมีขนาดเล็กเมื่อเทียบกับบางสิ่งเช่นการทำให้ท่อตันหรือดึงข้อมูลจากหน่วยความจำหลัก? ฉันรู้ว่าคำตอบที่ถูกต้องคือการเปรียบเทียบกับฮาร์ดแวร์เป้าหมายวิธีที่ดีในการทดสอบสิ่งนี้คืออะไร? ฉันเขียนโปรแกรม C ++ เล็ก ๆ สองโปรแกรมและเปรียบเทียบเวลาทำงานกับ "เวลา" บน Linux แต่เวลาทำงานจริงนั้นแปรปรวนเกินไป (ไม่ได้ช่วยให้ฉันทำงานบนเซิร์ฟเวอร์เสมือน) การใช้เวลาทั้งวันของฉันไม่เพียงพอกับการใช้เกณฑ์มาตรฐานหลายร้อยรายการการสร้างกราฟ ฯลฯ มีสิ่งใดบ้างที่ฉันสามารถทำได้เพื่อทดสอบความเร็วสัมพัทธ์ที่สมเหตุสมผล ความคิดหรือความคิด? ฉันผิดเต็ม ๆ เหรอ? โปรแกรมที่ฉันใช้ดังต่อไปนี้ไม่เหมือนกันโดยวิธีใด ๆ : #include <iostream> #include <cmath> #include <cstdlib> #include <time.h> int main( int argc, char** …

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

8
วิธีการเขียน hello world ในแอสเซมเบลอร์ภายใต้ Windows
ฉันต้องการเขียนสิ่งพื้นฐานในการประกอบใน Windows ฉันใช้ NASM แต่ฉันไม่สามารถทำงานอะไรได้เลย จะเขียนและรวบรวมสวัสดีชาวโลกโดยไม่ใช้ฟังก์ชัน C บน Windows ได้อย่างไร?
94 winapi  assembly  x86  nasm 

2
การเพจ x86 ทำงานอย่างไร
คำถามนี้มีขึ้นเพื่อเติมเต็มสุญญากาศของข้อมูลฟรีที่ดีเกี่ยวกับเรื่องนี้ ฉันเชื่อว่าคำตอบที่ดีจะเข้ากันได้กับคำตอบ SO ขนาดใหญ่หนึ่งคำหรืออย่างน้อยก็ในสองสามคำตอบ เป้าหมายหลักคือการให้ข้อมูลที่เพียงพอแก่ผู้เริ่มต้นที่สมบูรณ์เพื่อให้พวกเขาสามารถใช้คู่มือได้ด้วยตนเองและสามารถเข้าใจแนวคิดพื้นฐานของระบบปฏิบัติการที่เกี่ยวข้องกับการเพจ แนวทางที่แนะนำ: คำตอบควรเป็นมิตรกับผู้เริ่มต้น: ตัวอย่างที่เป็นรูปธรรม แต่อาจทำให้เข้าใจง่ายมีความสำคัญมาก ยินดีต้อนรับการประยุกต์ใช้แนวคิดที่แสดง การอ้างแหล่งข้อมูลที่มีประโยชน์เป็นสิ่งที่ดี ยินดีต้อนรับการพูดนอกเรื่องเล็กน้อยเกี่ยวกับวิธีการที่ระบบปฏิบัติการใช้คุณสมบัติการเพจ ยินดีต้อนรับคำอธิบาย PAE และ PSE ยินดีต้อนรับการพูดนอกเรื่องขนาดเล็กเป็น x86_64 คำถามที่เกี่ยวข้องและเหตุใดฉันจึงคิดว่าไม่ใช่สิ่งที่ถูกหลอก: ตารางหน้า x86 ทำงานอย่างไร : ชื่อเกือบจะเหมือนกับคำถามนี้ แต่เนื้อหาจะถามคำถามเฉพาะที่เกี่ยวข้องกับ cr3 และ TLB คำถามนั้นเป็นส่วนย่อยของคำถามนี้ x86 virtualization ทำงานอย่างไร : body ขอเฉพาะแหล่งที่มา


6
ฉันจะแยกรหัสเครื่อง 16 บิต x86 ดิบได้อย่างไร
ฉันต้องการแยกชิ้นส่วน MBR (512 ไบต์แรก) ของดิสก์ x86 ที่สามารถบู๊ตได้ที่ฉันมี ฉันคัดลอก MBR ไปยังไฟล์โดยใช้ dd if=/dev/my-device of=mbr bs=512 count=1 ข้อเสนอแนะสำหรับยูทิลิตี้ Linux ที่สามารถแยกไฟล์ได้mbrหรือไม่?
91 linux  assembly  x86  x86-16  mbr 


6
เหตุใด Intel จึงซ่อนแกน RISC ภายในไว้ในโปรเซสเซอร์
เริ่มต้นด้วย Pentium Pro (P6 microarchitecture) Intel ได้ออกแบบไมโครโปรเซสเซอร์ใหม่และใช้แกน RISC ภายในภายใต้คำแนะนำ CISC แบบเก่า เนื่องจาก Pentium Pro คำสั่ง CISC ทั้งหมดจะถูกแบ่งออกเป็นส่วนย่อย ๆ (uops) จากนั้นดำเนินการโดย RISC core ในตอนแรกเป็นที่ชัดเจนสำหรับฉันว่า Intel ตัดสินใจซ่อนสถาปัตยกรรมภายในใหม่และบังคับให้โปรแกรมเมอร์ใช้ "CISC shell" ด้วยการตัดสินใจนี้ Intel สามารถออกแบบสถาปัตยกรรมไมโครโปรเซสเซอร์ใหม่ทั้งหมดโดยไม่ทำลายความเข้ากันได้จึงสมเหตุสมผล อย่างไรก็ตามฉันไม่เข้าใจสิ่งหนึ่งทำไม Intel ยังคงซ่อนชุดคำสั่ง RISC ภายในไว้เป็นเวลาหลายปี ทำไมพวกเขาไม่ปล่อยให้โปรแกรมเมอร์ใช้คำสั่ง RISC เหมือนกับการใช้ชุดคำสั่ง x86 CISC แบบเก่า หาก Intel รักษาความเข้ากันได้แบบย้อนหลังเป็นเวลานาน (เรายังมีโหมด 8086 เสมือนอยู่ถัดจากโหมด 64 บิต) ทำไมพวกเขาไม่อนุญาตให้เรารวบรวมโปรแกรมดังนั้นพวกเขาจะข้ามคำแนะนำ …

7
ข้อ จำกัด ของ Intel Assembly Syntax เทียบกับ AT&T [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดขึ้นมาใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา สำหรับฉันไวยากรณ์ของ Intel นั้นอ่านง่ายกว่ามาก หากฉันท่องไปในฟอเรสต์แอสเซมบลีที่เน้นเฉพาะไวยากรณ์ของ Intel ฉันจะพลาดอะไรไปหรือไม่? มีเหตุผลใดบ้างที่ฉันต้องการเปลี่ยนไปใช้ AT&T (นอกเหนือจากความสามารถในการอ่านชุดประกอบ AT&T ของผู้อื่น) เบาะแสแรกของฉันคือ gdb ใช้ AT&T โดยค่าเริ่มต้น หากเรื่องนี้สำคัญฉันมุ่งเน้นไปที่แอสเซมบลีความสัมพันธ์เท่านั้นและไวยากรณ์อาจต้องใช้กับ Linux / BSD และภาษา C
89 linux  assembly  x86  att  bsd 

3
การใช้ gdb กับโค้ดแอสเซมบลีขั้นตอนเดียวที่นอกเหนือจากปฏิบัติการที่ระบุทำให้เกิดข้อผิดพลาด“ ไม่พบขอบเขตของฟังก์ชันปัจจุบัน”
ฉันอยู่นอกเป้าหมายปฏิบัติการของ gdb และฉันไม่มีสแต็กที่ตรงกับเป้าหมายนั้นด้วยซ้ำ ฉันต้องการทำทีละขั้นตอนเพื่อที่ฉันจะได้ตรวจสอบว่าเกิดอะไรขึ้นในรหัสแอสเซมบลีของฉันเพราะฉันไม่ใช่ผู้เชี่ยวชาญในการประกอบ x86 น่าเสียดายที่ gdb ปฏิเสธที่จะทำการดีบักระดับแอสเซมบลีอย่างง่ายนี้ ช่วยให้ฉันสามารถตั้งค่าและหยุดบนเบรกพอยต์ที่เหมาะสมได้ แต่ทันทีที่ฉันพยายามทำทีละขั้นตอนเป็นต้นไป gdb รายงานข้อผิดพลาด "ไม่พบขอบเขตของฟังก์ชันปัจจุบัน" และ EIP จะไม่เปลี่ยนแปลง รายละเอียดเพิ่มเติม: รหัสเครื่องถูกสร้างขึ้นโดยคำสั่ง gcc asm และฉันคัดลอกไปยังตำแหน่งหน่วยความจำเคอร์เนลที่มันทำงานจากเอาต์พุตของ objdump -d ฉันไม่รังเกียจวิธีง่ายๆในการใช้ตัวโหลดเพื่อโหลดรหัสออบเจ็กต์ของฉันไปยังที่อยู่ที่ย้ายตำแหน่ง แต่จำไว้ว่าการโหลดจะต้องทำในโมดูลเคอร์เนล ฉันคิดว่าอีกทางเลือกหนึ่งคือการสร้างโมดูลเคอร์เนลปลอมหรือไฟล์ข้อมูลการดีบักเพื่อมอบให้กับ gdb เพื่อทำให้เชื่อว่าพื้นที่นี้อยู่ในโค้ดโปรแกรม gdb ทำงานได้ดีบนเคอร์เนลที่รันได้เอง (สำหรับผู้ที่ต้องการทราบจริงๆฉันกำลังแทรกโค้ดที่รันไทม์ลงในพื้นที่ข้อมูลเคอร์เนลของลินุกซ์ภายใน VMware VM และทำการดีบักจาก gdb รีโมตดีบักเคอร์เนลผ่าน gdb ในตัวของ VMware Workstation หมายเหตุฉันไม่ได้เขียนเคอร์เนล หาประโยชน์ฉันเป็นนักศึกษาระดับบัณฑิตศึกษาด้านความปลอดภัยที่เขียนต้นแบบ) (ฉันสามารถตั้งค่าเบรกพอยต์สำหรับแต่ละคำสั่งภายในแอสเซมบลีของฉันได้ซึ่งใช้งานได้ แต่จะค่อนข้างลำบากหลังจากนั้นสักครู่เนื่องจากขนาดของคำแนะนำการประกอบ x86 จะแตกต่างกันไปและตำแหน่งของการประกอบจะเปลี่ยนไปทุกครั้งที่รีบูต)

2
“ ตัวแทน; นพ;” ค่าเฉลี่ยในการประกอบ x86? เหมือนกับคำสั่ง "หยุดชั่วคราว" หรือไม่
อะไรrep; nopหมายถึง? เหมือนกับการpauseเรียนการสอนหรือไม่? มันเหมือนกับrep nop(ไม่มีอัฒภาค) หรือไม่? nopคำสั่งง่ายๆแตกต่างกันอย่างไร? มันทำงานแตกต่างกันในโปรเซสเซอร์ AMD และ Intel หรือไม่? (โบนัส) เอกสารอย่างเป็นทางการสำหรับคำแนะนำเหล่านี้อยู่ที่ไหน? แรงจูงใจสำหรับคำถามนี้ หลังจากการสนทนาในความคิดเห็นของคำถามอื่นฉันตระหนักว่าฉันไม่รู้ว่าrep; nop;หมายความว่าอย่างไรในการประกอบ x86 (หรือ x86-64) และฉันไม่พบคำอธิบายที่ดีในเว็บ ฉันรู้ว่านั่นrepคือคำนำหน้าซึ่งหมายถึง"ทำซ้ำคำสั่งcxครั้งต่อไป" (หรืออย่างน้อยก็คือในแอสเซมบลี x86 16 บิตเก่า) ตามนี้ตารางสรุปที่วิกิพีเดียดูเหมือนว่าrepสามารถนำมาใช้เฉพาะกับmovs, stos, cmps, lods, scas( แต่บางทีข้อ จำกัด นี้จะถูกลบออกในโปรเซสเซอร์ใหม่กว่า) ดังนั้นฉันคิดว่าrep nop(ไม่ลำไส้ใหญ่กึ่ง) จะทำซ้ำnopการดำเนินการcxครั้ง อย่างไรก็ตามหลังจากค้นหาเพิ่มเติมฉันก็ยิ่งสับสน ดูเหมือนว่าrep; nopและpause แมปกับ opcode เดียวกันและpauseมีพฤติกรรมที่แตกต่างจากเพียงnopเล็กน้อย จดหมายเก่าบางฉบับจากปี 2548กล่าวถึงสิ่งที่แตกต่างกัน: “ พยายามอย่าเผาผลาญพลังงานมากเกินไป” "เทียบเท่ากับ 'nop' เพียงแค่เข้ารหัส …

3
การร่ายสองครั้งไปยัง int ที่ไม่ได้ลงนามบน Win32 ถูกตัดทอนเป็น 2,147,483,648
รวบรวมรหัสต่อไปนี้: double getDouble() { double value = 2147483649.0; return value; } int main() { printf("INT_MAX: %u\n", INT_MAX); printf("UINT_MAX: %u\n", UINT_MAX); printf("Double value: %f\n", getDouble()); printf("Direct cast value: %u\n", (unsigned int) getDouble()); double d = getDouble(); printf("Indirect cast value: %u\n", (unsigned int) d); return 0; } เอาต์พุต (MSVC x86): INT_MAX: 2147483647 …

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