ฉันจะดูรหัสประกอบของโปรแกรม C ++ ได้อย่างไร
เครื่องมือยอดนิยมในการทำเช่นนี้มีอะไรบ้าง?
ฉันจะดูรหัสประกอบของโปรแกรม C ++ ได้อย่างไร
เครื่องมือยอดนิยมในการทำเช่นนี้มีอะไรบ้าง?
คำตอบ:
หากคุณกำลังสร้างโปรแกรมด้วยตัวเองคุณสามารถขอให้คอมไพเลอร์ของคุณปล่อยแหล่งที่มาของการประกอบ สำหรับคอมไพเลอร์ UNIX ส่วนใหญ่ใช้-S
สวิตช์
หากคุณใช้-g -Wa,-alh
แอสเซมเบลอร์ GNU การคอมไพล์จะให้ซอร์สแบบผสมและแอสเซมบลีบน stdout ( -Wa
ขอให้ไดรเวอร์คอมไพลเลอร์ส่งตัวเลือกไปยัง-al
แอสเซมเบลอร์เปิดรายการแอสเซมบลีและ-ah
เพิ่มรายการ "แหล่งที่มาระดับสูง"):
g++ -g -c -Wa,-alh foo.cc
สำหรับ Visual Studio ให้ใช้/FAsc
ไฟล์.
หากคุณรวบรวมไบนารี
objdump -d a.out
กับ UNIX (ใช้ได้กับ cygwin)dumpbin /DISASM foo.exe
บน Windowsผู้แก้ปัญหาอาจแสดงความไม่พอใจได้เช่นกัน
disas
คำสั่งใน GDBใน GCC / G ++ คอมไพล์ด้วย-S
. ที่จะส่งออกsomething.s
ไฟล์ที่มีรหัสแอสเซมบลี
แก้ไข: หากคุณต้องการให้ผลลัพธ์เป็นไวยากรณ์ของ Intel (ซึ่งก็คือ IMO ซึ่งอ่านได้ง่ายกว่ามากและแบบฝึกหัดการประกอบส่วนใหญ่ใช้) ให้คอมไพล์ด้วย-masm=intel
.
-fverbose-asm
ตัวเลือกด้วย
ใน Visual Studio ;
สำหรับ gcc / g ++
gcc -save-temps -fverbose-asm prog.c
สิ่งนี้จะสร้าง prog.s พร้อมความคิดเห็นเกี่ยวกับตัวแปรที่ใช้ในทุกบรรทัด asm:
movl $42, -24(%ebp) #, readme
movl -16(%ebp), %eax # pid, pid
movl %eax, 4(%esp) # pid,
movl $.LC0, (%esp) #,
call printf #
ไซต์นี้กำลังทำงานให้ฉัน (2017): https://godbolt.org/
หลายคนบอกวิธีการส่งรหัสแอสเซมบลีด้วยคอมไพเลอร์ที่กำหนดแล้ว อีกวิธีหนึ่งคือการรวบรวมไฟล์ออบเจ็กต์และถ่ายโอนข้อมูลด้วยเครื่องมือเช่นobjdump , readelf (บน Unix) หรือ DUMPBIN ( ลิงก์ ) (บน Windows) คุณยังสามารถถ่ายโอนไฟล์ปฏิบัติการได้ แต่จะอ่านผลลัพธ์ได้ยากขึ้น
สิ่งนี้มีข้อดีของการทำงานในลักษณะเดียวกันกับคอมไพเลอร์ใด ๆ
ไม่ว่าคุณจะใช้ดีบักเกอร์ใดก็ตามควรมีมุมมองแอสเซมบลี (Visual Studio, Borland IDE, gdb ฯลฯ ) หากคุณไม่ได้ใช้ดีบักเกอร์และเพียงต้องการดูว่าแอสเซมบลีใดอยู่ในโปรแกรมคุณสามารถใช้ตัวแยกชิ้นส่วนหรือเรียกใช้โปรแกรมและแนบเข้ากับดีบักเกอร์และทำการดัมพ์จากที่นั่น ดูข้อมูลอ้างอิงเกี่ยวกับตัวแยกชิ้นส่วนสำหรับข้อมูลเกี่ยวกับตัวเลือกต่างๆ
ดังที่มีคนกล่าวถึงดีบักเกอร์ของแพลตฟอร์มของคุณเป็นจุดเริ่มต้นที่ดี สำหรับนักแก้ไขบั๊กและตัวถอดชิ้นส่วนทั้งหมดให้ดูที่IDA Pro
บนแพลตฟอร์ม Unix / Linux (รวมถึง Cygwin) คุณสามารถobjdump --disassemble <executable>
ใช้ได้
คอมไพเลอร์ส่วนใหญ่มีตัวเลือกในการส่งออกรายการแอสเซมบลี เช่นด้วย VisualStudio คุณสามารถใช้สิ่งต่างๆเช่น:
cl.exe /FAfile.asm file.c
เพื่อให้อ่านง่ายที่สุดดีบักเกอร์ส่วนใหญ่จะเสนอมุมมองที่สอดแทรกการถอดชิ้นส่วนกับแหล่งต้นฉบับดังนั้นคุณสามารถเปรียบเทียบโค้ดของคุณกับบรรทัดเอาต์พุตของคอมไพเลอร์ทีละบรรทัด
PE Explorer Disassemblerสำหรับไฟล์ PE 32 บิต IDA สำหรับคนอื่น ๆ
คุณสามารถลองใช้เว็บไซต์นี้: http://assembly.ynh.io/
ที่นั่นคุณสามารถวางรหัส C หรือ C ++ แล้วกดปุ่มสีน้ำเงินเพื่อดูเวอร์ชันที่เทียบเท่าแอสเซมบลี
ใน Visual Studio คุณสามารถสร้างรายการแอสเซมเบลอร์สำหรับโปรเจ็กต์ C ++
ไปที่คุณสมบัติโปรเจ็กต์จากนั้นไปที่ C ++ / ไฟล์เอาต์พุตและตั้งค่าการตั้งค่า Assembler Output และตำแหน่งรายการ ASM เป็นชื่อไฟล์
ใน Intel Mac OS X 10.8 (Mountain Lion) -masm=intel
คำสั่งไม่ทำงาน อย่างไรก็ตามหากคุณติดตั้งXcodeควรติดตั้งเครื่องมือชื่อ 'otool':
otool code.o -tV
คุณต้องระบุรหัสออบเจ็กต์ที่คอมไพล์แล้วเป็นพารามิเตอร์
หากคุณเป็นผู้ใช้ Eclipse, คุณสามารถใช้มุมมองถอด
มุมมอง Disassembly แสดงโปรแกรมที่โหลดเป็นคำสั่งแอสเซมเบลอร์ผสมกับซอร์สโค้ดเพื่อเปรียบเทียบ บรรทัดการดำเนินการในปัจจุบันจะระบุด้วยเครื่องหมายลูกศรและไฮไลต์ในมุมมอง คุณสามารถทำงานต่อไปนี้ได้ในมุมมอง Disassembly:
- ตั้งค่าจุดพักที่จุดเริ่มต้นของคำสั่งแอสเซมเบลอร์
- เปิดใช้งานและปิดใช้งานเบรกพอยต์และตั้งค่าคุณสมบัติ
- ทำตามขั้นตอนการถอดชิ้นส่วนของโปรแกรมของคุณ
- ข้ามไปที่คำแนะนำเฉพาะในโปรแกรม
Alt +8