آموزش صفر تا صد اسمبلی با 12 درس رایگان (فیلم+PDF)

بعد از حدود ۱ هفته گشت و گذار در اینترنت و از بین هزاران ویدیو، یک مجموعه بی نقص و کامل ویدیویی را برای یادگیری سریع برنامه نویسی اسمبلی گلچین کرده ایم. این مجموعه کامل برای شروع از صفر و برای همه سطوح مناسب می باشد. بعد از آن نیز بهترین جزوه PDF فارسی موجود در اینترنت را جهت تکمیل یادگیری می توانید دانلود کنید.
۱-مفاهیم و نکات اولیه (یادگیری این توضیحات، نصف راه هست)
Assembly یا زبان اسمبلی یک زبان برنامهنویسی سطح پایین است که به دستورهای واقعی پردازنده بسیار نزدیک است. در زبانهایی مانند پایتون یا سی شارپ مینویسیم:
result = a + bاما در اسمبلی معمولاً باید مشخص کنیم داده از کجا خوانده شود، در کدام رجیستر قرار بگیرد، چه عملی روی آن انجام شود و نتیجه کجا ذخیره شود. بنابراین اسمبلی فقط یک زبان دیگر برای برنامهنویسی نیست؛ بلکه یکی از بهترین راهها برای فهمیدن این موضوع است که کامپیوتر در سطح پردازنده چگونه برنامه را اجرا میکند.
مسیر مناسب یادگیری برای یک مبتدی:
Binary و Hex → CPU → Register → Memory → Instruction → Stack → Compare/Jump → Loop → Function → Calling Convention → Debugging
اگر این زنجیره را خوب بفهمید، تا حد زیادی با منطق اسمبلی آشنا شدهاید.
زبان اسمبلی دقیقاً چیست؟
پردازنده مستقیماً زبان اسمبلی را نمیفهمد. CPU در نهایت مجموعهای از صفر و یکها یا Machine Code را اجرا میکند. مثلاً یک دستور اسمبلی ممکن است چنین باشد:
mov eax, 5Assembler این دستور را به Machine Code متناظر تبدیل میکند. پس سه مفهوم را از هم جدا کنید:
- Assembly Language زبانی که برنامهنویس مینویسد.
- Assembler برنامهای که Assembly را به Machine Code تبدیل میکند.
- Machine Code دستورهای باینری که CPU واقعاً اجرا میکند.
ابزارهایی مانند NASM و MASM نمونههایی از Assembler هستند.
اسمبلی یک زبان واحد نیست
این نکته بسیار مهم است. Assembler وابسته به معماری پردازنده است. مثلاً:
- x86
- x86-64
- ARM
- RISC-V
هر معماری Registerها و Instructionهای مخصوص خودش را دارد. حتی برای x86 نیز Syntaxهای متفاوتی مانند Intel Syntax و AT&T Syntax وجود دارند.
برای یک مبتدی بهتر است ابتدا فقط یک معماری و Syntax را انتخاب کند. یک انتخاب مناسب x86-64 + Intel Syntax است.
CPU را بشناسید
CPU یا پردازنده دستورهای برنامه را اجرا میکند. بهصورت بسیار ساده:
دستور را دریافت میکند → Decode میکند → اجرا میکند → سراغ دستور بعدی میرود
پردازنده بخشهایی مانند:
- Registers
- ALU
- Control Unit
- Cache
دارد. برای برنامهنویس اسمبلی، Registerها اهمیت بسیار زیادی دارند.
Register چیست؟
Register حافظه بسیار کوچک و بسیار سریعی داخل CPU است. پردازنده معمولاً عملیات اصلی را روی Registerها انجام میدهد. در معماری x86-64 با Registerهایی مانند اینها مواجه میشوید:
RAX
RBX
RCX
RDX
RSI
RDI
RSP
RBP
R8
R9
...
R15مثلاً:
mov rax, 10
mov rbx, 20
add rax, rbxابتدا:
RAX = 10
و:
RBX = 20
سپس بعد از add:
RAX = 30
میشود. در اسمبلی باید بدانید اطلاعات در کدام Register قرار دارد.
اندازه رجیسترها
در x86-64 یک Register را میتوان با اندازههای مختلف مشاهده کرد. مثلاً خانواده RAX:
RAX 64 bit
EAX 32 bit
AX 16 bit
AL 8 bitبنابراین:
mov rax, 100با:
mov eax, 100کاملاً یکسان نیست. یکی از مهمترین مهارتهای اسمبلی شناخت اندازه دادههاست:
- Byte = 8 bits
- Word = 16 bits
- Double Word = 32 bits
- Quad Word = 64 bits
Binary را در حد کاربردی یاد بگیرید
Assembly ارتباط نزدیکی با نمایش دودویی دارد. مثلاً:
Decimal 10
Binary 1010لازم نیست تبدیل اعداد بسیار بزرگ را ذهنی انجام دهید، اما باید مفهوم Bit را بفهمید. هر Bit فقط میتواند:
0
یا:
1
باشد. Bitها در اسمبلی برای:
- Flagها
- ماسکها
- شیفت
- عملیات منطقی
- کنترل سختافزار
اهمیت زیادی دارند.
Hexadecimal چرا مهم است؟
برنامهنویسان سطح پایین زیاد از مبنای 16 یا Hexadecimal استفاده میکنند. مثلاً:
Decimal: 255
Hex: FFاعداد Hex معمولاً با چیزی مانند:
0xFFنمایش داده میشوند. Hex برای نمایش:
- آدرس حافظه
- Machine Code
- Bit Mask
- مقادیر Register
بسیار مناسبتر از Binary طولانی است. پس قبل از اسمبلی، تبدیل ساده بین Decimal، Binary و Hex را تمرین کنید.
دستور MOV
یکی از پرکاربردترین Instructionها MOV است. مثلاً:
mov rax, 10یعنی مقدار 10 را داخل RAX قرار بده. یا:
mov rbx, raxیعنی مقدار RAX را در RBX کپی کن.
نکته مهم: mov معمولاً منبع را حذف نمیکند. یعنی بعد از:
mov rbx, raxهر دو Register میتوانند همان مقدار را داشته باشند.
عملیات ریاضی
چند دستور ساده:
add rax, rbx
sub rax, rbx
inc rax
dec raxADD جمع.
SUB تفریق.
INC یک واحد افزایش.
DEC یک واحد کاهش.
مثلاً:
mov rax, 20
sub rax, 5نتیجه:
RAX = 15ضرب و تقسیم کمی پیچیدهتر هستند و بسته به معماری و اندازه Operand میتوانند از Registerهای مشخصی استفاده کنند.
برای شروع ابتدا MOV، ADD و SUB را کاملاً یاد بگیرید.
Operand چیست؟
در دستورadd rax, rbx
rax و rbx را Operand میگوییم.
Instruction همان add است. در Intel Syntax معمولاً شکل کلی دستور چنین است:
Instruction Destination, Sourceمثلاً:
mov rax, 20یعنی 20 را در مقصد یعنی RAX قرار بده.
حافظه RAM و آدرس
تمام دادهها داخل Register جا نمیشوند. بخش بزرگی از اطلاعات در RAM قرار دارد. هر قسمت حافظه دارای یک Address یا آدرس است. مثلاً فرض کنید دادهای در آدرس:
0x1000قرار داشته باشد. پردازنده میتواند با استفاده از آدرس به آن دسترسی پیدا کند. در اسمبلی تفاوت میان خود مقدار و آدرس مقدار بسیار مهم است. این مفهوم بعداً در Pointerهای زبان C نیز اهمیت زیادی دارد.
Dereference چیست؟
فرض کنید Register دارای یک Address باشد. ممکن است:
RAX = 0x1000باشد. این یعنی RAX خودش شاید عدد موردنظر ما را نگه نمیدارد؛ بلکه آدرس محل قرارگیری عدد را نگه میدارد. وقتی میخواهیم مقدار موجود در آن آدرس را بخوانیم، در Intel Syntax معمولاً از:
mov rbx, [rax]استفاده میکنیم. براکت:
[ ]یعنی به حافظهای که این آدرس نشان میدهد مراجعه کن. این یکی از مهمترین مفاهیم سطح پایین است.
Stack چیست؟
Stack یا پشته بخش بسیار مهمی از حافظه است. رفتار آن معمولاً به روش Last In, First Out است. یعنی آخرین چیزی که وارد شده، اولین چیزی است که خارج میشود. مانند قرار دادن بشقابها روی یکدیگر. اگر:
A
B
Cرا به ترتیب روی Stack قرار دهیم، ابتدا C خارج میشود. در اسمبلی با دستورهایی مانند:
push rax
pop raxمواجه میشوید. PUSH مقدار را روی Stack قرار میدهد. POP آخرین مقدار را از Stack برمیدارد.
RSP چیست؟
در x86-64 Register:
RSP
یا Stack Pointer، محل فعلی بالای Stack را نشان میدهد. به همین دلیل نباید بدون دلیل مقدار RSP را تغییر دهید.
اشتباه در Stack Pointer میتواند باعث خراب شدن اجرای Functionها یا Crash برنامه شود. در سطح مقدماتی فقط این نکته را خوب بفهمید:
Stack برای نگهداری موقت اطلاعات و مدیریت Function Callها بسیار مهم است.
Flag Register چیست؟
پردازنده علاوه بر Registerهای معمول، وضعیت برخی عملیات را در Flagها نگهداری میکند. Flagهای معروف Zero Flag آیا نتیجه صفر شده است؟
Carry Flag آیا Carry رخ داده است؟
Sign Flag نتیجه منفی است؟
Overflow Flag آیا Overflow عدد علامتدار رخ داده است؟
این Flagها مخصوصاً برای شرطها اهمیت دارند.
CMP چیست؟
در زبان سطح بالا ممکن است بنویسیم:
if a == bدر اسمبلی معمولاً از CMP استفاده میشود. مثلاً:
cmp rax, rbxاین دستور نتیجه را معمولاً در RAX ذخیره نمیکند؛ بلکه Flagهای پردازنده را براساس مقایسه تغییر میدهد. بعد از آن از Jump استفاده میکنیم.
Jump چیست؟
اجرای CPU معمولاً دستوربهدستور جلو میرود. Jump مسیر اجرا را تغییر میدهد. مثلاً:
jmp targetیعنی مستقیماً به Label به نام target برو. Jumpهای شرطی نیز داریم:
JE Jump if Equal
JNE Jump if Not Equal
JG Jump if Greater
JL Jump if Lessمثلاً:
cmp rax, rbx
je equalاگر دو مقدار برابر باشند، برنامه به Label به نام equal میرود.
if در اسمبلی چگونه ساخته میشود؟
مثلاً منطق:
if x == 10
result = 1
else
result = 0میتواند مفهومی شبیه این داشته باشد:
cmp rax, 10
je is_equal
mov rbx, 0
jmp done
is_equal:
mov rbx, 1
done:میبینید که ساختار if در اصل از Compare + Conditional Jump ساخته میشود. این موضوع کمک میکند بهتر بفهمید زبانهای سطح بالا پشت صحنه چگونه اجرا میشوند.
Loop چگونه ساخته میشود؟
فرض کنید میخواهیم پنج بار کاری را انجام دهیم.
mov rcx, 5
loop_start:
; دستورات
dec rcx
cmp rcx, 0
jne loop_startمنطق آن:
- RCX برابر 5 است.
- دستورات اجرا میشوند.
- RCX یک واحد کم میشود.
- اگر هنوز صفر نشده، به ابتدای حلقه برگرد.
بنابراین حلقه نیز اساساً با Label + Compare + Jump ساخته میشود.
Function در اسمبلی
Function یا Procedure مجموعهای از دستورات قابل استفاده مجدد است. در x86 با دستورهایی مانند:
call my_functionو:
retمواجه میشوید.CALL به Function میرود و اطلاعات لازم برای بازگشت را ذخیره میکند. RET به محل قبلی برنامه برمیگردد. اما برای درک واقعی Functionها باید مفهوم Calling Convention را نیز یاد بگیرید.
Calling Convention چیست؟
وقتی Function صدا زده میشود باید مشخص باشد:
- ورودیها کجا قرار بگیرند؟
- نتیجه کجا برگردد؟
- چه Registerهایی باید حفظ شوند؟
- Stack چگونه مدیریت شود؟
این قوانین Calling Convention نام دارند. مثلاً در سیستمهای مختلف x86-64 ممکن است آرگومانهای Function در Registerهای متفاوتی قرار بگیرند. به همین دلیل Assembly نوشتهشده برای Windows و Linux ممکن است در بخش Function Callها متفاوت باشد. این موضوع را بعد از اصول اولیه جدیتر یاد بگیرید.
Syscall چیست؟
برنامه اسمبلی نمیتواند هر کاری را مستقیماً انجام دهد. مثلاً برای:
- نوشتن روی صفحه
- خواندن فایل
- ایجاد Process
معمولاً باید از خدمات سیستمعامل استفاده کند. ارتباط سطح پایین با Kernel میتواند از طریق System Call انجام شود. به همین دلیل برنامه اسمبلی سادهای که متن Hello World چاپ میکند، معمولاً از نمونه مشابه در Python بسیار طولانیتر است.
بخش Data و Code
برنامههای اسمبلی معمولاً قسمتهایی برای داده و کد دارند. مثلاً در NASM ممکن است ساختاری شبیه این ببینید:
section .data
message db "Hello", 0
section .text
global _start
_start:
; code.data
برای دادههای مقداردهیشده.
.text
برای دستورهای اجرایی برنامه. ممکن است بخشهای دیگری نیز وجود داشته باشند. در شروع فقط مفهوم جدایی داده و دستور را درک کنید.
Little Endian چیست؟
موضوع مهم دیگری که در سطح پایین میبینید Endianness است. پردازندههای x86 از Little Endian استفاده میکنند. یعنی هنگام ذخیره اعداد چندبایتی در حافظه، کمارزشترین Byte در آدرس پایینتر قرار میگیرد. مثلاً اگر عددی مانند:
0x12345678در حافظه قرار گیرد، ترتیب Byteها ممکن است به شکل:
78 56 34 12دیده شود. این موضوع هنگام Debugging حافظه بسیار مهم است.
Signed و Unsigned
همان Bitها میتوانند به روشهای مختلف تفسیر شوند. مثلاً یک مقدار 8 بیتی ممکن است Unsigned از 0 تا 255 باشد. یا Signed تقریباً از -128 تا 127. در اعداد Signed معمولاً از نمایش Two's Complement استفاده میشود.
برای همین دستورهای مقایسه Signed و Unsigned در اسمبلی میتوانند متفاوت باشند. این موضوع در ابتدا کمی دشوار است، اما بسیار مهم است.
Bitwise Operations
Assembly ارتباط زیادی با عملیات Bitwise دارد. دستورهایی مانند:
AND
OR
XOR
NOT
SHL
SHRبرای کار مستقیم با Bitها استفاده میشوند. مثلاً:
xor rax, raxیک روش معروف برای صفر کردن RAX است. عملیات Bitwise در:
- سیستمهای Embedded
- Driverها
- رمزنگاری
- Flagها
- بهینهسازی
- پردازش سختافزار
زیاد دیده میشوند.
Debugger مهمتر از حفظ دستورهاست
یادگیری Assembly فقط با خواندن کد بسیار دشوار است. باید برنامه را Step by Step اجرا کنید. Debugger به شما اجازه میدهد:
- Registerها را مشاهده کنید
- Memory را ببینید
- Breakpoint بگذارید
- Instructionها را تکتک اجرا کنید
- Stack را بررسی کنید
ابزارهایی مانند GDB و Debuggerهای محیطهای توسعه برای این کار استفاده میشوند. بهترین روش یادگیری اسمبلی این است که بعد از هر Instruction ببینید دقیقاً چه چیزی در CPU تغییر کرده است.
Assembly و C ارتباط بسیار خوبی دارند
اگر هدف شما یادگیری عمیق Assembly است، زبان C همراه بسیار خوبی است. مثلاً برنامه ساده C:
int add(int a, int b)
{
return a + b;
}را Compile کنید و Assembly تولیدشده را بررسی کنید. این کار نشان میدهد:
- Variable چگونه مدیریت میشود
- Function Call چگونه انجام میشود
- Loop چگونه تبدیل میشود
- if چگونه به Jump تبدیل میشود
برای همین ترکیب C + Assembly یکی از بهترین روشهای یادگیری معماری کامپیوتر است.
۲-موارد آموزش داده شده در این پکیج رایگان
- اسمبلی چیست؟
- کاربردها و مبانی اصلی اسمبلی
- دستورهای SUB و MUL و DIV
- دستورهای AND ,OR ,XOR
- دستورهای SHL و SHR, ROR, ROL, RCR, RCL
- دستور CMP
- پیاده سازی IF و SWITCH
- پیاده سازی FOR و WHILE
- و …
۳- نمونه آموزش
۴-دانلود آموزش رایگان
حجم: ۹۸۰ مگابایت
سطح: از صفر تا صد
نسخه آموزش داده شده: مناسب برای همه نسخه های برنامه
![]()
به دنبال یادگیری سریع تر، حرفه ای تر، کامل تر و با کیفیت فول اچ دی هستید؟
اسمبلی امروز بعد از ورود هوش مصنوعی کجا استفاده میشود؟
امروزه بیشتر نرمافزارهای عادی کاملاً با Assembly نوشته نمیشوند. Assembly بیشتر در بخشهایی مانند:
- سیستمعامل
- Kernel
- Embedded Systems
- Firmware
- Bootloader
- Driver
- Reverse Engineering
- Cybersecurity
- Compiler
- High-performance Code
- Debugging سطح پایین
اهمیت دارد. بنابراین اگر هدف شما طراحی سایت یا اپلیکیشن تجاری معمولی است، Assembly زبان اصلی کارتان نخواهد بود. اما برای درک عمیق کامپیوتر بسیار ارزشمند است.
اشتباهات رایج مبتدیان
از این موارد دوری کنید:
- حفظ Instructionها بدون فهم CPU
- شروع با برنامههای بزرگ
- بیتوجهی به اندازه داده
- اشتباه گرفتن Address با Value
- خراب کردن Stack Pointer
- بیتوجهی به Calling Convention
- یادگیری همزمان ARM و x86
- شروع مستقیم Reverse Engineering بدون مبانی
- کپی کردن کد اسمبلی بدون Step کردن آن
- نخواندن Registerها در Debugger
در Assembly باید دائماً از خود بپرسید الان هر Register چه مقداری دارد؟ Stack چه وضعیتی دارد؟ Instruction بعدی کدام است؟
پروژههای مناسب برای شروع
پروژه اولدو عدد را در Register قرار دهید و جمع، تفریق و ضرب را تمرین کنید.
پروژه دوم دو عدد را مقایسه کنید و بزرگتر را انتخاب کنید. مفاهیم: CMP + Jump
پروژه سوم اعداد 1 تا 10 را با Loop پردازش کنید. مفاهیم: Counter + Label + Jump
پروژه چهارم یک Function ساده برای جمع دو عدد بنویسید. مفاهیم: CALL + RET + Register + Stack
پروژه پنجم یک برنامه کوچک C بنویسید و Assembly تولیدشده توسط Compiler را تحلیل کنید.
این تمرین یکی از بهترین راهها برای رفتن از سطح مبتدی به متوسط است.
مسیر پیشنهادی یادگیری اسمبلی
بهتر است با این ترتیب جلو بروید:
مرحله ۱ Binary، Hex و Bit.
مرحله ۲ CPU، Memory و Register.
مرحله ۳ x86-64 و Intel Syntax.
مرحله ۴ MOV، ADD، SUB و Operandها.
مرحله ۵ Memory Addressing و Pointer.
مرحله ۶ CMP، Flag و Jump.
مرحله ۷ Loop.
مرحله ۸ Stack، PUSH و POP.
مرحله ۹ CALL، RET و Function.
مرحله ۱۰ Calling Convention.
مرحله ۱۱ System Calls.
مرحله ۱۲ Debugger و Disassembly.
بعد از این مرحله میتوانید وارد مباحث پیشرفتهتر مانند:
Reverse Engineering، SIMD، SSE/AVX، Operating Systems، Exploit Development، Embedded Programming و Compiler Design
شوید.
جمعبندی
برای یادگیری Assembly از صفر، هدف اصلی نباید حفظ صدها Instruction باشد. ابتدا باید بفهمید پردازنده چگونه برنامه را اجرا میکند. هسته اصلی اسمبلی را میتوان چنین خلاصه کرد:
CPU → Register → Memory → Instruction → Flag → Jump → Stack → Function → System Call
اگر بتوانید برنامهای کوچک را Instruction به Instruction دنبال کنید و توضیح دهید هر دستور چه تغییری در Register، Memory یا Flagها ایجاد کرده است، بخش بزرگی از پایه Assembly را یاد گرفتهاید.
مهمترین تفاوت Assembly با زبانهای سطح بالا این است که بسیاری از جزئیاتی که Python، C# یا Java از شما پنهان میکنند، اینجا مستقیماً دیده میشوند.
به همین دلیل Assembly ممکن است در ابتدا سختتر باشد، اما بعد از یادگیری آن مفاهیمی مانند Pointer، Stack، Function Call، Memory، Compiler و سیستمعامل برایتان بسیار ملموستر میشوند.
برای شروع عملی، ترکیب x86-64 + Intel Syntax + NASM + Debugger + کمی زبان C مسیر بسیار مناسبی است.

سلام - زبان آموزش هم pdf و هم ویدئو ها فارسیه؟
پاسخسلام وقت بخیر
پاسخبرای ادامه کار توی شرکت توسعه سخت افزار در لندن موظفمون کردن که اسمبلی فول باید باشیم ینی فوق العاده خواهان داره اینور. این ویدیوهای رایگانتون رو مرور کردم اما در حد شوخی بیشتر 😊 😊 دوره حرفه ای فروشگاه تون که تعریفش شنیده بودم خرید زدم، تازه فهمیدم اسمبلی ینی چییییی. اونم توی یک ماه شدم منتور اسمبلی توی شرکت با 30 درصد حقوق بالاتر.... فقط می تونم بگم هزاربار ممنون
با سلام
پاسخوقدردانی از فایلهای رایگان اسمبلی و سایر موارد
جزوات ،
اموزش های کلیدی خوبی هستند . در سایر کشورها هزینه این مسایل زیاد است
با تشکر فراوان . پ.م ۱۹ ابان ۱۴۰۴
باسلام
پاسخمیخواستم بدونم این دوره اسمبلی همین ۹ قسمت هستش؟