การประกอบ - ค่าคงที่
NASM มีคำสั่งหลายอย่างที่กำหนดค่าคงที่ เราได้ใช้คำสั่ง EQU ในบทก่อนหน้าแล้ว เราจะพูดถึงคำสั่งสามข้อโดยเฉพาะ -
- EQU
- %assign
- %define
คำสั่ง EQU
EQUคำสั่งใช้สำหรับกำหนดค่าคงที่ ไวยากรณ์ของคำสั่ง EQU มีดังนี้ -
CONSTANT_NAME EQU expression
ตัวอย่างเช่น,
TOTAL_STUDENTS equ 50
จากนั้นคุณสามารถใช้ค่าคงที่นี้ในโค้ดของคุณเช่น -
mov ecx, TOTAL_STUDENTS
cmp eax, TOTAL_STUDENTS
ตัวถูกดำเนินการของคำสั่ง EQU สามารถเป็นนิพจน์ -
LENGTH equ 20
WIDTH equ 10
AREA equ length * width
ส่วนโค้ดด้านบนจะกำหนด AREA เป็น 200
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงให้เห็นถึงการใช้คำสั่ง EQU -
SYS_EXIT equ 1
SYS_WRITE equ 4
STDIN equ 0
STDOUT equ 1
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg1
mov edx, len1
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg2
mov edx, len2
int 0x80
mov eax, SYS_WRITE
mov ebx, STDOUT
mov ecx, msg3
mov edx, len3
int 0x80
mov eax,SYS_EXIT ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg1 db 'Hello, programmers!',0xA,0xD
len1 equ $ - msg1
msg2 db 'Welcome to the world of,', 0xA,0xD
len2 equ $ - msg2
msg3 db 'Linux assembly programming! '
len3 equ $- msg3
เมื่อโค้ดด้านบนถูกคอมไพล์และเรียกใช้งานจะให้ผลลัพธ์ดังนี้ -
Hello, programmers!
Welcome to the world of,
Linux assembly programming!
% กำหนดคำสั่ง
%assignคำสั่งสามารถใช้เพื่อกำหนดค่าคงที่เป็นตัวเลขเช่นคำสั่ง EQU คำสั่งนี้อนุญาตให้กำหนดนิยามใหม่ ตัวอย่างเช่นคุณอาจกำหนด TOTAL คงที่เป็น -
%assign TOTAL 10
ต่อมาในโค้ดคุณสามารถกำหนดใหม่เป็น -
%assign TOTAL 20
คำสั่งนี้คำนึงถึงตัวพิมพ์เล็กและใหญ่
% กำหนด Directive
%defineคำสั่งอนุญาตให้กำหนดค่าคงที่ทั้งตัวเลขและสตริง คำสั่งนี้คล้ายกับ #define ใน C ตัวอย่างเช่นคุณอาจกำหนดค่าคงที่ PTR เป็น -
%define PTR [EBP+4]
รหัสด้านบนแทนที่PTRด้วย [EBP + 4]
คำสั่งนี้ยังช่วยให้สามารถกำหนดนิยามใหม่ได้และต้องคำนึงถึงขนาดตัวพิมพ์