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

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

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 …

10
รหัสการประกอบเทียบกับรหัสเครื่องกับรหัสวัตถุ?
รหัสวัตถุรหัสเครื่องจักรและรหัสการประกอบต่างกันอย่างไร คุณสามารถยกตัวอย่างที่เป็นภาพเกี่ยวกับความแตกต่างได้หรือไม่?

8
ตัวชี้ฐานและตัวชี้สแต็คคืออะไร? พวกเขาทำในสิ่งที่ชี้?
การใช้ตัวอย่างนี้มาจากวิกิพีเดียซึ่ง DrawSquare () เรียก DrawLine () (โปรดทราบว่าแผนภาพนี้มีที่อยู่สูงที่ด้านล่างและที่อยู่ต่ำที่ด้านบน) ใครสามารถอธิบายฉันว่าอะไรebpและespอยู่ในบริบทนี้บ้าง จากสิ่งที่ฉันเห็นฉันจะบอกว่าตัวชี้สแต็คชี้ไปที่ด้านบนสุดของสแต็กเสมอและตัวชี้พื้นฐานไปยังจุดเริ่มต้นของฟังก์ชันปัจจุบันหรือไม่ หรืออะไร? แก้ไข: ฉันหมายถึงสิ่งนี้ในบริบทของโปรแกรม windows edit2: และมันeipทำงานอย่างไรเช่นกัน? edit3:ฉันมีรหัสต่อไปนี้จาก MSVC ++: var_C= dword ptr -0Ch var_8= dword ptr -8 var_4= dword ptr -4 hInstance= dword ptr 8 hPrevInstance= dword ptr 0Ch lpCmdLine= dword ptr 10h nShowCmd= dword ptr 14h พวกเขาทั้งหมดดูเหมือนจะเป็น dwords ดังนั้นจึงใช้เวลา 4 …
225 c++  c  assembly  x86 

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 : …

30
ทำไมโปรแกรมไม่ได้เขียนในแอสเซมบลีบ่อยขึ้น [ปิด]
ตามที่เป็นอยู่ในปัจจุบันคำถามนี้ไม่เหมาะสำหรับรูปแบบคำถาม & คำตอบของเรา เราคาดหวังคำตอบที่จะได้รับการสนับสนุนจากข้อเท็จจริงการอ้างอิงหรือความเชี่ยวชาญ แต่คำถามนี้อาจเรียกร้องให้มีการอภิปรายโต้แย้งโต้แย้งหรือการอภิปรายเพิ่มเติม หากคุณรู้สึกว่าคำถามนี้สามารถปรับปรุงและเปิดใหม่ได้โปรดไปที่ศูนย์ช่วยเหลือเพื่อขอคำแนะนำ ปิดให้บริการใน7 ปีที่ผ่านมา ล็อคแล้ว คำถามและคำตอบของคำถามนี้ถูกล็อคเนื่องจากคำถามอยู่นอกหัวข้อ แต่มีความสำคัญทางประวัติศาสตร์ ขณะนี้ไม่ยอมรับคำตอบหรือการโต้ตอบใหม่ ดูเหมือนว่าเป็นความคิดเห็นหลักว่าการเขียนโปรแกรมแอสเซมบลีใช้เวลานานกว่าและยากที่จะโปรแกรมในภาษาระดับสูงกว่าเช่น C. ดังนั้นจึงดูเหมือนว่าจะแนะนำหรือสันนิษฐานว่าดีกว่าที่จะเขียนด้วยภาษาระดับสูงด้วยเหตุผลเหล่านี้ และสำหรับเหตุผลของการพกพาที่ดีขึ้น เมื่อเร็ว ๆ นี้ฉันได้เขียนในชุดประกอบ x86 และเริ่มต้นกับฉันแล้วว่าเหตุผลเหล่านี้อาจไม่จริงยกเว้นการพกพา บางทีมันอาจเป็นเรื่องของความคุ้นเคยและการรู้วิธีเขียนชุดประกอบ ฉันยังสังเกตเห็นว่าการเขียนโปรแกรมในแอสเซมบลีค่อนข้างแตกต่างจากการเขียนโปรแกรมใน HLL บางทีโปรแกรมเมอร์แอสเซมบลีที่ดีและมีประสบการณ์สามารถเขียนโปรแกรมได้อย่างง่ายดายและรวดเร็วเหมือนกับโปรแกรมเมอร์ C ที่มีประสบการณ์เขียนใน C อาจเป็นเพราะการเขียนโปรแกรมแอสเซมบลีค่อนข้างแตกต่างจาก HLLs ดังนั้นต้องใช้ความคิดวิธีการและวิธีการที่แตกต่างกันซึ่งทำให้ดูเหมือนว่าโปรแกรมในสิ่งที่ไม่คุ้นเคยเป็นเรื่องที่น่าอึดอัดใจมาก ถ้าการพกพาไม่ใช่ปัญหาจริงๆแล้ว C จะมีอะไรบ้างในแอสเซมเบลอร์ที่ดีเช่น NASM แก้ไข: เพียงเพื่อชี้ให้เห็น เมื่อคุณกำลังเขียนในการชุมนุมคุณไม่จำเป็นต้องเขียนในรหัสการเรียนการสอน คุณสามารถใช้มาโครและโพรซีเดอร์และการประชุมของคุณเองเพื่อสร้าง abstractions ต่าง ๆ เพื่อทำให้โปรแกรมแยกส่วนเพิ่มเติมบำรุงรักษาได้ง่ายขึ้นและอ่านง่ายขึ้น นี่คือที่คุ้นเคยกับวิธีการเขียนแอสเซมบลีที่ดีมา

24
ปกป้องปฏิบัติการจากวิศวกรรมย้อนกลับ?
ฉันได้ไตร่ตรองวิธีการป้องกันรหัส C / C ++ ของฉันจากการถอดและวิศวกรรมย้อนกลับ ปกติฉันจะไม่เอาผิดพฤติกรรมนี้ในรหัสของฉัน อย่างไรก็ตามโปรโตคอลปัจจุบันที่ฉันทำงานอยู่นั้นจะต้องไม่ถูกตรวจสอบหรือเข้าใจได้เพื่อความปลอดภัยของผู้คนต่าง ๆ ตอนนี้นี่เป็นเรื่องใหม่สำหรับฉันและอินเทอร์เน็ตไม่ได้มีความเชี่ยวชาญในการป้องกันการย้อนกลับของวิศวกรรมแต่แสดงให้เห็นถึงข้อมูลมากมายเกี่ยวกับวิธีการย้อนกลับวิศวกร บางสิ่งที่ฉันคิดว่าจนถึงตอนนี้คือ: การฉีดโค้ด (การเรียกใช้ฟังก์ชันดัมมี่ก่อนและหลังการเรียกใช้ฟังก์ชันจริง) รหัส obfustication (mangles ถอดแยกชิ้นส่วนของไบนารี) เขียนกิจวัตรการเริ่มต้นของตัวเอง (ยากกว่าสำหรับผู้ debuggers ที่จะผูกไว้) void startup(); int _start() { startup( ); exit (0) } void startup() { /* code here */ } ตรวจสอบ Runtime สำหรับ debuggers (และบังคับให้ออกหากตรวจพบ) ฟังก์ชั่นแทมโพลีน void trampoline(void (*fnptr)(), bool ping …
210 c++  c  obfuscation  assembly 

3
เหตุใด GCC จึงสร้างแอสเซมบลีที่ต่างกันอย่างสิ้นเชิงสำหรับรหัส C เกือบเหมือนกัน
ในขณะที่เขียนเพิ่มประสิทธิภาพftolการทำงานของผมพบว่าพฤติกรรมแปลก ๆ GCC 4.6.1บางอย่างใน ให้ฉันแสดงรหัสก่อน (เพื่อความชัดเจนฉันได้ทำเครื่องหมายความแตกต่าง): fast_trunc_one, C: int fast_trunc_one(int i) { int mantissa, exponent, sign, r; mantissa = (i & 0x07fffff) | 0x800000; exponent = 150 - ((i >> 23) & 0xff); sign = i & 0x80000000; if (exponent < 0) { r = mantissa << -exponent; /* diff …

22
ภาษาแอสเซมบลีแบบอินไลน์ช้ากว่ารหัสภาษา C ++ หรือไม่
ฉันพยายามเปรียบเทียบประสิทธิภาพของภาษาแอสเซมบลีแบบอินไลน์และรหัส C ++ ดังนั้นฉันจึงเขียนฟังก์ชั่นที่เพิ่มขนาด 2,000 อาร์เรย์สองอาร์เรย์เป็น 100,000 ครั้ง นี่คือรหัส: #define TIMES 100000 void calcuC(int *x,int *y,int length) { for(int i = 0; i < TIMES; i++) { for(int j = 0; j < length; j++) x[j] += y[j]; } } void calcuAsm(int *x,int *y,int lengthOfArray) { __asm { mov edi,TIMES …
183 c++  c  performance  assembly 

1
แสดงคำสั่งการประกอบปัจจุบันใน GDB
ฉันกำลังทำการดีบักระดับชุดประกอบใน GDB มีวิธีที่จะทำให้ GDB แสดงคำสั่งชุดประกอบปัจจุบันในลักษณะเดียวกับที่แสดงบรรทัดซอร์สปัจจุบันหรือไม่ เอาต์พุตเริ่มต้นหลังจากทุกคำสั่งมีลักษณะดังนี้: 0x0001433f 990 Foo::bar(p); สิ่งนี้ให้ที่อยู่ของคำแนะนำปัจจุบัน แต่ฉันต้องอ้างอิงกลับไปที่ผลลัพธ์ของdisassembleคำสั่งเพื่อดูว่าคำสั่งใดที่ฉันกำลังเรียกใช้อยู่
179 assembly  gdb 

13
num ++ สามารถเป็นอะตอมสำหรับ 'int num' ได้หรือไม่
โดยทั่วไปสำหรับint num, num++(หรือ++num), ในฐานะการดำเนินการอ่าน - แก้ไข - การเขียนไม่ได้เป็นอะตอมมิก แต่ฉันมักจะเห็นคอมไพเลอร์เช่นGCCสร้างรหัสต่อไปนี้ ( ลองที่นี่ ): ตั้งแต่บรรทัดที่ 5 ซึ่งสอดคล้องกับnum++คำสั่งเดียวเราสามารถสรุปได้ว่าnum++ เป็นอะตอมในกรณีนี้หรือไม่? และถ้าเป็นเช่นนั้นหมายความว่าสิ่งที่สร้างขึ้นnum++สามารถนำมาใช้ในสถานการณ์พร้อมกัน (มัลติเธรด) โดยไม่มีอันตรายจากการแข่งขันของข้อมูล (เช่นเราไม่จำเป็นต้องทำตัวอย่างเช่นstd::atomic<int>และกำหนดค่าใช้จ่ายที่เกี่ยวข้องเนื่องจากเป็น ปรมาณูอยู่แล้ว)? UPDATE โปรดสังเกตว่าคำถามนี้ไม่ใช่ว่าการเพิ่มขึ้นเป็นอะตอมหรือไม่ (ไม่ใช่และนั่นคือและเป็นบรรทัดเปิดของคำถาม) มันอาจเป็นได้ในบางสถานการณ์หรือไม่เช่นในกรณีที่ใช้คำสั่งเดียวสามารถใช้เพื่อหลีกเลี่ยงค่าใช้จ่ายของlockคำนำหน้า และในฐานะที่เป็นคำตอบที่ได้รับการยอมรับกล่าวถึงในส่วนที่เกี่ยวกับเครื่องประมวลผลเดียวเช่นเดียวกับคำตอบนี้การสนทนาในความคิดเห็นและอื่น ๆ อธิบายว่ามันสามารถ (แม้ว่าจะไม่ใช่กับ C หรือ C ++)

3
คุณจะใช้ gcc เพื่อสร้างรหัสการประกอบในไวยากรณ์ของ Intel ได้อย่างไร
gcc -Sตัวเลือกที่จะสร้างรหัสการชุมนุมใน AT & T ไวยากรณ์จะมีวิธีในการสร้างไฟล์ในไวยากรณ์อินเทล? หรือมีวิธีการแปลงระหว่างทั้งสอง?
151 gcc  x86  gnu  intel  assembly 

1
เหตุใดชิป ARM จึงมีคำสั่งกับ Javascript ในชื่อ (FJCVTZS)
FJCVTZSคือ "Floating-point Javascript Convert to Signed fixed-point, rounding towards Zero" รองรับชิป Arm v8.3-A และใหม่กว่า ซึ่งเป็นเรื่องแปลกเพราะคุณไม่คาดคิดว่าจะได้เห็น JavaScript ใกล้เคียงกับ bare metal ฉันสามารถหาคำอธิบายได้ว่าคำสั่งนั้นทำอะไรได้บ้าง แต่ทำไมจึงไม่มี เธรดนี้ระบุว่า "มีอยู่เป็นคำสั่งเดียวเนื่องจาก JS ไม่มีประเภทจำนวนเต็มหมายความว่ากรณีการใช้งานบางอย่างจำเป็นต้องใช้การดำเนินการนี้ในเชิงลามกอนาจารโดยไม่มีเหตุผลอัลกอริทึมที่ดี" เป็นไปได้ แต่ฉันต้องการความเข้าใจในรายละเอียดเพิ่มเติม
148 javascript  assembly  arm 

13
ตั้งโปรแกรมเครื่องจักรประจำวันได้อย่างไร?
มีการตั้งโปรแกรมเครื่องจักรในชีวิตประจำวัน (ไม่มากคอมพิวเตอร์และอุปกรณ์มือถือเป็นเครื่องใช้นาฬิกาดิจิตอล ฯลฯ ) เป็นอย่างไร โค้ดประเภทใดที่ใช้ในการเขียนโปรแกรมของเครื่องจำหน่าย Coca-Cola เครื่องชงกาแฟของฉันยอมรับเวลาที่ตั้งโปรแกรมไว้ล่วงหน้าอย่างไรและเริ่มต้มกาแฟชั่วโมงต่อมาเมื่อถึงเวลานั้น เครื่องประเภทนี้มีระบบปฏิบัติการอยู่ภายในหรือไม่หรือเป็นสิ่งที่พื้นฐานกว่านี้หรือไม่ พวกเขาเขียนใน Assembly, C หรือภาษาอื่น ๆ บ้างไหม? และฉันต้องการค้นหาทรัพยากรบางอย่างที่แสดงรายการระบบปฏิบัติการเหล่านี้หรือระบบโค้ดพื้นฐานอาจเป็นไปได้ว่ามีซอร์สโค้ดถ้าเป็นไปได้ ถ้าใครรู้เกี่ยวกับทรัพยากรเช่นนั้น (การค้นหาไม่ได้ผลอะไรเลยสำหรับฉัน) นั่นจะยอดเยี่ยมมาก

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 

7
milw0rm นี้ทำงานอย่างไร
ฉันมักจะไม่มีปัญหาในการอ่านรหัส JavaScript แต่สำหรับอันนี้ฉันไม่สามารถหาเหตุผลได้ รหัสนี้มาจากช่องโหว่ที่เผยแพร่เมื่อ 4 วันก่อน คุณสามารถค้นหาได้ที่milw0rm นี่คือรหัส: <html> <div id="replace">x</div> <script> // windows/exec - 148 bytes // http://www.metasploit.com // Encoder: x86/shikata_ga_nai // EXITFUNC=process, CMD=calc.exe var shellcode = unescape("%uc92b%u1fb1%u0cbd%uc536%udb9b%ud9c5%u2474%u5af4%uea83%u31fc%u0b6a%u6a03%ud407%u6730%u5cff%u98bb%ud7ff%ua4fe%u9b74%uad05%u8b8b%u028d%ud893%ubccd%u35a2%u37b8%u4290%ua63a%u94e9%u9aa4%ud58d%ue5a3%u1f4c%ueb46%u4b8c%ud0ad%ua844%u524a%u3b81%ub80d%ud748%u4bd4%u6c46%u1392%u734a%u204f%uf86e%udc8e%ua207%u26b4%u04d4%ud084%uecba%u9782%u217c%ue8c0%uca8c%uf4a6%u4721%u0d2e%ua0b0%ucd2c%u00a8%ub05b%u43f4%u24e8%u7a9c%ubb85%u7dcb%ua07d%ued92%u09e1%u9631%u5580"); // ugly heap spray, the d0nkey way! // works most of the time var spray = unescape("%u0a0a%u0a0a"); do { spray += …

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