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

x86-64 เป็นส่วนขยาย 64 บิตสำหรับสถาปัตยกรรม Intel x86


6
เหตุใด GCC จึงสร้างรหัสเร็วขึ้น 15-20% หากฉันปรับขนาดให้เหมาะสมแทนความเร็ว
ฉันสังเกตเห็นครั้งแรกในปี 2009 ว่า GCC (อย่างน้อยในโครงการของฉันและในเครื่องของฉัน) มีแนวโน้มที่จะสร้างรหัสที่เร็วขึ้นอย่างเห็นได้ชัดถ้าฉันปรับขนาด ( -Os) แทนความเร็ว ( -O2หรือ-O3) และฉันสงสัยตั้งแต่นั้นมา ฉันมีการจัดการเพื่อสร้างรหัส (ค่อนข้างโง่) ที่แสดงพฤติกรรมที่น่าแปลกใจนี้และมีขนาดเล็กพอที่จะโพสต์ที่นี่ const int LOOP_BOUND = 200000000; __attribute__((noinline)) static int add(const int& x, const int& y) { return x + y; } __attribute__((noinline)) static int work(int xval, int yval) { int sum(0); for (int i=0; i<LOOP_BOUND; ++i) …

15
ฉันจะทราบได้อย่างไรว่าแอสเซมบลี. NET นั้นถูกสร้างขึ้นสำหรับ x86 หรือ x64 หรือไม่
ฉันมีรายชื่อชุดประกอบ. NET ฉันต้องตรวจสอบโดยทางโปรแกรมว่า DLL แต่ละตัวถูกสร้างขึ้นสำหรับ x86 (ตรงข้ามกับ x64 หรือ CPU ใด ๆ ) เป็นไปได้ไหม
327 .net  assemblies  x86  64-bit  x86-64 

5
เหตุใด GCC จึงใช้การคูณด้วยจำนวนแปลก ๆ ในการใช้การหารจำนวนเต็ม
ฉันได้อ่านเกี่ยวกับการประกอบdivและการmulประกอบและฉันตัดสินใจที่จะเห็นพวกเขาในการดำเนินการโดยการเขียนโปรแกรมง่าย ๆ ใน C: ไฟล์ Division.c #include <stdlib.h> #include <stdio.h> int main() { size_t i = 9; size_t j = i / 5; printf("%zu\n",j); return 0; } จากนั้นสร้างรหัสภาษาแอสเซมบลีด้วย: gcc -S division.c -O0 -masm=intel แต่การดูdivision.sไฟล์ที่สร้างขึ้นมันไม่มีการดำเนินการใด ๆ ของ div! แต่กลับกลายเป็นเวทมนตร์ดำบางชนิดที่มีการเปลี่ยนบิตและตัวเลขเวทย์มนตร์ นี่คือข้อมูลโค้ดที่คำนวณi/5: mov rax, QWORD PTR [rbp-16] ; Move i (=9) to RAX …

4
เหตุใดการแนะนำคำแนะนำ MOV ที่ไร้ประโยชน์จะทำให้วงวนแน่นใน x86_64 ชุดประกอบ
พื้นหลัง: ในขณะที่เพิ่มประสิทธิภาพรหัสภาษาปาสคาลด้วยภาษาแอสเซมบลีที่ฝังตัวฉันสังเกตเห็นMOVคำสั่งที่ไม่จำเป็นและลบมันออก ที่แปลกใจของฉันเอาคำสั่งยกเลิกการจำเป็นที่เกิดจากโปรแกรมของฉันที่จะชะลอตัวลง ฉันพบว่าการเพิ่มMOVคำแนะนำแบบไม่มีประโยชน์เพิ่มประสิทธิภาพให้ดียิ่งขึ้น ผลที่ได้คือเอาแน่เอานอนและการเปลี่ยนแปลงตามลำดับการดำเนินการ: คำแนะนำขยะเดียวกันขนย้ายขึ้นหรือลงโดยบรรทัดเดียวผลิตชะลอตัว ฉันเข้าใจว่าซีพียูใช้การปรับแต่งและการทำให้เพรียวลมทุกชนิด แต่ดูเหมือนว่าจะเป็นเวทย์มนตร์ดำ ข้อมูล: รหัสของฉันในเวอร์ชันรวบรวมเงื่อนไขการทำงานของขยะสามครั้งในช่วงกลางของลูปที่รัน2**20==1048576ครั้ง (โปรแกรมที่อยู่รอบ ๆ เพียงแค่คำนวณแฮชSHA-256 ) ผลลัพธ์บนเครื่องที่ค่อนข้างเก่า (Intel (R) Core (TM) 2 CPU 6400 @ 2.13 GHz): avg time (ms) with -dJUNKOPS: 1822.84 ms avg time (ms) without: 1836.44 ms โปรแกรมถูกเรียกใช้ 25 ครั้งในการวนลูปโดยที่ลำดับการรันจะเปลี่ยนแบบสุ่มในแต่ละครั้ง ข้อความที่ตัดตอนมา: {$asmmode intel} procedure example_junkop_in_sha256; var s1, t2 : …

4
อะไรคืออนุสัญญาการเรียกสำหรับระบบ UNIX & Linux ที่เรียกใช้ i386 และ x86-64
ลิงก์ต่อไปนี้อธิบายข้อตกลงการเรียกใช้ระบบ x86-32 สำหรับทั้ง UNIX (รสชาติ BSD) และ Linux: http://www.int80h.org/bsdasm/#system-calls http://www.freebsd.org/doc/en/books/developers-handbook/x86-system-calls.html แต่อนุสัญญาการเรียกระบบ x86-64 บนทั้ง UNIX และ Linux คืออะไร?
147 linux  unix  assembly  x86-64  abi 

3
ข้อผิดพลาด GCC ที่เป็นไปได้เมื่อส่งคืน struct จากฟังก์ชัน
ฉันเชื่อว่าฉันพบข้อผิดพลาดใน GCC ในขณะที่ใช้ PCG PRNG ของ O'Neill ( รหัสเริ่มต้นในคอมไพเลอร์ Explorer ของ Godbolt ) หลังจากการคูณoldstateด้วยMULTIPLIER(ผลลัพธ์ที่เก็บไว้ใน rdi) GCC จะไม่เพิ่มผลลัพธ์INCREMENTนั้นย้ายINCREMENTไปยัง rdx แทนซึ่งจะถูกใช้เป็นค่าส่งคืนของ rand32_ret.state ตัวอย่างที่ทำซ้ำได้ขั้นต่ำ ( Compiler Explorer ): #include <stdint.h> struct retstruct { uint32_t a; uint64_t b; }; struct retstruct fn(uint64_t input) { struct retstruct ret; ret.a = 0; ret.b = input * …
133 c  gcc  assembly  x86-64  compiler-bug 

11
จะทราบได้อย่างไรว่าไฟล์ DLL ดั้งเดิมถูกคอมไพล์เป็น x64 หรือ x86?
ฉันต้องการตรวจสอบว่าแอสเซมบลีเนทีฟเป็นไปตาม x64 หรือ x86 จากแอปพลิเคชันโค้ดที่มีการจัดการ ( C # ) ฉันคิดว่ามันต้องอยู่ที่ไหนสักแห่งในส่วนหัว PE เนื่องจากตัวโหลดระบบปฏิบัติการจำเป็นต้องรู้ข้อมูลนี้ แต่ฉันหาไม่เจอ แน่นอนว่าฉันชอบทำในโค้ดที่มีการจัดการ แต่ถ้าจำเป็นฉันสามารถใช้ C ++ ดั้งเดิมได้
133 c#  .net  winapi  64-bit  x86-64 

4
จำนวนเต็ม 128 บิตของ Rust "i128" ทำงานอย่างไรบนระบบ 64 บิต
Rust มีจำนวนเต็ม 128 บิตซึ่งแสดงด้วยชนิดข้อมูลi128(และu128สำหรับ ints ที่ไม่ได้ลงชื่อ): let a: i128 = 170141183460469231731687303715884105727; Rust ทำให้i128ค่าเหล่านี้ทำงานบนระบบ 64 บิตได้อย่างไร เช่นมันคำนวณอย่างไรกับสิ่งเหล่านี้? เนื่องจากเท่าที่ฉันทราบค่านี้ไม่สามารถใส่ลงในรีจิสเตอร์ x86-64 ซีพียูได้คอมไพเลอร์ใช้ 2 รีจิสเตอร์สำหรับi128ค่าเดียวหรือไม่ หรือพวกเขาใช้โครงสร้างจำนวนเต็มใหญ่แทนแทน?

3
เหตุใดคำแนะนำ x86-64 บน 32 บิตจึงลงทะเบียนส่วนบนของการลงทะเบียน 64 บิตแบบเต็มเป็นศูนย์
ในx86-64 Tour of Intel Manualsฉันอ่าน บางทีความจริงที่น่าประหลาดใจที่สุดก็คือคำสั่งเช่นMOV EAX, EBXการRAXลงทะเบียน32 บิตบนเป็นศูนย์โดยอัตโนมัติ เอกสารของ Intel (3.4.1.1 General-Purpose Registers ในโหมด 64 บิตในสถาปัตยกรรมพื้นฐานแบบแมนนวล) ที่อ้างถึงในแหล่งข้อมูลเดียวกันบอกเราว่า: ตัวถูกดำเนินการ 64 บิตสร้างผลลัพธ์ 64 บิตในการลงทะเบียนวัตถุประสงค์ทั่วไปปลายทาง ตัวถูกดำเนินการ 32 บิตสร้างผลลัพธ์ 32 บิตขยายศูนย์เป็นผลลัพธ์ 64 บิตในการลงทะเบียนวัตถุประสงค์ทั่วไปปลายทาง ตัวถูกดำเนินการ 8 บิตและ 16 บิตสร้างผลลัพธ์ 8 บิตหรือ 16 บิต 56 บิตด้านบนหรือ 48 บิต (ตามลำดับ) ของรีจิสเตอร์วัตถุประสงค์ทั่วไปปลายทางจะไม่ถูกแก้ไขโดยการดำเนินการ หากผลลัพธ์ของการดำเนินการ 8 บิตหรือ 16 บิตมีไว้สำหรับการคำนวณแอดเดรส …

8
กำหนดเป้าหมายทั้ง 32 บิตและ 64 บิตด้วย Visual Studio ในโซลูชัน / โครงการเดียวกัน
ฉันมีปัญหาเล็กน้อยเกี่ยวกับวิธีตั้งค่าวิชวลสตูดิโอสำหรับการกำหนดเป้าหมายหลายเป้าหมาย ความเป็นมา: c # .NET v2.0 พร้อมด้วย p / เรียกใช้ไปยัง 3rd party 32 bit DLL's, SQL compact v3.5 SP1 พร้อมโครงการติดตั้ง ตอนนี้เป้าหมายแพลตฟอร์มถูกตั้งค่าเป็น x86 เพื่อให้สามารถทำงานบน Windows x64 ได้ บริษัท บุคคลที่สามเพิ่งเปิดตัว DLL เวอร์ชัน 64 บิตและฉันต้องการสร้างโปรแกรม 64 บิตโดยเฉพาะ สิ่งนี้ทำให้เกิดคำถามบางอย่างที่ฉันยังไม่ได้คำตอบ ฉันต้องการมีฐานรหัสเดียวกัน ฉันต้องสร้างโดยอ้างอิงถึงชุด DLL ของ 32 บิตหรือ 64 บิตของ DLL (ทั้งบุคคลที่สามและ SQL Server Compact) สามารถแก้ไขได้ด้วยการกำหนดค่าใหม่ 2 …

4
เหตุใด Windows64 จึงใช้รูปแบบการโทรที่แตกต่างจาก OS อื่น ๆ ทั้งหมดบน x86-64
AMD มีข้อกำหนด ABI ที่อธิบายถึงรูปแบบการโทรที่จะใช้บน x86-64 ระบบปฏิบัติการทั้งหมดทำตามยกเว้น Windows ที่มีรูปแบบการโทร x86-64 ของตัวเอง ทำไม? มีใครรู้เหตุผลทางเทคนิคประวัติศาสตร์หรือการเมืองสำหรับความแตกต่างนี้หรือเป็นเรื่องของ NIHsyndrome หรือไม่? ผมเข้าใจว่าระบบปฏิบัติการที่แตกต่างกันอาจมีความต้องการที่แตกต่างกันสำหรับสิ่งที่ระดับที่สูงขึ้น แต่ไม่ได้อธิบายว่าทำไมเช่นพารามิเตอร์การลงทะเบียนผ่านการสั่งซื้อบน Windows คือในขณะที่คนอื่นใช้ทุกคนrcx - rdx - r8 - r9 - rest on stackrdi - rsi - rdx - rcx - r8 - r9 - rest on stack ปล. ฉันทราบดีว่ารูปแบบการโทรเหล่านี้แตกต่างกันอย่างไรและฉันรู้ว่าจะหารายละเอียดได้จากที่ใดหากต้องการ สิ่งที่ฉันต้องการรู้คือทำไม แก้ไข: สำหรับวิธีการดูเช่นรายการวิกิพีเดียและลิงก์จากที่นั่น

10
ทำไม x86 ถึงน่าเกลียด? ทำไมถึงถูกมองว่าด้อยกว่าเมื่อเทียบกับคนอื่น? [ปิด]
ตามที่กล่าวมาในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบถาม & ตอบของเรา เราคาดหวังว่าคำตอบจะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจก่อให้เกิดการถกเถียงโต้แย้งการสำรวจความคิดเห็นหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงได้และอาจเปิดขึ้นมาใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อรับคำแนะนำ ปิดให้บริการใน8 ปีที่ผ่านมา เมื่อเร็ว ๆ นี้ฉันได้อ่านไฟล์เก็บถาวร SO และพบข้อความที่ต่อต้านสถาปัตยกรรม x86 เหตุใดเราจึงต้องการสถาปัตยกรรม CPU ที่แตกต่างกันสำหรับเซิร์ฟเวอร์และมินิ / เมนเฟรมและคอร์ผสม กล่าวว่า " สถาปัตยกรรมพีซีเป็นเรื่องยุ่งนักพัฒนาระบบปฏิบัติการทุกคนจะบอกคุณว่า " การเรียนภาษา Assembly คุ้มค่ากับความพยายามหรือไม่? (เก็บถาวร ) ระบุว่า "ตระหนักว่าสถาปัตยกรรม x86 นั้นน่ากลัวที่สุด " วิธีง่ายๆในการเรียนรู้ x86 แอสเซมเบลอร์หรือไม่? กล่าวว่า " วิทยาลัยส่วนใหญ่สอนเรื่องการชุมนุมเช่น MIPS เพราะเข้าใจง่ายกว่ามากการประกอบ x86 น่าเกลียดมาก " และความคิดเห็นอื่น ๆ อีกมากมายเช่น "เมื่อเทียบกับสถาปัตยกรรมส่วนใหญ่ X86 ค่อนข้างแย่" …

15
System.BadImageFormatException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี (จาก installutil.exe)
ฉันพยายามติดตั้งบริการ Windows โดยใช้ InstallUtil.exe และได้รับข้อความแสดงข้อผิดพลาด System.BadImageFormatException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี ' {xxx.exe}' หรือการอ้างอิงอย่างใดอย่างหนึ่ง มีความพยายามในการโหลดโปรแกรมที่มีรูปแบบไม่ถูกต้อง สิ่งที่ช่วยให้? แก้ไข: (ไม่ใช่ตาม OP) ข้อความแบบเต็มที่ดึงมาจาก dup ทำให้ได้รับความนิยมมากขึ้น [สำหรับ googleability]: C: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319> InstallUtil.exe C: \ xxx.exe Microsoft (R) .NET Framework ยูทิลิตี้การติดตั้งเวอร์ชัน 4.0.30319.1 ลิขสิทธิ์ (c) Microsoft Corporation สงวนลิขสิทธิ์. เกิดข้อยกเว้นขณะเริ่มต้นการติดตั้ง: System.BadImageFormatException: ไม่สามารถโหลดไฟล์หรือแอสเซมบลี 'file: /// C: …

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

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