การเรียนภาษาแอสเซมบลีคุ้มค่าหรือไม่? [ปิด]


97

ยังคุ้มค่าที่จะเรียนรู้ASMหรือไม่?

ฉันรู้เล็กน้อย แต่ฉันไม่ได้ใช้มันหรือเรียนรู้อย่างถูกต้องจริงๆเพราะทุกสิ่งที่ฉันเรียนรู้ในแอสเซมเบลอร์ฉันสามารถทำได้ใน 1/10 เวลากับบางภาษาเช่น C หรือ C ++ ดังนั้นฉันควรเรียนรู้และใช้ ASM จริง ๆ หรือไม่? มันจะทำให้ฉันเป็นมืออาชีพที่ดีได้หรือไม่? มันจะเพิ่มความมั่งคั่งของฉันหรือไม่? ในระยะสั้นมันจะทำให้ฉันเป็นโปรแกรมเมอร์ที่ดีขึ้นได้หรือไม่?

หมายเหตุ: ฉันกำลังพูดถึงแอสเซมบลีระดับต่ำเช่นFASMหรือNASMไม่ใช่HLA (High-Level Assembler)


2
โปรดทราบว่าภาษาแอสเซมบลีนั้นเชื่อมโยงกับโปรเซสเซอร์ / คอนโทรลเลอร์
rmflow

7
หมายความว่ามันไม่ข้ามแพลตฟอร์มหรอ !!
ApprenticeHacker

ไม่ตัวอย่างเช่นworldofspectrum.org/Z80instructions.html
rmflow

2
โอเคมีภาษาแอสเซมบลีที่แตกต่างกันสำหรับโปรเซสเซอร์ทุกตัว ??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker

4
ภาษาแอสเซมบลีที่แตกต่างกันสำหรับโปรเซสเซอร์แต่ละตระกูล รหัส 386 ทำงานบนโปรเซสเซอร์ x86 ในภายหลังรวมถึงข้อเสนอของ Intel และ AMD - แต่ชุดคุณลักษณะบางอย่างเป็นส่วนขยายที่เป็นกรรมสิทธิ์ ภาษาจะเหมือนกันสำหรับคำแนะนำพิเศษเหล่านี้ แต่ไบนารีที่เกิดจะไม่เป็นแบบพกพา
spraff

คำตอบ:


109

ฉันเรียนรู้จากหนังสือของ Kip Irvine หากคุณเพิกเฉยต่อคำวิพากษ์วิจารณ์ (ที่ยุติธรรม) เกี่ยวกับห้องสมุด (ที่ไม่เกี่ยวข้อง) ของเขาฉันสามารถแนะนำได้ว่าเป็นคำแนะนำที่ดีเกี่ยวกับภาษาแม้ว่าจะเป็นสิ่งที่น่าสนใจจริงๆที่คุณต้องค้นหาสิ่งที่ครอบงำทางอินเทอร์เน็ต

ฉันคิดว่ามันมีประโยชน์ที่จะเข้าใจสิ่งที่เกิดขึ้นในระดับล่าง ในขณะที่คุณค้นคว้าเกี่ยวกับแอสเซมเบลอร์คุณจะได้เรียนรู้เกี่ยวกับการไปป์ไลน์ของซีพียูการทำนายสาขาการจัดตำแหน่งแคช SIMD การเรียงลำดับคำสั่งและอื่น ๆ ความรู้เหล่านี้จะช่วยให้คุณเขียนโค้ดระดับสูงได้ดีขึ้น

นอกจากนี้ภูมิปัญญาดั้งเดิมคือการไม่พยายามเพิ่มประสิทธิภาพการประกอบด้วยมือเกือบตลอดเวลา แต่ให้คอมไพเลอร์กังวลเกี่ยวกับเรื่องนี้ เมื่อคุณเห็นตัวอย่างของสิ่งที่บิดเบี้ยวที่คอมไพเลอร์สร้างขึ้นคุณจะเข้าใจได้ดีขึ้นว่าทำไมภูมิปัญญาดั้งเดิมจึงมีอยู่

ตัวอย่าง: LFSR ทำงานได้อย่างรวดเร็วด้วยคำสั่งหมุนพร้อมพกพาสำหรับกรณีเฉพาะเช่นนี้การเขียนเวอร์ชันแอสเซมเบลอร์นั้นง่ายพอ ๆ กับการค้นหาว่าคอมไพเลอร์ฉลาดพอที่จะคิดออกหรือไม่ บางครั้งคุณก็รู้บางอย่างที่คอมไพเลอร์ไม่ได้

นอกจากนี้ยังช่วยเพิ่มความเข้าใจเกี่ยวกับปัญหาด้านความปลอดภัยเช่นการเขียนหรือดำเนินการการซ้อนทับ ฯลฯ

ปัญหาการเกิดพร้อมกันบางอย่างจะปรากฏชัดเจนก็ต่อเมื่อคุณทราบถึงสิ่งที่เกิดขึ้นในระดับต่อคำสั่ง

อาจมีประโยชน์ในบางครั้งเมื่อทำการดีบักหากคุณไม่มีซอร์สโค้ดที่สมบูรณ์

มีค่าความอยากรู้อยากเห็น ฟังก์ชันเสมือนถูกนำไปใช้อย่างไร? เคยลองเขียนโปรแกรม DirectX หรือ COM ในแอสเซมเบลอร์หรือไม่? โครงสร้างขนาดใหญ่ได้รับการส่งคืนอย่างไรฟังก์ชันการโทรเสนอพื้นที่ให้หรือในทางกลับกัน?

จากนั้นก็มีภาษาแอสเซมบลีพิเศษสำหรับฮาร์ดแวร์กราฟิกแม้ว่าภาษา shader จะมีระดับสูงเมื่อไม่กี่ปีที่ผ่านมา แต่สิ่งใดก็ตามที่ช่วยให้คุณคิดถึงปัญหาด้วยวิธีที่ต่างออกไป


7
คำตอบที่เป็นลายลักษณ์อักษร +1 การเรียนรู้และการใช้เป็นสองสิ่งที่แตกต่างกันการเรียนรู้เป็นความคิดที่ดีเมื่อ / ถ้าจะใช้มันมาพร้อมกับประสบการณ์
old_timer

เพื่อยกตัวอย่างLinus Torvalds ใช้ disassembler เพื่อดีบักโค้ดของเขาดังนั้นฉันคิดว่าเขามีความรู้ดีเกี่ยวกับการประกอบ x86
Ivanzinho

55

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

แน่นอนว่าฉันไม่สามารถเขียนแอสเซมบลีได้ (เช่นเขียนโค้ดที่ไม่สำคัญใด ๆ ในแอสเซมบลี) แต่ฉันสามารถอ่านได้และพร้อมกับความรู้เกี่ยวกับสถาปัตยกรรมฮาร์ดแวร์จริงและรูปแบบการเรียกที่ใช้นั้นเพียงพอที่จะวิเคราะห์ประสิทธิภาพและ ระบุส่วนของโค้ด C ++ ที่เป็นแหล่งที่มาของแอสเซมบลีนั้น


4
คุณหมายความว่าฉันควรเรียนรู้คำสั่งpush, pop, mov และเรียกใช้ขั้นพื้นฐานหรือไม่?
ApprenticeHacker

10
ฉันเห็นด้วยความจำเป็นในการรู้แอสเซมบลีนั้นขึ้นอยู่กับสาขาการเขียนโปรแกรมที่คุณกำลังทำงานอยู่ เว็บ / เดสก์ท็อป / ฐานข้อมูล? ลืมแอสเซมเบลอร์ เกมคอมพิวเตอร์และกราฟิก? อาจมีประโยชน์บ้าง การพัฒนาระบบปฏิบัติการหรือระบบฝังตัวแบบเรียลไทม์? มันเป็นสิ่งที่ต้องทำ และอื่น ๆ
Lundin

1
คุณกำลังบิดเบือนคำตอบอื่น ๆ - ไม่มีใครบอกว่าคุณต้องการ / ควรเรียนรู้การประกอบ แค่ว่ามีประโยชน์หรือคุ้มค่าตามคำถาม คำตอบของคุณยังคงมีความเกี่ยวข้อง
Luc Danton

1
@burningprodigy: ฉันเชื่อว่าคุณควรมีความรู้พื้นฐานเกี่ยวกับวิธีการที่คำแนะนำในแอสเซมเบลอร์ที่คุณใช้ (เช่นลำดับของอาร์กิวเมนต์คืออะไรและสิ่งที่คล้ายกัน) และความเข้าใจพื้นฐานบางอย่างเกี่ยวกับคำสั่งบางอย่างสิ่งที่โหลด หรือร้านค้าคือ จากนั้นหากคุณต้องการดูส่วนประกอบบางส่วนคุณสามารถใช้ข้อมูลอ้างอิงเพื่อทำความเข้าใจคำแนะนำแต่ละข้อและในการทำเช่นนั้นคุณจะเริ่มเรียนรู้พื้นฐานที่คุณต้องการ
David Rodríguez - dribeas

1
ฉันเห็นด้วย. โดยเฉพาะอย่างยิ่งการรู้ว่าแอสเซมบลีจะช่วยให้คุณได้รับประโยชน์สูงสุดจากการประเมินประสิทธิภาพของซีพียูยุคใหม่ หากนั่นเป็นเป้าหมายความรู้พื้นฐานเล็กน้อยเกี่ยวกับการประกอบพร้อมส่วนแบ่งที่เป็นธรรมเกี่ยวกับพื้นฐานของสถาปัตยกรรมคอมพิวเตอร์จะเป็นประโยชน์มากกว่า เวลาส่วนใหญ่ที่ฉันต้องการแอสเซมบลีคือการดูจากโปรแกรมที่ปรับให้เหมาะสมที่สุดหรือเพื่อความสนุกสนาน (เช่นการรักษาความปลอดภัยการเขียนเคอร์เนลขนาดเล็ก .. ) แต่ฉันจำไม่ได้ว่าครั้งสุดท้ายที่เปลี่ยนการตัดสินใจออกแบบบางอย่างเพราะความรู้ในการประกอบ
Voo

28

ใช่ - เหตุผลหลักในการเรียนรู้แอสเซมบลีสำหรับนักพัฒนา C และ C ++ คือช่วยให้เข้าใจสิ่งที่เกิดขึ้นภายใต้ประทุนของรหัส C และ C ++ ไม่ใช่ว่าคุณจะเขียนโค้ดในแอสเซมบลีจริง ๆ แต่คุณจะสามารถดูการถอดโค้ดเพื่อประเมินประสิทธิภาพและคุณจะเข้าใจว่าคุณสมบัติ C และ C ++ ที่แตกต่างกันทำงานได้ดีเพียงใด


24

มันคุ้มค่าที่จะเรียนรู้ภาษาต่างๆมากมายจากกระบวนทัศน์ต่างๆมากมาย ไม่นับการเรียนรู้ Java, C ++, C # และ Python เนื่องจากเป็นอินสแตนซ์ทั้งหมดที่มีกระบวนทัศน์เดียวกัน

เนื่องจากแอสเซมบลีอยู่ที่รูท (ใกล้กับรูท) ของทุกภาษาฉันจึงบอกว่ามันคุ้มค่าที่จะเรียนรู้แอสเซมบลี

จากนั้นอีกครั้งก็คุ้มค่าที่จะเรียนรู้ภาษาการเขียนโปรแกรมที่ใช้งานได้โปรแกรมลอจิกภาษาสคริปต์ภาษาที่ใช้คณิตศาสตร์ คุณมีเวลามากเท่านั้นจึงต้องเลือกและเลือก


และจากนั้นเมื่อคุณจนได้เรียนรู้พวกเขาทั้งหมดและคิดว่าคุณมีเหลือบของสิ่งที่เกิดขึ้นให้คุณค้นพบJ
Micha Wiedenmann

4

การรู้จัก ASM ยังมีประโยชน์เมื่อทำการดีบักเนื่องจากบางครั้งสิ่งที่คุณมีก็คือ "ASM dump of the error"


2

คุณมีประโยชน์ในสิ่งที่คุณวางแผนจะทำหรือไม่? มันจะช่วยคุณในด้านใดในสิ่งที่คุณกำลังทำอยู่หรือวางแผนที่จะทำ? นี่คือสองคำถามที่คุณควรถามตัวเองคำตอบคือคำตอบสำหรับคำถามของคุณ

โดยทั่วไปแล้วใช่ฉันคิดว่าในความคิดของฉันคุ้มค่าที่จะเรียนรู้ asm (บางอย่างเช่น x86 หรือ arm) มันให้บริการคุณได้ดีเพียงใดขึ้นอยู่กับสิ่งที่คุณเขียนโปรแกรมและวิธีการดีบักของคุณ


2

ขึ้นอยู่กับระดับการเขียนโปรแกรมที่คุณต้องการเข้าถึง หากคุณต้องการทำงานร่วมกับผู้ดีบั๊กใช่ หากคุณต้องการทราบว่าคอมไพเลอร์ทำงานอย่างไรใช่ แอสเซมเบลอร์ / ดีบักเกอร์ใด ๆ ขึ้นอยู่กับซีพียูดังนั้นจึงมีงานมากมายเพียงตรวจสอบตระกูล x86 ว่าใหญ่และเก่าแค่ไหน


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