قائمة التعليمات:
ADD – AND – CALL – CMP – CMPS – IN – IRET – JMP - J[case] – LEA – LDS - LES - LFS – LGS – LSS – LODS – MOV – MOVS – MOVZX - MUL – NOT – OR - OUT - PUSH – POP – REP – RET – SCAS – SHL – SHR – SCAS – STOS – SUB – TEST - XOR
المجالين "}" و "{" يحددان البارامترات. والتي قد تكون سجّلا أو منطقة ذاكرية أو قيمة فورية (Immediacy)، وهي في الغالب عدد.
اللاحقة "[B أو W أو D]" في نهاية التعليمة تحدد أسلوب معالجة التعليمة.
"B" : تعني هذه اللاحقة أن التعليمة من نوع 8 بت (Byte)، وهذا ما يجعل استعمال السجل AL ضروريا.
"W" : تعني هذه اللاحقة أن التعليمة من نوع 16 بت (Word). استعمال السجل AX ضروري.
"D" : تعني هذه اللاحقة أن التعليمة من نوع 32 بت (DWord) . استعمال السجل EAX ضروري.
التعليمة ADD:
ADD {destination},{source} // ADD {الوجهة},{القناع}
تقوم هذه التعليمة بإضافة قيمة المصدر لقيمة الوجهة، وينجم عن هذه العملية تغيير في محتوى الرايات، ويتم تخصيص ناتج الجمع للمعامل الأول.
قد يكون أحد المعاملين سجلا، كما فد يكون المعامل الثاني مرجع ذاكري (متغير أو عنوان ذاكري) أو immediate (رقم مباشر).
add ax, bx // => ax=ax+bx // (reg, reg) كلا المعاملين سجّلا
add ax, 5 // => ax=ax+5 // (reg, imm) المعامل الثني هو عدد مباشر
add ax, var// => ax=ax+var // (reg, mem) المعامل الثني هو مرجع ذاكري add ax, [si] // => ax=ax+[si] // (reg, imm) المعامل الثني هو مرجع ذاكري
التعليمة AND:
AND {destination},{mask} // AND {الوجهة},{القناع}
لتبسيط هذه التعليمة، ووفقا جدول الحقيقة الذي سنطّلع عليه لاحقا، فإن الناتج صحيح (=1)، إذا كان كلا المعاملين صحيح، والناتج يكون خاطئا (=0) إذا كان أحد المعاملين خاطئا أو كلاهما.
وبمفهوم آخر أكثر وضوح، تقوم هذه التعليمة بجعل كل بت في الوجهة مساويا للصفر إذا كان القناع مساويا للصفر، في حين لا تغير بت الوجهة إذا كان القناع مساويا للواحد.
حسب لغات البرمجة المعروفة يمكننا تمثيل ذلك بـ:
Destination := Destination AND Mask ; // بلغة الباسكال
Destination &= Mask ; // بلغة السي
التعليمة CALL:
CALL {address}
تطلب الإجراء (procedure) أو الدالة (function) المتواجد في العنوان المحدد. فإذا سبقت التعليمة CALL عدة تعليمات من نوع PUSH، فهذا يعني أنها مجموعة من البارامترات تم تخزينها في المكدس (Stack). وفي هذه الحالة ، فإن الإجراء يبدأ بــ:
"push [e]bp ; mov [e]bp, [e]sp "
ويمكننا أيضا إيجاد قراءة للبارامترات على شكل:
" mov {Register}, [ebp – {Value}] "
وأخيرا لا يجب نسيان التعليمة "RET [{Value}]" في نهاية الإجراء.
التعليمة CMP:
CMP {a},{b}
تقوم هذه التعليمة بمقارنة المتغير a مع المتغير b. وبعدها نجد مباشرة قفزا مشروطا نحو فرع ذاكري آخر "jmp أو je أو jne ...، بصفة عامة j[case] {Offset}".
التعليمة CMPS:
CMPS [B/D/W]
هذه التعليمة تقارن كل بايت/كلمة/كلمة_مضاعفة من القطاع والفرع الذاكريين DS :ESI مع القطاع والفرع الذاكريين ES :EDI.
التعليمة IN:
IN {destination},{port}
هذه التعليمة تقرأ قيمة ذات 8 بت على المنفذ {port}، وتخزنه في الوجهة {destination}. أما السجل الوحيد المسموح باستعماله في هذه العملية فهو السجل DX.
التعليمة IRET:
IRET {value}
هذه التعليمة تسمح بمغادرة المقاطعة، وتستعمل فقط للبرامج المستقرة في الذاكرة، مثل سائق (driver) الفأرة.
التعليمة JMP:
JMP {offset}
هذه التعليمة تمكن من القفز إلى العنوان الذاكري المحدد بالفرع {offset}.
التعليمة J[case]:
J[case] {offset}
إذا كانت الحالة [case] صحيحة، فإن التعليمة تنفّذ، وينتقل العمل بذلك إلى العنوان المحدد في الفرع {offset}. الحالة [case] هي شرط متعلق بالرايات (flags)، ويتم تنفيذ الشرط وفق قواعد المنطق المعروفة.
الحالات الممكنة لـ case، بعد أخذ " CMP {a},{b}" كمثال:
غير مؤشرة not signed:
JA : يتم القفز إذا كان أكبر، في مثالنا a > b، إذا كانت الراية (الدليل) CF=ZF=0JAE, JNB, JNC : إذا كان أكبر أو يساوي (a>=b)، إذا كان CF = 0
JB, JC : أصغر (a<b)، إذا كان CF=ZF=1
JBE : أصغر أو يساوي (a<=b)، إذا كان CF><OF و ZF=1.
مؤشرة signed:
JG : أكبر (a>b)، إذا كان SF=ZF=0
JGE : أكبر أو يساوي (a>=b)، إذا كان SF = OF
JL : أصغر (a<b)، إذا كان SF <> OF
JLE : أصغر أو يساوي (a<=b)، إذا كان SF<>OF و ZF=1.
متساوية:
JE, JZ : يساوي (a=b)، إذا كان ZF=1.
JNE, JNZ : يختلف عن (a <> b)، إذا كان ZF=0.
التعليمة LEA:
LEA {destination},{source}
يتم هنا كتابة عنوان المصدر {source} في الوجهة {destination}.
هذه التعليمة تكافئ:
MOV {destination},Offset{source}
التعليمة LDS:
LDS {destination},{address}
نسخ عنوان {address} من نوع 32 بت في السجّل DS، (الذي هو قطاعه)، وفي {destination} من نوع 16 بت، (التي هي فرعه).
التعليمة LES:
LES {destination},{address}
نسخ عنوان {address} من نوع 32 بت في السجّل ES، (الذي هو قطاعه)، وفي {destination} من نوع 16 بت، (التي هي فرعه).
التعليمة LFS:
LFS {destination},{address}
نسخ عنوان {address} من نوع 32 بت في السجّل FS، (الذي هو قطاعه)، وفي {destination} من نوع 16 بت، (التي هي فرعه).
التعليمة LGS:
LGS {destination},{address}
نسخ عنوان {address} من نوع 32 بت في السجّل GS، (الذي هو قطاعه)، وفي {destination} من نوع 16 بت، (التي هي فرعه).
التعليمة LSS:
LSS {destination},{address}
نسخ عنوان {address} من نوع 32 بت في السجّل SS، (الذي هو قطاعه)، وفي {destination} من نوع 16 بت، (التي هي فرعه).
التعليمة LODS:
LODS [B/D/W]
نسخ البايت/الكلمة/الكلمة_المضاعفة ES :EDI في السجل AL/AX/EAX.
* التعليمة العكسية لها هي: " STOS [B/D/W]".
التعليمة MOV:
MOV {destination},{source}
يتم هنا نسخ قيمة المصدر {source} في الوجهة {destination}.
التعليمة MOVS:
MOVS [B/D/W]
هذه التعليمة تنسخ البايت/الكلمة/الكلمة_المضاعفة من القطاع والفرع الذاكريين DS :ESI إلى القطاع والفرع الذاكريين ES :EDI.
التعليمة MOVZX:
MOVZX {destination},{source}
تقوم هذه التعليمة بتوسعة العدد الموجود في المصدر، والمشفر على 8 بت، ويتم تحويل الناتج إلى الوجهة بحجم 16 بت أو 32 بت، مثال:
MOVZX ax, al
يقوم هذا المثال بمحو الجزء المرتفع من السجل AX، (أي محو الجزء AH).
التعليمة MUL:
MUL {source}
تحدد هذه التعليمة جداء الوجهة المصرح بها من قبل في المصدر المشار إليه كبارامتر.
العددين (الوجهة والمصدر) يتم اعتبارهما غير مؤشرين (not signed). يمكن استعمال التعليمة JC {address} لتجربة الفائض.
كما يجب الإشارة إلى أن الوجهة يتم استخدامها بدلالة طول المصدر:
8 بت: الوجهة هي AX (العدد المضروب فيه هو AL).
16 بت : الوجهة هي DX :AX، هذا يعني أن AX يحوي الجزء المنخفض و DX يحوي الجزء المرتفع (العدد المضروب فيه هو AX).
32 بت : الوجهة هي EDX :EAX، هذا يعني أن EAX يحوي الجزء المنخفض و EDX يحوي الجزء المرتفع (العدد المضروب فيه هو EAX).
التعليمة NOT:
NOT {destination}
تسمح هذه التعليمة، والتي تعتبر أحادية وليست ثنائية (تحتاج لبارامتر واحد) بقلب بت الوجهة كما يشير إلى ذلك جدول الحقيقة.
التعليمة OR:
OR {destination},{mask}
تطبق هذه التعليمة " أو " منطقيا على الوجهة اعتمادا على القناع، فكل بت من الوجهة سيتم جعله مساويا للواحد إذا كان بت القناع مساويا للواحد، في حين يتم ترك بت الوجهة من دون تغيير إذا ما كان بت القناع معدوما. لاحظ جدول الحقيقة.
Destination := Destination or Mask ; // بلغة الباسكال
Destination |= Mask ; // بلغة السي
التعليمة OUT:
OUT {source},{port}
عكس تعليمة IN، فإن هذه التعليمة تكتب القيمة الموجودة في المصدر {source} (ذات 8 بت) على المنفذ {port}. أما السجل الوحيد المسموح باستعماله في هذه العملية فهو DX.
التعليمة PUSH:
PUSH {value}
تسمح هذه التعليمة بوضع القيمة {value} في المكدس {Stack}.
التعليمة POP:
POP {register}
تقوم هذه التعليمة بإخراج قيمة من المكدس ثم تخزنها في السجل {register}.
التعليمة REP:
REP {instruction}
تقوم REP بتكرار التعليمة {instruction} نون مرة، (حيث نون هو محتوى السجل ECX).
التعليمة RET:
RET {value}
تسمح هذه التعليمة بمغادرة الإجراء الساري.
إذا ما تم إرسال بارامترات إلى CALL، فإن [xxxx] هو عدد البايتات المرسلة الواجب إخراجها من المكدس.
التعليمة SHL:
SHL {register},{value}
تقوم هذه التعليمة بإزاحة ثنائية (binary) على جهة اليسار (L = Left) لمحتوى السجل {register} بمقدار {value} مرة، وبالتالي فإن البتات التي تظهر على اليمين يتم تعويضها بأصفار. مثال:
Mov al, 3;// تخزين القيمة 3 في السجل
Shl al, 2;// إزاحة مرتين لبتات العدد 3
ستكون نتيجة المثال إذن 12، لأن تمثيل 3 في الثنائي هو 00000011، إذن الإزاحة مرتين على اليسار تعطي 00001100، وهو العدد 12.
التعليمة SHR:
SHR {register},{value}
تقوم هذه التعليمة بإزاحة ثنائية (binary) على جهة اليسار (R = Right) لمحتوى السجل {register} بمقدار {value} مرة، وبالتالي فإن البتات التي تظهر على اليسار يتم تعويضها بأصفار. يمكن تطبيق نفس منهاج المثال السابق.
الإزاحة على اليسار تساوي الضرب في 2 نون مرة، والإزاحة على اليمين تساوي القسمة على 2 نون مرة،(حيث نون هو قيمة {value}).
التعليمة STOS:
STOS [B/D/W]
هذه التعليمة تنسخ EAX/AX/AL في البايت/الكلمة/الكلمة_المضاعفة الموجودة في القطاع والفرع الذاكريين ES :EDI (عكس التعليمة LODS).
التعليمة SUB:
SUB {destination},{source} // ADD {الوجهة},{القناع}
وبعكس عملية الجمع، فإن التعليمة sub تقوم بطرح قيمة المصدر من قيمة الوجهة، وينجم عن هذه العملية تغيير في محتوى الرايات، ويتم تخصيص النتيجة للسجل (المعامل الأول).
* تنطبق الخواص نفسها على كل من ADD، MOV و SUB.
التعليمة SCAS:
SCAS [B/D/W]
هذه التعليمة تقارن EAX/AX/AL بالبايت/الكلمة/الكلمة_المضاعفة الموجودة في القطاع والفرع الذاكريين ES :EDI (يمكن القول أنها تبحث عن قيمة في حزمة_رموز (string)).
التعليمة TEST:
TEST {source},{mask}
تقوم هذه التعليمة تسمح باختبار بت خاص للمورد، وتعمل بالمقابل على تغيير الراية JZ، فإذا كان البتات فائضة أم لا.
بأسلوب آخر، تقوم التعليمة TEST {a},{a} إذا ما كان المتغير a معدوما أم لا.
التعليمة XOR:
XOR {destination},{mask}
تطبق هذه التعليمة " أو المانع = eXclusive OR" على الوجهة اعتمادا على القناع، فكل بت من الوجهة سيتم جعله مساويا للواحد إذا كان مخالفا لبت القناع ، ومساويا للصفر إذا كان موافقا لبت القناع. لاحظ جدول الحقيقة.
تقوم التعليمة XOR {a},{a} بجعل قيمة a معدومة، وتمتاز بسرعة أكبر من التعليمة
MOV {a}, 0.
Destination := Destination xor Mask ; // بلغة الباسكال
Destination ^ = Mask ; // بلغة السي
A
B
Not A
A AND B
A OR B
A XOR B
0
0
1
1
0
1
0
1
1
1
0
0
0
0
0
1
0
1
1
1
0
1
1
0
جدول الحقيقة: