Assembly چیست؟ آموزش کامل و جامع زبان اسمبلی
فهرست مطالب
Assembly چیست؟
زبان اسمبلی (Assembly Language) یک زبان برنامهنویسی سطح پایین است که ارتباط مستقیمی با معماری پردازنده دارد. این زبان به برنامهنویسان اجازه میدهد تا با دستورالعملهای مستقیم پردازنده کار کنند.
اسمبلی پلی بین
زبان ماشین
و زبانهای سطح بالا است.
مثال ساده Assembly (x86)
section .data
msg db 'سلام دنیا!',0
section .text
global _start
_start:
mov eax, 4 ; syscall write
mov ebx, 1 ; stdout
mov ecx, msg ; message
mov edx, 13 ; length
int 0x80 ; kernel call
mov eax, 1 ; syscall exit
int 0x80
تاریخچه زبان اسمبلی
زبان اسمبلی در اوایل دهه 1950 میلادی توسعه یافت. قبل از آن، برنامهنویسان مجبور بودند برنامههای خود را مستقیماً به زبان ماشین بنویسند.
اولین اسمبلرها روی کامپیوترهای IBM 704 و IBM 650 استفاده شدند و باعث
انقلابی در برنامهنویسی شدند.
ساختار پایه Assembly
یک برنامه اسمبلی معمولاً از سه بخش اصلی تشکیل شده است:
ساختار اصلی برنامه Assembly
; بخش دادهها
section .data
variable1 db 10 ; تعریف متغیر
string1 db 'Hello', 0
; بخش متغیرهای تعریف نشده
section .bss
buffer resb 64 ; رزرو 64 بایت حافظه
; بخش کد
section .text
global _start ; نقطه شروع برنامه
_start:
; دستورات برنامه
mov eax, 0
; ادامه کد...
هر بخش در اسمبلی کاربرد خاص خود را دارد. بخش data برای دادههای
ثابت، bss برای متغیرهای تعریف نشده و text برای کد برنامه استفاده
میشود.
دستورالعملهای اسمبلی
دستورات انتقال داده
دستورات پایه انتقال داده
mov eax, 42 ; انتقال مقدار مستقیم
mov ebx, eax ; کپی از یک رجیستر به رجیستر دیگر
push eax ; ذخیره در پشته
pop ebx ; برداشتن از پشته
دستورات محاسباتی
دستورات محاسباتی پایه
add eax, 5 ; جمع
sub ebx, 3 ; تفریق
mul ecx ; ضرب
div edx ; تقسیم
رجیسترها و حافظه
رجیسترها حافظههای سریع داخل پردازنده هستند که برای نگهداری دادهها و آدرسها استفاده میشوند.
رجیسترهای عمومی x86
- EAX – رجیستر accumulator برای عملیات محاسباتی
- EBX – رجیستر base برای آدرسدهی حافظه
- ECX – رجیستر counter برای شمارش حلقهها
- EDX – رجیستر data برای عملیات I/O
در معماری x64، این رجیسترها با پیشوند R (مانند RAX، RBX) شناخته
میشوند و 64 بیتی هستند.
سینتکس اسمبلی
سینتکس اسمبلی بسته به نوع اسمبلر (NASM، MASM، GAS) متفاوت است.
مقایسه سینتکسهای مختلف
; NASM سینتکس
section .data
msg db "Hello", 0
; MASM سینتکس
.data
msg BYTE "Hello", 0
; GAS سینتکس
.data
msg: .string "Hello"
انواع داده در اسمبلی
تعریف انواع داده
section .data
byte_var db 42 ; یک بایت
word_var dw 1000 ; دو بایت
dword_var dd 100000 ; چهار بایت
qword_var dq 1000000 ; هشت بایت
string_var db 'متن', 0 ; رشته با پایان صفر
انتخاب نوع داده نامناسب میتواند باعث سرریز (overflow) و خطاهای
منطقی شود.
روشهای آدرسدهی
روشهای اصلی آدرسدهی
مثالهای آدرسدهی
mov eax, 42 ; آدرسدهی مستقیم
mov eax, [var] ; آدرسدهی غیرمستقیم
mov eax, [ebx+4] ; آدرسدهی پایه + جابجایی
mov eax, [ebx+ecx*4] ; آدرسدهی نمایهای
ابزارهای برنامهنویسی اسمبلی
اسمبلرها
- NASM – Netwide Assembler
- MASM – Microsoft Macro Assembler
- GAS – GNU Assembler
دیباگرها
- GDB – GNU Debugger
- OllyDbg
- x64dbg
کاربردهای زبان اسمبلی
زبان اسمبلی در موارد زیر کاربرد دارد:
- برنامهنویسی سیستمی و درایورها
- بهینهسازی کد
- برنامهنویسی سیستمهای نهفته
- مهندسی معکوس و امنیت
امروزه اسمبلی بیشتر در حوزههای تخصصی که نیاز به کنترل دقیق
سختافزار دارند استفاده میشود.
بهترین شیوههای کدنویسی
اصول نوشتن کد تمیز
- استفاده از کامنتهای مناسب
- سازماندهی کد در ماکروها و پروسیجرها
- رعایت قراردادهای نامگذاری
- مستندسازی دقیق کد
مثال کد تمیز
; پروسیجر محاسبه فاکتوریل
factorial:
push ebp
mov ebp, esp ; ذخیرهسازی فریم استک
mov eax, [ebp+8] ; دریافت پارامتر ورودی
cmp eax, 1 ; بررسی شرط پایه
jle factorial_end ; اگر کوچکتر یا مساوی 1 بود
dec eax ; n-1
push eax ; ارسال پارامتر
call factorial ; فراخوانی بازگشتی
factorial_end:
mov esp, ebp ; بازیابی فریم استک
pop ebp
ret
منابع و ابزارها
کتابهای مرجع
- Assembly Language Step by Step – Jeff Duntemann
- Modern X86 Assembly Language Programming – Daniel Kusswurm
- Professional Assembly Language – Richard Blum