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

คำถามการเขียนโปรแกรมแอสเซมบลีภาษา (asm) โปรดมั่นใจว่าแท็กด้วยโปรเซสเซอร์และ / หรือชุดคำสั่งที่คุณใช้รวมถึงแอสเซมเบลอร์ คำเตือน: สำหรับแอสเซมบลี. NET ให้ใช้แท็ก [.net-assembly] แทน สำหรับ Java ASM ให้ใช้แท็ก [java-bytecode-asm] แทน



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 

15
ค้นหาได้อย่างรวดเร็วว่ามีค่าอยู่ในอาร์เรย์ C หรือไม่
ฉันมีแอปพลิเคชั่นฝังตัวที่มี ISR ที่สำคัญตามเวลาซึ่งจำเป็นต้องวนซ้ำผ่านอาร์เรย์ขนาด 256 (ควรเป็น 1024 แต่ 256 เป็นค่าต่ำสุด) และตรวจสอบว่าค่าตรงกับเนื้อหาอาร์เรย์หรือไม่ A boolจะถูกตั้งค่าเป็นจริงในกรณีนี้ ไมโครคอนโทรลเลอร์คือ NXP LPC4357 แกน ARM Cortex M4 และคอมไพเลอร์คือ GCC ฉันได้รวมการเพิ่มประสิทธิภาพระดับ 2 ไว้แล้ว (3 ช้ากว่า) และวางฟังก์ชันใน RAM แทนแฟลช ฉันยังใช้เลขคณิตตัวชี้และการforวนซ้ำซึ่งทำการนับลงแทนการขึ้น (ตรวจสอบว่าi!=0เร็วกว่าการตรวจสอบว่าi<256) สรุปแล้วฉันจบลงด้วยระยะเวลา 12.5 ซึ่งจะต้องลดลงอย่างมากเพื่อให้เป็นไปได้ นี่คือรหัส (หลอก) ที่ฉันใช้ตอนนี้: uint32_t i; uint32_t *array_ptr = &theArray[0]; uint32_t compareVal = 0x1234ABCD; bool validFlag = …

3
ความหมายของการเข้าถึงหน่วยความจำแบบ "ไม่ชั่วคราว" ใน x86 คืออะไร
นี่เป็นคำถามที่ค่อนข้างต่ำ ในการประกอบ x86 มีคำแนะนำ SSE สองคำสั่ง: MOVDQA xmmi, m128 และ MOVNTDQA xmmi, m128 คู่มือสำหรับนักพัฒนาซอฟต์แวร์ IA-32 ระบุว่าNTใน MOVNTDQA ย่อมาจากNon-Temporalและมิฉะนั้นจะเหมือนกับ MOVDQA คำถามของฉันคือNon-Temporalหมายถึงอะไร?
123 x86  sse  assembly 


1
วิธีใดเป็นวิธีที่ดีที่สุดในการตั้งค่ารีจิสเตอร์เป็นศูนย์ในแอสเซมบลี x86: xor, mov หรือและ?
คำแนะนำต่อไปนี้ทั้งหมดทำสิ่งเดียวกัน: ตั้งค่า%eaxเป็นศูนย์ วิธีใดเหมาะสมที่สุด (ต้องใช้รอบเครื่องน้อยที่สุด) xorl %eax, %eax mov $0, %eax andl $0, %eax

5
วัตถุประสงค์ของการลงทะเบียน ESI & EDI?
วัตถุประสงค์ที่แท้จริงและการใช้ EDI & ESI register ในแอสเซมเบลอร์คืออะไร? ฉันรู้ว่ามันใช้สำหรับการดำเนินการสตริงสำหรับสิ่งหนึ่ง ใครช่วยยกตัวอย่างได้ไหม
119 assembly  x86 

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
`testl` eax เทียบกับ eax?
ฉันพยายามทำความเข้าใจการประกอบบางอย่าง การประกอบดังต่อไปนี้ฉันสนใจในtestlบรรทัด: 000319df 8b4508 movl 0x08(%ebp), %eax 000319e2 8b4004 movl 0x04(%eax), %eax 000319e5 85c0 testl %eax, %eax 000319e7 7407 je 0x000319f0 ฉันพยายามเข้าใจจุดนั้นtestlระหว่าง%eaxและ%eax? ฉันคิดว่าข้อมูลเฉพาะของรหัสนี้ไม่สำคัญฉันแค่พยายามทำความเข้าใจการทดสอบด้วยตัวเอง - ค่าจะไม่เป็นจริงเสมอไปหรือ

4
คำสั่ง CFI ใน Gnu Assembler (GAS) ใช้ทำอะไร
ดูเหมือนจะมีคำสั่ง .CFI หลังจากที่ทุกสายและยังมีหลากหลายพันธุ์อดีตเหล่านี้. .cfi_startproc, .cfi_endprocฯลฯ .. เพิ่มเติมได้ที่นี่ .file "temp.c" .text .globl main .type main, @function main: .LFB0: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, %rbp .cfi_offset 6, -16 .cfi_def_cfa_register 6 movl $0, %eax leave ret .cfi_endproc .LFE0: .size main, .-main .globl func .type func, @function func: .LFB1: .cfi_startproc pushq %rbp …
118 assembly  gas 

9
วิธีดูแอสเซมบลีที่อยู่เบื้องหลังโค้ดโดยใช้ Visual C ++
ฉันกำลังอ่านคำถามอื่นเกี่ยวกับประสิทธิภาพของโค้ดสองบรรทัดและ OP บอกว่าเขาดูการประกอบด้านหลังโค้ดและทั้งสองบรรทัดก็เหมือนกันในการประกอบ นอกเหนือจากการย่อยแล้วฉันจะดูรหัสแอสเซมบลีที่สร้างขึ้นเมื่อคอมไพล์โปรแกรมได้อย่างไร ฉันใช้ Visual C ++ ของ Microsoft แต่ฉันต้องการทราบด้วยว่าเป็นไปได้หรือไม่ที่จะดูแอสเซมบลีที่อยู่เบื้องหลังโค้ดที่เขียนด้วย Visual Basic ดังนั้นฉันจะดูรหัสแอสเซมบลีที่อยู่เบื้องหลังโปรแกรมที่เขียนด้วยภาษาระดับสูงกว่าเช่น C ++ และ Visual Basic ได้อย่างไร

20
ฉันจะสร้างระบบปฏิบัติการขนาดเล็กบนคอมพิวเตอร์เดสก์ท็อปรุ่นเก่าได้อย่างไร [ปิด]
ปิด . คำถามนี้จะต้องมีมากขึ้นมุ่งเน้น ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เน้นไปที่ปัญหาเดียวโดยแก้ไขโพสต์นี้เท่านั้น ปิดให้บริการใน4 ปีที่แล้ว ปรับปรุงคำถามนี้ สิ่งนี้อาจไร้ผลเนื่องจากฉันรู้ว่าการเขียนระบบปฏิบัติการนั้นซับซ้อนเหลือทน (โดยเฉพาะด้วยตัวเอง) ฉันไม่คาดหวังว่าจะสร้าง linux หรือ windows ตัวถัดไป ฉันรู้ว่ามันจะแย่และเป็นรถที่ใช้งานไม่ได้ แต่ก็ไม่เป็นไร ผมอยากจะเขียนทุกอย่างเองในสภา , Cและ (พอใช้) C ++ นี่เป็นโครงการในอนาคตเนื่องจากตอนนี้ฉันกำลังยุ่งอยู่กับเรื่องอื่น ๆ และไม่มีเวลาในทันที แต่ฉันคิดว่าจะถามตอนนี้ดังนั้นบางทีฉันอาจจะได้รับคำตอบมากมายสำหรับเรื่องนี้และมันก็ทำได้ สร้างและเป็นทรัพยากรที่มีประโยชน์สำหรับแนวทางนี้ (ทุกอย่างที่ฉันเคยเห็นเกี่ยวข้องกับการสร้างจาก minix โดยใช้ bootloader ที่มีอยู่สร้างมันในสิ่งที่โปรแกรมบูตเสมือน ฯลฯ ) ฉันต้องการตั้งค่าเดสก์ท็อปรุ่นเก่าด้วยจอภาพแป้นพิมพ์และเมาส์และเริ่มทำงานกับฮาร์ดไดรฟ์เปล่า ฉันต้องการเรียนรู้วิธีเขียนโปรแกรมโหลดบูตของตัวเอง (ฉันพบแหล่งข้อมูลมากมายเกี่ยวกับเรื่องนี้ แต่เพื่อความสมบูรณ์โปรดยังคงเพิ่มสิ่งที่ดี) ไดรเวอร์ USB ของฉันเอง (ถ้าจำเป็น) ไดรเวอร์ซีดี (หากจำเป็น ) ฯลฯ ทุกอย่างตั้งแต่ต้นจนจบ ฉันจะใส่รหัสลงในคอมพิวเตอร์ได้อย่างไร? …

6
เหตุใด SSE สเกลาร์ sqrt (x) จึงช้ากว่า rsqrt (x) * x
ฉันได้จัดทำโปรไฟล์หลักคณิตศาสตร์ของเราใน Intel Core Duo และในขณะที่ดูวิธีการต่างๆของสแควร์รูทฉันสังเกตเห็นว่ามีอะไรแปลก ๆ : การใช้การดำเนินการสเกลาร์ SSE การใช้สแควร์รูทซึ่งกันและกันเร็วกว่าและคูณ เพื่อรับ sqrt มากกว่าที่จะใช้ opcode sqrt ดั้งเดิม! ฉันกำลังทดสอบด้วยการวนซ้ำเช่น: inline float TestSqrtFunction( float in ); void TestFunc() { #define ARRAYSIZE 4096 #define NUMITERS 16386 float flIn[ ARRAYSIZE ]; // filled with random numbers ( 0 .. 2^22 ) float flOut [ ARRAYSIZE …

4
อะไรคือความแตกต่างระหว่าง Native Code, Machine Code และ Assembly Code?
ฉันสับสนเกี่ยวกับรหัสเครื่องและรหัสเนทีฟในบริบทของภาษา. NET อะไรคือความแตกต่างระหว่างพวกเขา? พวกเดียวกันหรือเปล่า?

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