หนังสือเรียนเล่มนี้ให้ข้อมูลเบื้องต้นเกี่ยวกับการเขียนโปรแกรมภาษาแอสเซมบลีอย่างอ่อนโยน สิ่งที่ทำให้การแนะนำนี้ "อ่อนโยน" คือ ถือว่าผู้อ่านคุ้นเคยกับการเขียนโค้ด C หรือ C++ อยู่แล้ว เราใช้ความรู้ที่สันนิษฐานนี้เพื่อ เชื่อมโยง ย้อนกลับไปยัง ISA ระดับต่ำ (สถาปัตยกรรมชุดคำสั่ง)
เราขับรถกลับบ้านด้วยจุดที่คมชัดมาก:
ภาษาแอสเซมบลีไม่มีอะไรต้องกลัว!ตามที่กล่าวไว้ หากคุณคุ้นเคยกับ C อยู่แล้ว (หรือภาษาที่สืบทอดมาจาก C เช่น C++) หนังสือเล่มนี้จะเริ่มต้นด้วยสิ่งที่คุณรู้อยู่แล้ว
บทต่อๆ มาจะเจาะลึกยิ่งขึ้นในมุมและส่วนเว้าของ ARM V8 ISA และเหมาะสำหรับผู้ที่ต้องการเชี่ยวชาญชุดคำสั่งที่หลากหลายของโปรเซสเซอร์ ARM 64 บิต
ใช่อย่างแน่นอน
การเขียนโปรแกรมภาษาแอสเซมบลีค่อนข้างขึ้นอยู่กับสถาปัตยกรรมฮาร์ดแวร์พื้นฐานอย่างใกล้ชิด สภาพแวดล้อมการทำงานของโฮสต์มีบทบาทเกินขนาดในการกำหนดวิธีสร้างโปรแกรมภาษาแอสเซมบลี "แบบแผนการเรียก" หมายถึงวิธีการเรียกใช้ฟังก์ชันและวิธีการส่งผ่านพารามิเตอร์
เดิมทีหนังสือเล่มนี้สอนเฉพาะแบบแผน ARM LINUX เท่านั้น อย่างไรก็ตาม เมื่อเวลาผ่านไป เราได้พัฒนาชุดมาโครที่ช่วยให้เขียนโค้ดสำหรับใช้งานบน MacOS หรือ LINUX ได้ง่ายขึ้นมาก
ลิงก์นี้จะนำไปสู่สำเนาปัจจุบันรวมถึงเอกสารประกอบ รวมมาโครที่ทำให้การเขียนโปรแกรมง่ายขึ้นเล็กน้อยด้วย
บทนี้ให้ข้อมูลเพิ่มเติมเกี่ยวกับการเขียนโปรแกรมภาษาแอสเซมบลีของ Apple Silicon
คุณจะสังเกตได้ว่าเราใช้ C-runtime โดยตรงแทนที่จะทำการเรียกระบบปฏิบัติการ ตัวอย่างเช่น หากเราต้องการเรียก write()
เราก็เรียก write
จากภาษาแอสเซมบลี
write
การเรียกของระบบเวอร์ชันนี้เป็นฟังก์ชัน wrapper ที่สร้างไว้ใน C-runtime (CRT) ซึ่งจัดการรายละเอียดระดับล่างของการดำเนินการเรียกของระบบ ดูสิ่งที่เกิดขึ้นจริงภายในฟังก์ชันตัวห่อเหล่านี้ได้ที่นี่
ประโยชน์ของการใช้ตัวห่อ CRT คือ มีความแตกต่างระหว่างการแจกแจงและสถาปัตยกรรมที่ถูกปกปิดโดยใช้ตัวห่อ CRT ดังนั้น เมื่อคุณใช้ wrapper แทนที่จะใช้วิธีโดยตรงในการเรียกระบบ โค้ดของคุณก็จะพกพาสะดวกมากขึ้น
ที่น่ายกย่องพอๆ กับการออกแบบ ARM แบบแผนการตั้งชื่อของ ARM สำหรับทรัพย์สินทางปัญญานั้นช่างน่ากลัว ในหนังสือเล่มนี้ AARCH64 และ ARM V8 ถือเป็นคำพ้องสำหรับสถาปัตยกรรมชุดคำสั่ง ARM 64 บิต (ISA)
เป็นเรื่องยากมากที่จะค้นหาเอกสารที่ไซต์ ARM เนื่องจากมี หลายเวอร์ชัน มีชื่อมากมายสำหรับสิ่งเดียวกัน และมีเอกสารทั่วไปมากมาย มันอาจทำให้เสียสติได้จริงๆ
ภายในข้อความเราจะจัดเตรียมลิงก์ที่ครบถ้วนตามความเหมาะสม
นี่คือลิงค์ไปยังหน้าชุดคำสั่งหลัก "a"
การได้รับเครื่องมือสำหรับการพัฒนาภาษาแอสเซมบลีนั้นค่อนข้างตรงไปตรงมา - บางทีคุณอาจมีอยู่แล้ว ใช้ apt
จากเทอร์มินัล Linux พูดว่า:
sudo apt update
sudo apt install build-essential gdb
บนประเภท Macintosh:
xcode-select --install
เข้าไปในอาคารผู้โดยสารแล้วปฏิบัติตามคำแนะนำ โปรดทราบว่า gdb
จะถูกแทนที่ด้วย lldb
ซึ่งมีความแตกต่างเพียงพอที่จะทำให้คุณร้องไห้ได้
ถ้าอย่างนั้นคุณจะต้องมีโปรแกรมแก้ไขที่คุณชื่นชอบ ตัวเราเองใช้ vi
เพื่อแก้ไขอย่างรวดเร็วและใช้ Visual Studio Code สำหรับการยกของหนัก
เราใช้ gcc
ซึ่งเป็น "คอมไพเลอร์" C สามารถใช้ g++
ได้ บน Mac สามารถใช้ clang
ได้
มันให้ความรู้สึกอะไร... การใช้ "คอมไพเลอร์" เพื่อ "คอมไพล์" ภาษาแอสเซมบลี
เพื่อที่จะตอบว่าเราต้องเข้าใจว่าคำว่า "คอมไพเลอร์" หมายถึงเพียงขั้นตอนเดียวในลำดับการสร้าง สิ่งที่เราพูดถึงในฐานะ "คอมไพเลอร์" จริงๆ แล้วคือร่มที่ประกอบด้วย:
ตัวประมวลผลล่วงหน้าที่ดำเนินการกับ #
คำสั่งตัวประมวลผลล่วงหน้า เช่น #include
คำสั่งเหล่านี้ไม่ได้เป็นส่วนหนึ่งของ C หรือ C++ แต่เป็นคำสั่งของพรีโปรเซสเซอร์
โปรดทราบว่า gcc
จะเรียกใช้ตัวประมวลผลล่วงหน้า C หากไฟล์ภาษาแอสเซมบลีของคุณลงท้ายด้วย .S
S - ตัวพิมพ์ใหญ่ S มันอาจจะหรืออาจจะไม่ถูกเรียกใช้หากไฟล์ของคุณลงท้ายด้วยตัวพิมพ์เล็ก s หรือนามสกุลไฟล์อื่น ๆ ขึ้นอยู่กับระบบของคุณ
คอมไพเลอร์ ที่แท้จริง ซึ่งมีหน้าที่เปลี่ยนภาษาระดับสูงเช่น C และ C++ ให้เป็นภาษาแอสเซมบลี
แอสเซมเบลอร์ซึ่งเปลี่ยนภาษาแอสเซมบลีเป็นรหัสเครื่องซึ่งยังไม่พร้อมสำหรับการดำเนินการ
และสุดท้ายคือตัวเชื่อมโยงซึ่งรวมไฟล์รหัสเครื่องระดับกลางหลายไฟล์ (เรียกว่าไฟล์อ็อบเจ็กต์) ไฟล์ไลบรารีจำนวนมาก (ไฟล์ .dll ที่เชื่อมโยงแบบคงที่บน Windows และไฟล์ .a บน Linux) ตัวเชื่อมโยงเป็นขั้นตอนสุดท้ายในห่วงโซ่นี้
นี่คือวิดีโอที่อธิบายกระบวนการนี้
เราใช้ gcc และ g++ โดยตรง เนื่องจากในฐานะที่เป็นร่ม พวกมันจึงทำตามขั้นตอนข้างต้นโดยอัตโนมัติและเชื่อมโยงกับ CRT โดยอัตโนมัติ
สมมติว่าคุณได้ใช้งาน main()
ในไฟล์ C (main.c) และต้องการใช้ไฟล์ภาษาแอสเซมบลีที่คุณเขียน (asm.S) สามารถทำได้หลายวิธี
gcc main.c asm.S
นั่นคือทั้งหมดที่คุณต้องการสำหรับโครงสร้างขั้นต่ำ โปรแกรมผลลัพธ์จะถูกเขียนไปที่ a.out
ไฟล์ระดับกลางทั้งหมดที่สร้างขึ้นจะถูกลบออก
gcc -c main.c
gcc -c asm.S
gcc main.o asm.o
ใช้ในลักษณะนี้ ไฟล์ .o
จะเหลืออยู่บนดิสก์ เมื่อใช้วิธีการก่อนหน้านี้ ไฟล์ .o
จะถูกลบออกโดยที่คุณไม่เห็นไฟล์เหล่านั้น
สมมติว่า main()
ถูกใช้งานในภาษาแอสเซมบลีและ main.s
มีอยู่ในตัวเอง จากนั้นเพียง:
gcc main.S
บ่อยครั้ง คุณจะต้องเปิดใช้งานดีบักเกอร์ gdb
หรือ lldb
ทำสิ่งนี้:
gcc -g main.S
หากไม่มีตัวเลือกบรรทัดคำสั่ง -g
ดีบักเกอร์ของคุณอาจทำงานไม่ถูกต้อง
หากต้องการทำซ้ำ หากคุณต้องการให้ gcc
รันโค้ดของคุณผ่านตัวประมวลผลล่วงหน้า C (เช่น การส่ง #include
เป็นต้น) ตั้งชื่อไฟล์ซอร์สโค้ดภาษาแอสเซมบลีของคุณด้วยตัวพิมพ์ใหญ่ S ดังนั้นบน Linux:
gcc main.s
จะไม่ผ่านโปรเซสเซอร์ซีล่วงหน้าแต่
gcc main.S
จะ.
หากต้องการขับรถกลับบ้านโดยที่ "คอมไพเลอร์" เป็นร่ม การใช้ gcc เพื่อ "คอมไพล์" โปรแกรมจะทำให้สิ่งต่อไปนี้ถูกเรียกบน Ubuntu ที่ทำงานบน ARM:
/usr/bin/cpp
/usr/lib/gcc/aarch64-linux-gnu/11/cc1
/usr/bin/as
/usr/lib/gcc/aarch64-linux-gnu/11/collect2 which is...
/usr/bin/ld
cpp
เป็นตัวประมวลผลล่วงหน้าของ C - เป็นเครื่องมือทั่วไปที่ภาษาอื่นสามารถใช้ได้เช่นกัน (เช่น C ++)
cc1
เป็นคอมไพเลอร์จริง
as
ผู้ประกอบ
ld
คือตัวเชื่อมโยง
คุณสามารถดูได้ว่าเหตุใดเราจึงใช้คำสั่งร่มเป็นค่าเริ่มต้นในหนังสือเล่มนี้
เราเริ่มต้นด้วยการให้สิ่งที่เราเรียกว่า "การเชื่อมโยง" จาก C และ C++ ไปจนถึงภาษาแอสเซมบลี เราใช้ความรู้ที่คุณมีอยู่แล้วเพื่อเรียนรู้ความรู้ใหม่ - ช่างเจ๋งจริงๆ!
บท | มาร์กดาวน์ | |
---|---|---|
0 | คิกสตาร์ท | ลิงค์ |
1 | สวัสดีชาวโลก | ลิงค์ |
2 | ถ้างบ | ลิงค์ |
3 | ลูป | |
3ก | ในขณะที่ลูป | ลิงค์ |
3บี | สำหรับลูป | ลิงค์ |
3ค | การดำเนินการ ดำเนินการต่อ | ลิงค์ |
3d | การดำเนินการแบ่ง | ลิงค์ |
4 | สลับฉาก | |
4ก | ลงทะเบียน | ลิงค์ |
4ข | โหลดและจัดเก็บ | ลิงค์ |
4c | ข้อมูลเพิ่มเติมเกี่ยวกับ ldr | ลิงค์ |
4วัน | ลงทะเบียนขนาด | ลิงค์ |
4จ | เลขฐานสิบหก | ลิงค์ |
5 | switch | ลิงค์ |
6 | ฟังก์ชั่น | |
6ก | การโทรและการกลับมา | ลิงค์ |
6ข | การส่งผ่านพารามิเตอร์ | ลิงค์ |
6c | ตัวอย่างการเรียกใช้ฟังก์ชันรันไทม์ C ทั่วไป | ลิงค์ |
7 | FizzBuzz - โปรแกรมที่สมบูรณ์ | ลิงค์ |
8 | โครงสร้าง | |
8ก | การจัดตำแหน่ง | ลิงค์ |
8ข | การกำหนด | ลิงค์ |
8c | โดยใช้ | ลิงค์ |
8วัน | "สิ่งนี้" คืออะไร | ลิงค์ |
9 | const | ลิงค์ |
การดำเนินการจุดลอยตัวใช้คำสั่งของตนเองและชุดรีจิสเตอร์ของตนเอง ดังนั้นการดำเนินการจุดลอยตัวจึงครอบคลุมอยู่ในส่วนของตนเอง:
บท | มาร์กดาวน์ | |
---|---|---|
0 | ภาพรวมบท | ลิงค์ |
1 | ตัวเลขทศนิยมคืออะไร? | ลิงค์ |
2 | ลงทะเบียน | ลิงค์ |
3 | การตัดทอนและการปัดเศษ | ลิงค์ |
4 | ตัวอักษร | ลิงค์ |
5 | fmov | ลิงค์ |
6 | ทศนิยมแบบ Half Precision | ลิงค์ |
7 | NEON SIMD ยังไม่ได้เขียน | ลิงค์ |
หนังสือเกี่ยวกับภาษาแอสเซมบลีจะเป็นอย่างไรโดยไม่ต้องทุบตีเล็กน้อย?
บท | มาร์กดาวน์ | |
---|---|---|
1 | ฟิลด์บิต | |
1ก | ไม่มีฟิลด์บิต | ลิงค์ |
1ข | ด้วยฟิลด์บิต | ลิงค์ |
1ค | การทบทวนคำแนะนำที่อธิบายใหม่ | ลิงค์ |
2 | ความเอนเดียนเนส | ลิงค์ |
ในส่วนนี้ เรานำเสนอเนื้อหาเบ็ดเตล็ด รวมถึง "การบรรยายที่มีชื่อเสียงระดับโลก" เกี่ยวกับการดีบัก การบรรยายครั้งนี้ได้รับเชิญจากวิทยาลัยและมหาวิทยาลัยหลายแห่ง มีไว้สำหรับผู้ฟังที่ทำงานกับภาษาต่างๆ เช่น C, C++ และภาษาแอสเซมบลี แต่บทเรียนบางส่วนที่มีอยู่ในนั้นสามารถใช้ได้กับทุกภาษา
บท | มาร์กดาวน์ | |
---|---|---|
1 | แอปเปิ้ลซิลิคอน | ลิงค์ |
2 | การบรรจบกันของ Apple / Linux | ลิงค์ |
3 | ฟังก์ชันแปรผัน | ลิงค์ |
4 | เบื้องหลัง: การโทรของระบบ | ลิงค์ |
5 | การกำหนดความยาวตัวอักษรสตริงสำหรับฟังก์ชัน C | ลิงค์ |
6 | การเรียกภาษาแอสเซมบลีจาก Python | ลิงค์ |
7 | ปฏิบัติการปรมาณู | ลิงค์ |
8 | ตารางกระโดด | ลิงค์ |
9 | หาเรื่อง | รหัส ASM |
10 | หมุนล็อค | ลิงค์ |
- | การบรรยายการแก้ไขจุดบกพร่อง | PPTX |
ตามที่ระบุไว้ข้างต้น คุณสามารถดูชุดแมโครได้ที่นี่
ต่อไปนี้เป็นข้อกำหนดเฉพาะของโครงการที่จะเสนอความท้าทายให้กับความเชี่ยวชาญที่เพิ่มขึ้นของคุณ ต่อไปนี้เป็นคำอธิบายสั้น ๆ ตามลำดับตัวอักษร
บางทีก่อนที่คุณจะจัดการกับสิ่งเหล่านี้ ลองดูโปรแกรม FIZZBUZZ ที่อธิบายไว้อย่างละเอียดก่อน
จากนั้นลองสิ่งนี้เป็นโครงการแรกของคุณ ด้วยบรรทัดว่างและความคิดเห็นบางบรรทัดจึงมีน้ำหนักอยู่ที่ 35 บรรทัด
โครงการ DIRENT สาธิตวิธีการใช้ struct
ที่ซับซ้อนในภาษาแอสเซมบลี
โครงการ PI สาธิตคำสั่งจุดลอยตัว โปรแกรมจะ "ขว้างปาเป้าไปที่เป้าหมาย" โดยคำนวณค่า PI ประมาณโดยการติดตามจำนวนลูกดอกที่ "เข้าเป้า" เทียบกับจำนวนลูกดอกทั้งหมดที่ "ขว้าง"
โครงการ SINE เน้นคณิตศาสตร์และฟังก์ชันทศนิยม
โครงการ SNOW ใช้เทคโนโลยีในยุคปี 1970 เพื่อสร้างระบบอนุภาคแบบง่ายๆ ให้เคลื่อนไหวได้ โปรเจ็กต์นี้แสดงให้เห็นถึงกระบวนการออกแบบที่สมเหตุสมผลในการแบ่งปัญหาที่ซับซ้อนออกเป็นส่วนที่เรียบง่าย
WALKIES นำเสนอแอนิเมชั่นตัวน้อยน่ารักที่สาธิตการวนซ้ำพร้อมการตัดการอ้างอิงพอยน์เตอร์บางตัว
อาชีพของ Perry Kivolowitz ในสาขาวิทยาศาสตร์คอมพิวเตอร์มีระยะเวลาไม่ถึงห้าทศวรรษ เขาก่อตั้งบริษัทมากกว่า 5 แห่ง ซึ่งส่วนใหญ่เกี่ยวข้องกับฮาร์ดแวร์ การประมวลผลภาพ และเอฟเฟ็กต์ภาพ (สำหรับภาพยนตร์และโทรทัศน์) เพอร์รีได้รับรางวัลเอ็มมีจากผลงานของเขาในรายการ The Gathering ซึ่งเป็นตอนนำร่องของ Babylon 5 ต่อมาเขาได้รับรางวัลเอ็มมีสาขาวิศวกรรมร่วมกับเพื่อนร่วมงานของเขาที่ SilhouetteFX, LLC SilhouetteFX ใช้ในภาพเคลื่อนไหวที่สำคัญเกือบทุกเรื่องสำหรับการหมุนภาพ การลงสี การติดตาม การสร้างใหม่จาก 2D เป็น 3D การประกอบภาพ และอื่นๆ อีกมากมาย
ในปี 1996 เพอร์รีได้รับรางวัลออสการ์สาขาความสำเร็จทางวิทยาศาสตร์และทางเทคนิคจากการประดิษฐ์ Shape Driven Warping and Morphing นี่เป็นเทคนิคที่รับผิดชอบต่อเอฟเฟกต์อันโด่งดังมากมายใน Forrest Gump, Titanic และ Stargate
ยี่สิบสามปีถือเป็นปีที่ 19 ของเพอร์รีที่สอนวิทยาการคอมพิวเตอร์ในระดับวิทยาลัย สิบปีที่ UW Madison และตอนนี้ 8+ ที่วิทยาลัยคาร์เธจ
ภาษาแอสเซมบลีคือความหลงใหลใน Perry ที่ได้ทำงานใน ISA ต่อไปนี้ (ตามลำดับเวลา):
ยูนิแวค 1100
บริษัท อุปกรณ์ดิจิทัล PDP-11
บริษัท อุปกรณ์ดิจิทัล VAX-11
โมโตโรล่า 68000
ARM ขึ้นต้นด้วย AARCH64
งานนี้อุทิศให้กับซาราภรรยาของฉันและเอียนและอีวานลูกชายของฉัน
เพอร์รีได้สร้างไลบรารีโปรเจ็กต์การเขียนโปรแกรมประมาณ 200 โปรเจ็กต์ที่เหมาะสำหรับคลาส CS 1, CS 2, โครงสร้างข้อมูล, ระบบเครือข่าย, ระบบปฏิบัติการ และองค์กรคอมพิวเตอร์ หากผู้จัดพิมพ์หนังสือเรียน CS (หรือเนื้อหาที่เกี่ยวข้องกับ CS อื่นๆ) สนใจซื้อห้องสมุด โปรดติดต่อ
นอกจากนี้ ลองอ่าน Get Off My L@wn นวนิยายซอมบี้สำหรับผู้เขียนโค้ด
คุณอ่านถูกแล้ว... โปรแกรมเมอร์หัวกะทิ Doug Handsman เกษียณจากภรรยาของเขา Ruth Ann ซึ่งอาศัยอยู่ทางตอนเหนือของรัฐวิสคอนซิน แล้ววันสิ้นโลกก็เกิดขึ้น คนเกียจคร้าน
ให้คะแนน 4.3 จาก 5 พร้อมบทวิจารณ์มากกว่า 70 รายการ เป็นการอ่านที่สนุกและไม่มีค่าใช้จ่ายใดๆ เลย