تلميحات

emu8086 مجموعة اكواد أساسية وشرحها في لغة الاسمبلي وتطبيقها بإستخدام المحرر

تعتبر لغة التجميع (Assembly Language) واحدة من اللغات البرمجية منخفضة المستوى، حيث يتم فيها التعامل مع تعليمات الآلة بشكل مباشر. ويعد محرر emu8086 من أكثر المحررات شيوعاً لتعلم لغة التجميع ومعمارية المعالجات القديمة مثل Intel 8086.

الهيكل الأساسي لبرنامج emu8086

يتكون أي برنامج مكتوب بلغة التجميع عادة من عدة أجزاء أساسية، وهي:

  1. قسم البيانات (Data Segment): يحتوي على المتغيرات والثوابت.
  2. قسم الكود (Code Segment): يضم التعليمات البرمجية التي يتم تنفيذها.
  3. قسم المكدس (Stack Segment): يستخدم لتخزين البيانات المؤقتة والعناوين.

أوامر أساسية في لغة التجميع emu8086

1. تحريك البيانات (MOV)

أمر MOV يستخدم لتحريك البيانات من مصدر إلى وجهة، سواء كانت من سجل إلى سجل آخر، أو من الذاكرة إلى سجل، أو العكس.

مثال:

asm
MOV AX, 5 ; تعيين القيمة 5 في السجل AX
MOV BX, AX ; نسخ محتوى AX إلى BX

2. الجمع (ADD) والطرح (SUB)

يتم استخدام الأمر ADD لجمع قيمتين، و SUB لطرح قيمة من أخرى. يمكن أن تكون القيم داخل سجلات أو عناوين.

مثال على الجمع:

MOV AX, 2 ; تعيين 2 في AX
MOV BX, 3 ; تعيين 3 في BX
ADD AX, BX ; جمع BX إلى AX، النتيجة ستكون 5 في AX

مثال على الطرح:

MOV AX, 10 ; تعيين 10 في AX
SUB AX, 4 ; طرح 4 من AX، النتيجة ستكون 6

3. الضرب (MUL) والقسمة (DIV)

يتم تنفيذ الضرب والقسمة باستخدام أوامر MUL و DIV، وتكون العمليات في هذه التعليمات مختلفة عن الجمع والطرح، حيث تأخذ في الاعتبار سجلات معينة.

مثال على الضرب:

MOV AX, 4 ; تعيين 4 في AX
MOV BX, 5 ; تعيين 5 في BX
MUL BX ; ضرب AX في BX، النتيجة تخزن في AX

مثال على القسمة:

MOV AX, 20 ; تعيين 20 في AX
MOV BX, 4 ; تعيين 4 في BX
DIV BX ; قسمة AX على BX، النتيجة تخزن في AX والباقي في DX

4. المقارنة (CMP) والقفز (JMP)

يستخدم الأمر CMP لمقارنة قيمتين، ثم يتم استخدام الأوامر الشرطية للقفز بناءً على النتيجة مثل JE (إذا كانت متساوية) وJNE (إذا لم تكن متساوية).

مثال:

MOV AX, 5
CMP AX, 5
JE equal_label ; إذا كانت AX تساوي 5، القفز إلى equal_label

5. الحلقة (LOOP)

يمكن تكرار جزء من الكود باستخدام أمر LOOP، ويتم ضبط عدد مرات التكرار في السجل CX.

مثال على استخدام حلقة:

MOV CX, 5 ; تعيين عدد التكرارات إلى 5
loop_start:
; الكود المراد تكراره
LOOP loop_start ; تكرار الحلقة حتى يصل CX إلى صفر

التطبيقات العملية لأوامر emu8086

تطبيق بسيط: برنامج يجمع الأعداد من 1 إلى 5

MOV CX, 5 ; عدد التكرارات
MOV AX, 0 ; تهيئة AX كجامع
MOV BX, 1 ; تهيئة BX بالعدد الأول

sum_loop:
ADD AX, BX ; إضافة BX إلى AX
INC BX ; زيادة BX بمقدار 1
LOOP sum_loop ; تكرار العملية

; بعد الانتهاء، يحتوي AX على مجموع الأعداد من 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

 

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!