ทำไมเราต้องใช้ภาษาแอสเซมบลี


27

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


13
Assembler เป็นรหัสเครื่องที่มนุษย์อ่านได้นั่นเป็นสาเหตุ
Andrej Bauer

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

คำตอบ:


32

"ทำไมภาษาแอสเซมบลีจึงถูกสร้างขึ้น?"

ภาษาแอสเซมบลีถูกสร้างขึ้นเป็นชวเลขที่แน่นอนสำหรับการเข้ารหัสระดับเครื่องเพื่อให้คุณไม่ต้องนับ 0 และ 1 ตลอดทั้งวัน มันทำงานเหมือนกับรหัสระดับเครื่อง: พร้อมคำแนะนำและตัวถูกดำเนินการ

"อันไหนมาก่อน"

Wikipedia มีบทความที่ดีเกี่ยวกับประวัติความเป็นมาของการเขียนโปรแกรมภาษา

"ทำไมฉันถึงเรียนเกี่ยวกับแอสเซมเบลอร์ในชั้นเรียนวิศวกรรมคอมพิวเตอร์ของฉัน"

แม้ว่ามันจะเป็นจริงคุณอาจจะไม่พบว่าตัวเองเขียนแอปของลูกค้าต่อไปของคุณในการชุมนุม แต่ก็ยังมีอีกมากที่จะได้รับจากการเรียนรู้การประกอบ

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

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


29

ทำไมเราต้องใช้ภาษาแอสเซมบลี

ที่จริงแล้วมีเพียงภาษาเดียวที่เราต้องการซึ่งเรียกว่า "ภาษาเครื่อง" หรือ "รหัสเครื่อง" ดูเหมือนว่านี้:

0010000100100011

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

โชคดีที่แต่ละส่วนของไบนารีสอดคล้องกับความหมายเฉพาะ มันแบ่งออกเป็นหลายส่วน:

0010|0001|0010|0011

operation type  source register  other source  destination register
0010            0001             0010          0011

ค่าเหล่านี้สอดคล้องกับ:

operation type 0010 = addition
source register 0001 = register 1
other source 0010 = register 2
destination register 0011 = register 3

ดังนั้นการดำเนินการนี้จะเพิ่มตัวเลขใน register 1 และ 2 และใส่ค่านั้นใน register 3 หากคุณใส่ค่าเหล่านี้ลงใน CPU และบอกว่า "go" มันจะเพิ่มตัวเลขสองตัวให้คุณ การดำเนินการ "ลบ" อาจเป็น 0011 หรือบางอย่างแทน 0010 ที่นี่ ค่าอะไรก็ตามที่ทำให้ซีพียูทำการลบ

ดังนั้นโปรแกรมอาจมีลักษณะเช่นนี้ (อย่าพยายามเข้าใจเพราะฉันสร้างรหัสเครื่องรุ่นนี้ขึ้นมาเพื่ออธิบายสิ่งต่าง ๆ ):

instruction 1: 0010000100100011
instruction 2: 0011000110100100
instruction 3: 0101001100010111
instruction 4: 0010001001100000

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

ดังนั้นคำสั่งดั้งเดิมของเราจากด้านบนอาจมีลักษณะ:

(meaning)      operation type  source register  other source  destination register
(machine code) 0010            0001             0010          0011
("English")    add             r1               r2            r3

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

ดีนี้เป็นภาษาประกอบ นั่นเป็นเหตุผลที่มันมีอยู่และทำไมมันถูกสร้างขึ้นมาตั้งแต่แรก

เพื่อทำความเข้าใจว่าทำไมเราต้องการมันตอนนี้อ่านคำตอบข้างต้น แต่กุญแจสำคัญที่จะเข้าใจคือ: ภาษาระดับสูงไม่มีการเป็นตัวแทนเดียวคือรหัสเครื่อง เช่นใน C หรือ Python หรืออะไรก็ตาม:

z = x + y

ฟังดูคล้ายกับการเพิ่มจากข้างบนสมมติว่าxอยู่ใน register 1 yอยู่ใน register 2 และzควรลงท้ายด้วย register 3 แต่สายนี้ล่ะ

z = x * 2 + (y / 6) * p + q - r

ลองแสดงบรรทัดนั้นเป็นเลขฐานสอง 16 บิตและบอก CPU "ไป" คุณทำไม่ได้ รหัสเครื่องไม่มีคำสั่งการดำเนินการเดียวเพื่อทำการเพิ่มการลบและสิ่งอื่นใดที่มี 4 หรือ 5 ตัวแปรพร้อมกัน ดังนั้นจะต้องถูกแปลงเป็นลำดับของรหัสเครื่องก่อน นี่คือสิ่งที่คุณทำเมื่อคุณ "รวบรวม" หรือ "ตีความ" ภาษาระดับสูง

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

1010010010001001
0010001000010000
0110010000100100
0010001011000010
0010100001000001
0100010100000001
0010010101000100
0010101010100000
0000100111000010

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

(หมายเหตุเพิ่มเติมเกี่ยวกับคำแนะนำของ @ Raphael: คุณสามารถสร้าง CPU ที่ทำงานกับสิ่งอื่นนอกเหนือจากรหัสไบนารี่เช่นไตรภาค (ฐาน 3) หรือรหัสทศนิยมหรือแม้แต่ ASCII สำหรับการใช้งานจริงเราติดอยู่กับไบนารี)


2
โดยหลักการแล้วไม่มีอะไรขัดขวางเราจากการสร้างซีพียูที่ทำงานกับภาษาแอสเซมบลีโดยตรง ASCII เป็นเพียงการเข้ารหัสที่ไม่มีประสิทธิภาพสำหรับจุดประสงค์นี้นั่นคือทั้งหมด
กราฟิลส์

ขอบคุณสำหรับการเพิ่ม ฉันเห็นด้วย แต่ข้ามไปเพื่อจุดประสงค์ในการทำความเข้าใจวัตถุประสงค์ของชุดประกอบ ฉันจะเพิ่มบันทึกย่อ
Chris Cooper

15

เหตุใดภาษาแอสเซมบลีจึงถูกสร้างขึ้น หรือเป็นคนที่มาก่อนแม้กระทั่งภาษาระดับสูง?

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

ทำไมฉันถึงเรียนเกี่ยวกับแอสเซมเบลอร์ในชั้นเรียนวิศวกรรมคอมพิวเตอร์ของฉัน

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

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

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


14

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

สหประชาชาติ (เทียบกับภาษาระดับสูง) เป็นเปลือยกาย มันไม่ได้ซ่อนอะไร (ที่ทำในซอฟต์แวร์) และมันง่ายในแง่ที่ว่ามันมีชุดปฏิบัติการที่ค่อนข้างเล็กและคงที่

สิ่งนี้มีประโยชน์สำหรับการวิเคราะห์อัลกอริทึมที่แน่นอน ซีแมนทิกส์และโฟลว์การควบคุมนั้นง่ายมากที่การนับการดำเนินการทั้งหมด (หรือจำนวนที่คาดหวัง) สามารถทำได้โดยการใส่คำอธิบายประกอบกราฟการควบคุมการไหลด้วยการนับการเปลี่ยนแปลง (ความน่าจะเป็น) Knuth ทำสิ่งนี้ในหนังสือ TAoCP ของเขาเพื่อผลที่ยอดเยี่ยมแสดงให้เห็นถึงการวิเคราะห์อัลกอริธึมที่เข้มงวดที่สุดบางอย่าง

บันทึกย่อ: เพื่อนร่วมงานของฉันเรียนรู้ที่จะอ่าน Java Bytecode เพื่อจุดประสงค์นี้


4

มีคำตอบอยู่ที่นี่:

คำตอบทั้งหมดเหล่านี้ชี้ไปที่:

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

1
คุณแชร์มุมมองเหล่านี้ทั้งหมดหรือไม่ ประสบการณ์ของคุณคืออะไร? (โดยเฉพาะอย่างยิ่งรายการ "โปรแกรมเมอร์ Noob กลายเป็นผู้เชี่ยวชาญ" ดูล้าสมัยไปหลายสิบปีสำหรับฉัน)
Raphael

woah woah คุณไม่ต้องง่วงมากกับเรื่องนี้ ฉันแค่เชื่อมคำตอบกับคำถามที่ซ้ำกันของเขา และ "ดังนั้น Noob โปรแกรมเมอร์กลายเป็นผู้เชี่ยวชาญ" ได้รับการโหวตสูงสุดที่นี่ ไปเถียงกับเขาไม่ใช่ฉัน =)
compski

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

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

ลิงค์แรกของคุณเสีย
Hola Soy Edu Feliz Navidad

1

แอสเซมบลี = รหัสเครื่อง
บางคนเก็บ harping เกี่ยวกับภาษาแอสเซมบลีแตกต่างจากรหัสตัวเลขที่ CPU เข้าใจ
สิ่งนี้ (ในขณะที่เป็นจริง) หายไปอย่างสมบูรณ์จุด
เท่าที่การแปลเป็นภาษาแอสเซมบลีและตัวเลข (ไบนารีฐานสิบหกอะไรก็ตาม) เป็นสิ่งเดียวและเหมือนกัน

Grok มันหรือวางมัน
ถ้าคุณ grok แอสเซมบลีคุณรู้ว่าคอมพิวเตอร์ทำงานจริง
การประกอบ grokking เกี่ยวข้องกับ:

  • เรียนรู้คำแนะนำและความหมาย (duh)
  • การทำความเข้าใจว่าการเรียนการสอนทำสิ่งที่พวกเขาไม่ได้ทำและพวกเขาทั้งหมดผลข้างเคียง
  • เรียนรู้ว่า CPU ประมวลผลคำแนะนำอย่างไร
    • ท่อทำงานอย่างไร
    • multiscalarหมายถึง อะไร
    • ซีพียูหลักคืออะไร
    • วิธีการทำงานของแคช
    • ทำความเข้าใจเกี่ยวกับวิธีนับรอบ
    • เรียนรู้คำสอนของ Agner Fog
  • ทำความเข้าใจว่าคอมไพเลอร์สร้างรหัสได้อย่างไรและล้มเหลวในบางครั้ง
  • การเพิ่มประสิทธิภาพปัญหาที่กำหนดไว้อย่างดีและเฉพาะเจาะจงมาก

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

ไม่จำเป็นต้องใช้ abstract ที่มีกลิ่นเหม็น
ยกเว้นว่าคุณจะประกอบชิ้นส่วน (และทำให้ซีพียูบนโต๊ะปฏิบัติการ) คุณจะไม่มีเงื้อมมือของ abstractions ของเครื่อง RAM (หรือพระเจ้าห้ามเครื่องทัวริงที่น่ากลัว )

L33t Hax0r 5k1llz
Assembly ยังช่วยให้คุณเข้าใจวิธีที่ 133thax0r จัดการเพื่อเอาชนะแผนการป้องกัน (ถาม: ทำไม ASLR ถึงใช้งานไม่ได้เพราะmov rax,fs:[28h]ทำลายมัน )

The 0.1%
ไม่ใช่ความรู้ของการชุมนุมที่สำคัญ แต่ความรู้เกี่ยวกับเครื่องจักรที่คุณทำงานในเรื่องนั้น
หากคุณต้องการรู้จักเครื่องคุณต้องเข้าใจและนั่นหมายถึงการพูดภาษาของเครื่อง

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

มันก็เหมือนกับการเรียนรู้ที่จะพูดโซซา
ถ้าคุณมีจุดมุ่งหมายเพื่อระดับกูรูติดที่ดีที่สุดกับสิ่งที่คุณรู้ว่าผู้ที่คลิกจะมีความซับซ้อนในชีวิตของคุณ

เพราะว่ามันสนุก.


1
การใช้คำว่า grok บ่อยครั้งที่สุดในบทความที่ฉันเคยพบ
rekciltnuc

-1

ในการนัดพบตัวเองฉันได้เรียนรู้ RPG II โดยใช้ IBM System 32 และต่อมาเรียนรู้ APL ใน 370 ฉันเป็นเรื่องเกี่ยวกับขนาดและความเร็ว มนต์ของฉันเล็กลงและเร็วขึ้น การประกอบเป็นภาษาที่เล็กและรวดเร็วที่สุด ฉันจะทำโปรแกรมทดสอบทั้งใน C และ Assembly ในกรณีที่โปรแกรม C ต้องการ 100 Kb เป็นโปรแกรมแอสเซมบลีที่เทียบเท่ามักจะน้อยกว่า 5 Kb เมื่อศึกษาผลลัพธ์ของคอมไพเลอร์ C ฉันจะพบโค้ดที่จะตรวจสอบและตรวจสอบพารามิเตอร์ทำให้การตรวจสอบตามเงื่อนไขสำหรับข้อผิดพลาดที่เป็นไปได้ซึ่งมักจะหายากและแปลกใหม่และไม่จำเป็นเลยซึ่งทั้งหมดใช้เวลา แต่หน่วยความจำที่ใหญ่ที่สุด ไปและกลับจากสแต็ก

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


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