แอสเซมบลี - ไวยากรณ์พื้นฐาน
โปรแกรมการประกอบสามารถแบ่งออกเป็นสามส่วน -
data มาตรา,
bss ส่วนและ
text มาตรา.
ข้อมูลมาตรา
dataส่วนใช้สำหรับการประกาศข้อมูลเริ่มต้นหรือค่าคงที่ ข้อมูลนี้ไม่เปลี่ยนแปลงขณะรันไทม์ คุณสามารถประกาศค่าคงที่ชื่อไฟล์หรือขนาดบัฟเฟอร์ ฯลฯ ได้ในส่วนนี้
ไวยากรณ์สำหรับการประกาศส่วนข้อมูลคือ -
section.data
bssมาตรา
bssส่วนใช้สำหรับการประกาศตัวแปร ไวยากรณ์สำหรับการประกาศส่วน bss คือ -
section.bss
ข้อความส่วน
textใช้สำหรับเก็บรหัสจริง ส่วนนี้ต้องเริ่มต้นด้วยการประกาศglobal _startซึ่งจะบอกเคอร์เนลที่การเรียกใช้โปรแกรมเริ่มต้นขึ้น
ไวยากรณ์สำหรับการประกาศส่วนข้อความคือ -
section.text
global _start
_start:
ความคิดเห็น
ข้อคิดเห็นภาษาแอสเซมบลีเริ่มต้นด้วยอัฒภาค (;) อาจมีอักขระที่พิมพ์ได้รวมทั้งช่องว่าง มันสามารถปรากฏบนบรรทัดด้วยตัวมันเองเช่น -
; This program displays a message on screen
หรือในบรรทัดเดียวกันพร้อมกับคำสั่งเช่น -
add eax, ebx ; adds ebx to eax
คำสั่งภาษาแอสเซมบลี
โปรแกรมภาษาแอสเซมบลีประกอบด้วยข้อความสามประเภท -
- คำสั่งหรือคำสั่งปฏิบัติการ
- คำสั่ง Assembler หรือ pseudo-ops และ
- Macros.
executable instructions หรือเพียงแค่ instructionsบอกโปรเซสเซอร์ว่าต้องทำอะไร แต่ละคำสั่งประกอบด้วยไฟล์operation code(opcode) คำสั่งปฏิบัติการแต่ละคำสั่งสร้างคำสั่งภาษาเครื่องหนึ่งคำ
assembler directives หรือ pseudo-opsบอกผู้ประกอบเกี่ยวกับแง่มุมต่างๆของกระบวนการประกอบ สิ่งเหล่านี้ไม่สามารถเรียกใช้งานได้และไม่สร้างคำสั่งภาษาเครื่อง
Macros โดยพื้นฐานแล้วเป็นกลไกการแทนที่ข้อความ
ไวยากรณ์ของคำสั่งภาษาแอสเซมบลี
คำสั่งภาษาแอสเซมบลีถูกป้อนหนึ่งคำสั่งต่อบรรทัด แต่ละคำสั่งเป็นไปตามรูปแบบต่อไปนี้ -
[label] mnemonic [operands] [;comment]
ฟิลด์ในวงเล็บเหลี่ยมเป็นทางเลือก คำสั่งพื้นฐานมีสองส่วนส่วนแรกคือชื่อของคำสั่ง (หรือตัวช่วยในการจำ) ซึ่งจะดำเนินการและส่วนที่สองคือตัวถูกดำเนินการหรือพารามิเตอร์ของคำสั่ง
ต่อไปนี้เป็นตัวอย่างคำสั่งภาษาแอสเซมบลีทั่วไป -
INC COUNT ; Increment the memory variable COUNT
MOV TOTAL, 48 ; Transfer the value 48 in the
; memory variable TOTAL
ADD AH, BH ; Add the content of the
; BH register into the AH register
AND MASK1, 128 ; Perform AND operation on the
; variable MASK1 and 128
ADD MARKS, 10 ; Add 10 to the variable MARKS
MOV AL, 10 ; Transfer the value 10 to the AL register
โครงการ Hello World ใน Assembly
รหัสภาษาแอสเซมบลีต่อไปนี้แสดงสตริง 'Hello World' บนหน้าจอ -
section .text
global _start ;must be declared for linker (ld)
_start: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ;string to be printed
len equ $ - msg ;length of the string
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
Hello, world!
การรวบรวมและเชื่อมโยงโปรแกรม Assembly ใน NASM
ตรวจสอบให้แน่ใจว่าคุณได้กำหนดเส้นทางของ nasm และ ldไบนารีในตัวแปรสภาพแวดล้อม PATH ของคุณ ตอนนี้ทำตามขั้นตอนต่อไปนี้เพื่อรวบรวมและเชื่อมโยงโปรแกรมข้างต้น -
พิมพ์โค้ดด้านบนโดยใช้โปรแกรมแก้ไขข้อความและบันทึกเป็น hello.asm
ตรวจสอบให้แน่ใจว่าคุณอยู่ในไดเร็กทอรีเดียวกับที่คุณบันทึกไว้ hello.asm.
ในการประกอบโปรแกรมให้พิมพ์ nasm -f elf hello.asm
หากมีข้อผิดพลาดคุณจะได้รับแจ้งในขั้นตอนนี้ มิฉะนั้นไฟล์อ็อบเจ็กต์ของโปรแกรมของคุณชื่อhello.o จะถูกสร้างขึ้น
หากต้องการเชื่อมโยงไฟล์ออบเจ็กต์และสร้างไฟล์ปฏิบัติการชื่อ hello ให้พิมพ์ ld -m elf_i386 -s -o hello hello.o
ดำเนินการโปรแกรมโดยพิมพ์ ./hello
หากคุณทำทุกอย่างถูกต้องจะแสดงข้อความ 'Hello, world!' บนหน้าจอ.