emu8086 مجموعة اكواد أساسية وشرحها في لغة الاسمبلي وتطبيقها بإستخدام المحرر
تعتبر لغة التجميع (Assembly Language) واحدة من اللغات البرمجية منخفضة المستوى، حيث يتم فيها التعامل مع تعليمات الآلة بشكل مباشر. ويعد محرر emu8086
من أكثر المحررات شيوعاً لتعلم لغة التجميع ومعمارية المعالجات القديمة مثل Intel 8086.
الهيكل الأساسي لبرنامج emu8086
يتكون أي برنامج مكتوب بلغة التجميع عادة من عدة أجزاء أساسية، وهي:
- قسم البيانات (Data Segment): يحتوي على المتغيرات والثوابت.
- قسم الكود (Code Segment): يضم التعليمات البرمجية التي يتم تنفيذها.
- قسم المكدس (Stack Segment): يستخدم لتخزين البيانات المؤقتة والعناوين.
أوامر أساسية في لغة التجميع emu8086
1. تحريك البيانات (MOV)
أمر MOV
يستخدم لتحريك البيانات من مصدر إلى وجهة، سواء كانت من سجل إلى سجل آخر، أو من الذاكرة إلى سجل، أو العكس.
مثال:
2. الجمع (ADD) والطرح (SUB)
يتم استخدام الأمر ADD
لجمع قيمتين، و SUB
لطرح قيمة من أخرى. يمكن أن تكون القيم داخل سجلات أو عناوين.
مثال على الجمع:
مثال على الطرح:
3. الضرب (MUL) والقسمة (DIV)
يتم تنفيذ الضرب والقسمة باستخدام أوامر MUL
و DIV
، وتكون العمليات في هذه التعليمات مختلفة عن الجمع والطرح، حيث تأخذ في الاعتبار سجلات معينة.
مثال على الضرب:
مثال على القسمة:
4. المقارنة (CMP) والقفز (JMP)
يستخدم الأمر CMP
لمقارنة قيمتين، ثم يتم استخدام الأوامر الشرطية للقفز بناءً على النتيجة مثل JE
(إذا كانت متساوية) وJNE
(إذا لم تكن متساوية).
مثال:
5. الحلقة (LOOP)
يمكن تكرار جزء من الكود باستخدام أمر LOOP
، ويتم ضبط عدد مرات التكرار في السجل CX
.
مثال على استخدام حلقة:
التطبيقات العملية لأوامر emu8086
تطبيق بسيط: برنامج يجمع الأعداد من 1 إلى 5
جدول أوامر مهمة أخرى في لغة التجميع
الأمر | الوصف |
---|---|
INC |
زيادة قيمة السجل بمقدار 1 |
DEC |
إنقاص قيمة السجل بمقدار 1 |
NOP |
تنفيذ عملية “لا شيء”، عادة تستخدم كفاصل أو للاختبار |
HLT |
إيقاف المعالج، يستخدم كدلالة على نهاية البرنامج |
استنتاج
هذه مجموعة من كودات البرمجة الاساسية المستخدمة في لغة أسمبلي و بالرغم من أن الجميع يعتقد أن لغة الأسمبيلي هي لغة قديمة و لا إحتياج لها يدرك جميع المحترفين و الخبراء في علم الحاسوب و البرمجة و الألة بأن هذه اللغة هي الأساس و القلب النابض لما يعرف بالحاسوب حيث أنها تعتبر اللغة الاقرب للغة الألة و هي اللغة التي تبنى عليها المترجمات الخاصة بلغات البرمجة الاخرى .
جدول ASCII
: كود مرحبا بالعالم
.model tiny
.code
org 100h
main proc near
mov ah,09h
mov dx,offset message
int 21h
mov ah,4ch
mov al,00
int 21h
endp
message db “Hello World $”
end mai
كود اعادة طباعة حرف مدخل
.data
.code
mov ah, 1h
int 21h
mov dl, al
mov ah, 2h
int 21h
end
كود عرض رقم 2 عن طريق اضافة ما يقابله من جدول ASCII
حيث ان الرمز المقابل ل 50 هو رقم 2
.model small
.data
.code
main proc
mov dl, 50
mov ah, 2h
int 21h
endp
end main
كود جمع رقمين فى Hex و عرض الرمز المقابل له
.model small
.data
.code
main proc
mov dl, 2h
add dl, 30h
mov ah, 2h
int 21h
endp
end main
كود عرض ناتج جمع رقمين
.model small
.data
.code
main proc
mov dl, 2
mov dl ,2
add dl, 48
mov ah, 2h
int 21h
endp
end main
كود عرض ناتج عمليى طرح
.model small
.data
.code
main proc
mov dl, 2
sub dl ,1
add dl, 48
mov ah, 2h
int 21h
endp
end main
تعريف متغير و اعطاءه قيمة
.model small
.data
count1 db 2 ; المتغير
.code
main proc
mov dl, count1
add dl, 48
mov ah, 2h
int 21h
endp
end main
كيفية تخزين قسمة اقل الى مسجل ذو قيمة اكبر
.model small
.data
var1 db 1 ;
.code
main proc
mov ax, 0
add al, var1
endp
end main
زيادة تلقائية بمعدل 1
.model small
.data
.code
main proc
mov dl, 3
inc dl ; الزيادة
add dl, 48
mov ah, 2h
int 21h
endp
انقاص تلقئى للقيمة بمعدل 1
.model small
.data
.code
main proc
mov dl, 3
dec dl ; الانقاص يحدث هنا
add dl, 48
mov ah, 2h
int 21h
endp
end main
مثال على القفز الى نقطة
.model small
.data
.code
main proc
top: ;نقطة العودة
mov dl, 5 ; ادخل الى المسجل
add dl, 48 ; اضافة الى المسجل
mov ah, 2h ; طباعة على اشاشة
int 21h ;
jmp top ; التوجيه الى نقطة العودة
endp
end main
كود جملة دوارة مع التحكم فى عدد المرات
.model small
.data
.code
main proc
mov cx, 5 ; عدد المرات الذى سيفذها الدوران هى خمس مرات
top:
mov dl, 6
add dl, 48
mov ah, 2h
int 21h
loop top ; الدوران و العودة الى top
endp
مثال على الجمل الدوارة المركبة
.model small
.data
.code
main proc
mov cx, 5 ; تحديد عدد مرات الدوران
lop1: ; نقطة بدء الدوران الاول
mov dl, 6
add dl, 48
mov ah, 2h
int 21h
lop2: ; نقطة بدء الدوران الثانى
mov dl, 7
add dl, 48
mov ah, 2h
int 21h
loop lop2 ; الذهاب الى الدوران الثانى
mov cx, 5 ; اعادة تحديد عدد الدوران
loop lop1 ; الذهاب الى الدوران الاول
endp
end main
مثال على Push & pop وظيفة Pop هى الحصول على اخر قيمة تم ادخالها بطريق Push
.model small
.data
.code
main proc
mov ax, 1
push ax
pop cx
mov ah, 2h
int 21h
endp
end main
مثال على popf & pushf
.model small
.data
Veribl dw “Hello”
.code
main proc
pushf
pop Veribl
push Veribl
popf
mov ah, 2h
int 21h
endp
end main
انشاء اجراء و استدعاؤه
.model small
.data
.code
main proc
call myproc
endp
myproc proc
mov dl, 5
add dl, 48
mov ah, 2h
int 21h
ret
myproc endp
end main
مثال على And
.model small
.data
.code
main proc
mov ah, 00000101b
mov bh, 00000001b
and ah, bh
endp
end main
مثال على Or
.model small
.data
.code
main proc
mov ah, 00000100b
mov bh, 00000011b
or ah, bh
endp
end main
مثال على Xor
.model small
.data
.code
main proc
mov ah, 11111111b
mov bh, 11111110b
xor ah, bh
endp
end main
مثال على not
.model small
.data
.code
main proc
mov ah, 01111110b
not ah
endp
مثال على test
.model small
.data
.code
main proc
mov ah, 01111110b
test ah, 01111110b
endp
end main
مثال على المقارنة بين قيمتن ايهما اكبر و معرفة النتيجة من خلال Flag ZF , CF
.model small
.data
.code
main proc
mov ax, 5
cmp ax, 5
Endp
القفز المشروط
المعنى |
الكلمة المختزلة |
القفز إذا كان CF = 1 |
JC |
القفز إذا كان CF = 0 |
JNC |
القفز إذا كان OF = 1 |
JO |
القفز إذا كان OF = 0 |
JNO |
القفز إذا كان SF = 1 |
JS |
القفز إذا كان SF = 0 |
JNS |
القفز إذا كان CX = 0000 |
JCXZ |
القفز في حالة التساوي/أو إذا كان الناتج يساوي الصفر |
JE/JZ |
القفز إذا كان أكبر أو يساوي/القفز إذا لم يكن أصغر |
JGE/JNL |
القفز إذا كان فوق/القفز إذا لم يكن تحت أو يساوي |
JA/JNBE |
القفز إذا كان فوق أو يساوي/القفز إذا لم يكن تحت |
JAE/JNB |
القفز إذا كان تحت/القفز إذا لم يكن فوق أو يساوي |
JB/JNAE |
القفز إذا كان تحت أو يساوي/القفز إذا لم يكن فوق |
JBE/JNA |
القفز إذا كان أكبر/القفز إذا لم يكن أصغر أو يساوي |
JG/JNLE |
القفز إذا كان أصغر أو يساوي/القفز إذا لم يكن أكبر |
JLE/JNG |
القفز إذا لم يكن يساوي/القفز إذا كان الناتج يساوي قيمة غير صفرية |
JNE/JNZ |
القفز إذا كانت خانة Parity غير موجودة/القفز إذا كان PF = 0 |
JNB/JBO |
القفز في حالة وجود خانة Parity/القفز إذا كان PF = 1 |
JP/JPE |
مثال على القفز فى حالة اذا كان Flag = fz عند المقارنة
.model small
.data
.code
main proc
mov ax, 5
cmp ax, 5
jz lp1
mov bx, 1
lp1:
mov bx, 6
Endp
end main
مثال على القفز فى حالة التساوى Je
.model small
.data
.code
main proc
mov ax, 100
cmp ax, 100
je lp1
mov bx, 1
lp1:
mov bx, 6
Endp
end main
مثال على القفز jcxz
.model small
.data
.code
main proc
mov cx, 1
mov ax, 1
sub cx, ax
jcxz lp1
mov bx, 1
lp1:
mov bx, 6
Endp
end main
مثال على القفز Ja
.model small
.data
.code
main proc
mov ax, 11
mov bx, 12
cmp bx, ax
ja lp1
mov bx, 1
lp1:
mov bx, 6
Endp
end main
LOOPZ / LOOPE القفز إلى الحجرة المعرَّفة بواسطة اللافتة القصيرة إذا كان CX لا يساوى الصفر
مثال
.model small
.data
.code
main proc
mov cx, 5
mov bx, 5
lop:
mov dl, 6
add dl, 48
mov ah, 2h
int 21h
cmp bx, 5
loopz lop
Endp
end main
SAL/SHL : إزاحة رياضية/إزاحة منطقية و كلاهما نحو اليسار
مثال
.model small
.data
.code
main proc
mov ax, 1
shl ax, 1
Endp
end main
SAR/SHR : إزاحة رياضية/إزاحة منطقية و كلاهما نحو اليمين
مثال
.model small
.data
.code
main proc
mov ax, 1
shr ax, 2
Endp
end main
MUL : ضرب بدن إشارة , DIV : تقسيم بدون إشارة
.model small
.data
.code
main proc
mov al, 5h
mov bl, 2h
mul bl
Endp
end main
مثال على Div
.model small
.data
.code
main proc
mov ax, 0080h
mov bl, 2
div bl
Endp
end main
مثال بسيط على الرسم
name “vga”
; this program draws a tiny rectangle in vga mode.
org 100h
jmp code
; dimensions of the rectangle:
; width: 10 pixels
; height: 5 pixels
w equ 10
h equ 5
; set video mode 13h – 320×200
code: mov ah, 0
mov al, 13h
int 10h
; draw upper line:
mov cx, 100+w ; column
mov dx, 20 ; row
mov al, 15 ; white
u1: mov ah, 0ch ; put pixel
int 10h
dec cx
cmp cx, 100
jae u1
; draw bottom line:
mov cx, 100+w ; column
mov dx, 20+h ; row
mov al, 15 ; white
u2: mov ah, 0ch ; put pixel
int 10h
dec cx
cmp cx, 100
ja u2
; draw left line:
mov cx, 100 ; column
mov dx, 20+h ; row
mov al, 15 ; white
u3: mov ah, 0ch ; put pixel
int 10h
dec dx
cmp dx, 20
ja u3
; draw right line:
mov cx, 100+w ; column
mov dx, 20+h ; row
mov al, 15 ; white
u4: mov ah, 0ch ; put pixel
int 10h
dec dx
cmp dx, 20
ja u4
; pause the screen for dos compatibility:
;wait for keypress
mov ah,00
int 16h
; return to text mode:
mov ah,00
mov al,03 ;text mode 3
int 10h
ret
مرحبا بالعالم بكود اصغر
org 100h
jmp start
msg: db “Hello, World!”, 0Dh,0Ah, 24h
start: mov dx, msg
mov ah, 09h
int 21h
mov ah, 0
int 16h
ret