แอสเซมบลี - ไวยากรณ์พื้นฐาน

โปรแกรมการประกอบสามารถแบ่งออกเป็นสามส่วน -

  • 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!' บนหน้าจอ.