عبداللہ امانت محمدی
محفلین
بِسْمِ اللّٰہِ الرَّحْمٰنِ الرّٰحَیْمَ
اسمبلی لینگویج پروگرامنگ (Assembly Language Programming) کمپیوٹر کو سمجھنے کا بہت ہی بنیادی طریقہ ہے ۔ ہائی لیول لینگویج میں کمپیوٹر اور پروگرامر کے درمیان فاصلہ ہوتا ہے جو کمپائلر کے ذریعے کم کیا جاتا ہے ۔ اسمبلی لینگویج میں پروگرامنگ کا مقصد اس درمیانی درجہ کو بائی پاس کر کے کمپیوٹر سے براہ راست بات کرنا ہے ۔ عام طور پر یہ گمان کیا جاتا ہے کہ اسمبلی لینگویج مشکل ہے اور ہر کوئی اسے نہیں سمجھ سکتا جبکہ حقیقت میں بات اس سے بلکل الٹ ہے یعنی اسمبلی لینگویج پروگرامنگ بہت ہی سادہ مضمون ہے ۔
جیسا کہ آپ جانتے ہیں کہ :”پروسیسر اور میموری کمپیوٹر کے بنیادی حصے ہیں”۔ پروسیسر کے اندر سکریچ پیڈ کی طرح کے رجسٹرز ہوتے ہیں جو عام میموری سیلز کی طرح کے ہوتے ہیں ۔ ان کا باقاعدہ مقام ہوتا ہے اور اگر ہم انہیں کوئی معلومات فراہم کریں تو اسے بھی محفوظ کرتے ہیں ۔ رجسٹرز نمبر میں بہت چھوٹے اور کم ہوتے ہیں ۔ کچھ مینوفیکچررز ، رجسٹرز کو اس طرح نمبر دیتے ہیں کہ : ’’ r0, r1, r2 اور کچھ A, B, C, D وغیرہ ‘‘ ۔ اور کچھ مینوفیکچررز ، رجسٹرز کو ان کے فنکشن کے مطابق نام دیتے ہیں ۔ ہر پروسیسر میں ایک مرکزی رجسٹر ہوتا ہے جسے اکومولیٹر ( Accumulator) کہتے ہیں ۔ تمام ریاضی کے متعلق عمل اکومولیٹر پر کیا جاتا ہے ۔ انڈیکس رجسٹر معلومات کا ایڈریسں یاد رکھتا ہے ۔ ہر آرکیٹکچر میں ایک خاص رجسٹر ہوتا ہے جسے فلیگز رجسٹر کہتے ہیں ۔ انسٹرکشن گروپ بھی پروسیسر کو سمجھنے میں آسانی مہیا کرتا ہے ۔ انٹل iAPX88 آرکیٹکچر ( INTEL IAPX88 ARCHITECTURE) چودہ رجسٹرز رکھتا ہے ۔ جن میں سے AX, BX, CX and DX جنرل رجسٹرز کے طور پر کام کرتے ہیں ۔
پروگرام کو ایگزیکیوٹ ایبل بائنری کوڈ میں کنورٹ کرنے کے لیے اسمبلر کی ضرورت ہوتی ہے جو پروگرام کو اسمبل کرتا ہے ۔ ہمیں ورچوئل یونیورسٹی کے کورس”اسمبلی لینگویج پروگرامنگ “ ، میں نیٹ وائیڈ اسمبلر ( Netwide Assembler or NASM.) اور فل سکرین ڈیبگر ( Fullscreen Debugger or AFD) استعمال کرنے کی ہدایت دی گئی ہے جو مفت دستیاب ہے ۔ فرض کریں ہماری ان پٹ فائل کا نام ہے :”AAM.ASM”، ہے تو ہمیں اس فائل کو اسمبل کرنے کے لیے یہ کمانڈ دینی پڑے گی کہ :”nasm aam.asm -o aam.com -l aam.lst”۔ اس سے دو فائلیں بنیں گیں جن میں ایک :”AAM.COM” ، جو ایگزیکیوٹ ایبل فائل ہو گی اور دوسری : “AAM.LST”، جو لسٹنگ فائل ہے ۔
ہم اسمبلی میں اپنی آسانی کے لیے کئی طریقوں سے ایڈریسنگ کر سکتے ہیں ۔ مثلا:”ڈیٹا ڈیکلیئر کر کے ، ڈیرکٹ ایڈریسنگ اور رجسٹر ان ڈیرکٹ ایڈرسینگ ، رجسٹر+ آف سیٹ ایڈریسنگ ، سیگمنٹ اسوسی ایشن اور ایڈریس ریپ آروئنڈ (Wraparound)وغیرہ “۔ ڈیرکٹ ایڈریسنگ میں میموری ایڈریس فِکس ہوتا ہے اور ہدایت (Instruction) میں دیا جاتا ہے جبکہ ان ڈیرکٹ ایڈریسنگ میں ایڈریس رجسٹر میں بھی رکھا جاسکتا ہے اور بدلا بھی جا سکتا ہے ۔ایڈریس ریپ آروئنڈ کی دو قسمیں ہیں ، ایک طرح کا اکیلے سیگمنٹ کے اندر اور دوسرا تمام فیزیکل میموری کے اندر ہوتا ہے ۔ سیگمنٹ ریپ آروئنڈ اس وقت سرزد ہوتا ہے جب ایفیکٹو ایڈریس کیلکولیشن کے دوران کیری جنریٹ ہوتا ہے ۔
فلیگز کی ہر دلچسپ یا بامعنی صورت کےلیے ایک کنڈیشنل جمپ ہوتا ہے ۔ پروگرام میں کئی کنڈیشنز ممکن ہوتی ہیں ۔ مثلاََ :"ایک اوپیرانڈ دوسرے اوپیرانڈ سے بڑا بھی ہو سکتا ہے اور برابر بھی ہوسکتا ہے "۔ مختلف جمپس کی کنڈیشنز یہ ہیں کہ : " جمپ اِف کیری : JC، جمپ اِف بیلو : JB، جمپ اِف ناٹ آبو اور ایکول : JNAE، جمپ اِف ناٹ کیری : JNC، جمپ اِف ناٹ بیلو : JNB، جمپ اِف آبو اور ایکول : JAE، جمپ اِف ایکول : JE، جمپ اِف زیرو : JZ، جمپ اِف ناٹ ایکول : JNE، جمپ اِف آبو : JA، جمپ اِف ناٹ بیلو اور ایکول : JNBE، جمپ اِف ناٹ آبو : JNA، جمپ اِف لیس : JL، جمپ اِف ناٹ گریٹر اور ایکول : JNGE، جمپ اِف ناٹ لیس : JNL، جمپ اِف گریٹر اور ایکول: JGE، جمپ اِف گریٹر : JG، جمپ اِف ناٹ لیس اور ایکول : JNLE، جمپ اِف ناٹ گریٹر : JNG، جمپ اِف لیس اور ایکول : JLE، جمپ اِف اوور فلو : JO، جمپ اِف ناٹ اوور فلو : JNO، جمپ اِف سائن : JS، جمپ اِف ناٹ سائن : JNS، جمپ اِف پرائٹی: JP، جمپ اِف ایون: JPE، جمپ اِف ناٹ پرائٹی : JNP، جمپ اِف اوڈ پرائٹی : JPOاور جمپ اِف سی ایکس اِز زیرو : JCXZ وغیرہ "۔ ایک اور JMPہدایت ہے جو اَن کنڈیشنل جمپ ہے ۔ جمپ تین طرح کے ہوتے ہیں : " نیئر (Near) ، شورٹ (Short)اور فار (Far)جمپ ۔ہم نمبرز کی لسٹ کو اسینڈنگ یا ڈیسینڈنگ آرڈر میں سورٹ کر سکتے ہیں ۔
ضرب دینے کا عمل بڑا عام ہے اور ہم ابتدائی تعلیم یعنی سکول میں ہی اسے سیکھنا شروع کر دیتے ہیں ۔ ہمیں پروگرامنگ میں بھی اس کی ضرورت پڑتی ہے ۔ شیفٹنگ اور روٹیشن کی ہدایات کا سیٹ کسی بھی پروسیسر میں نہایت ہی مفید ہوتا ہے ۔ یہ بہت ہی مشکل کاموں کو بہت ہی صاف اور مختصر ایگورتھم سے آسان بنا دیتا ہے ۔ ہمارے پروسیسر میں جو شیفٹنگ اور روٹیشن ، آپریشن موجود ہیں وہ یہ ہیں کہ : " شیفٹ لوجیکل رائٹ (SHR)، شیفٹ لوجیکل لیفٹ (SHL)/شیفٹ ارتھمیٹک لیفٹ (SAL)، شیفٹ ارتھمیٹک رائٹ (SAR) ، روٹیٹ رائٹ (ROR )، روٹیٹ لیفٹ (ROL) ، روٹیٹ تھرو کیری رائٹ (RCR) اور روٹیٹ تھرو کیری لیفٹ (RCL) ۔ ہم چار بنیادی لوجیکل آپریشنز استعمال کرتے ہیں جو : " اینڈ (AND)، اور (OR)، ایکس اور (XOR)اور ناٹ (NOT)ہیں۔
سٹیک ایسا ڈیٹا سٹرکچر ہے جو فرسٹ ان لاسٹ آوٹ طریقے سے کام کرتا ۔ جب ہم کوئی ایلیمنٹ داخل کرتے ہیں تو وہ دوسرے تمام ایلینٹس کے اوپر بیٹھتا ہے اور جب کوئی ایلیمنٹ نکالا جاتا ہے تو سب سے اوپر والا پہلے نکلتاہے ۔ سٹیک میں کسی ایلیمنٹ کو داخل کرنے کے عمل کو پشّنگ (Pushing)اور نکالنے کے عمل کو پوپّنگ(Popping) کہتے ہیں ۔ہم ڈیبگر کے علاوہ سکرین پر بھی اپنے پروگرام کا ڈسپلے دیکھ سکتے ہیں ۔ ہم الفاظ کو مختلف رنگ اور بیک گراونڈ کلر بھی دے سکتے ہیں اور اپنی مرضی سے سکرین پر جہاں چاہیں الفاظ پرنٹ کر سکتے ہیں۔ اسمبلی میں سٹرنگ انسٹرکشنز بھی بہت اہم کردار ادا کرتی ہے ۔ سٹرنگ انسٹرکشنز ، ڈیٹا کے ایک بلاک پر کام کرتیں ہیں ۔ انسٹرکشنز بلاک کے شروع سے آخراور آخر سے شروع کی طرف کام کر سکتیں ہیں یعنی وہ دونوں سمتوں میں کام کر سکتیں ہیں ۔ (جاری ہے )
اس مضمون کو تیار کرنے کے لیے ورچوئل یونیورسٹی آف پاکستان کی کتاب :" Assembly Language Programming " ، سے مدد لی گئی ہے ۔
By: Abdullah Amanat Muhammadi
اسمبلی لینگویج پروگرامنگ (Assembly Language Programming) کمپیوٹر کو سمجھنے کا بہت ہی بنیادی طریقہ ہے ۔ ہائی لیول لینگویج میں کمپیوٹر اور پروگرامر کے درمیان فاصلہ ہوتا ہے جو کمپائلر کے ذریعے کم کیا جاتا ہے ۔ اسمبلی لینگویج میں پروگرامنگ کا مقصد اس درمیانی درجہ کو بائی پاس کر کے کمپیوٹر سے براہ راست بات کرنا ہے ۔ عام طور پر یہ گمان کیا جاتا ہے کہ اسمبلی لینگویج مشکل ہے اور ہر کوئی اسے نہیں سمجھ سکتا جبکہ حقیقت میں بات اس سے بلکل الٹ ہے یعنی اسمبلی لینگویج پروگرامنگ بہت ہی سادہ مضمون ہے ۔
جیسا کہ آپ جانتے ہیں کہ :”پروسیسر اور میموری کمپیوٹر کے بنیادی حصے ہیں”۔ پروسیسر کے اندر سکریچ پیڈ کی طرح کے رجسٹرز ہوتے ہیں جو عام میموری سیلز کی طرح کے ہوتے ہیں ۔ ان کا باقاعدہ مقام ہوتا ہے اور اگر ہم انہیں کوئی معلومات فراہم کریں تو اسے بھی محفوظ کرتے ہیں ۔ رجسٹرز نمبر میں بہت چھوٹے اور کم ہوتے ہیں ۔ کچھ مینوفیکچررز ، رجسٹرز کو اس طرح نمبر دیتے ہیں کہ : ’’ r0, r1, r2 اور کچھ A, B, C, D وغیرہ ‘‘ ۔ اور کچھ مینوفیکچررز ، رجسٹرز کو ان کے فنکشن کے مطابق نام دیتے ہیں ۔ ہر پروسیسر میں ایک مرکزی رجسٹر ہوتا ہے جسے اکومولیٹر ( Accumulator) کہتے ہیں ۔ تمام ریاضی کے متعلق عمل اکومولیٹر پر کیا جاتا ہے ۔ انڈیکس رجسٹر معلومات کا ایڈریسں یاد رکھتا ہے ۔ ہر آرکیٹکچر میں ایک خاص رجسٹر ہوتا ہے جسے فلیگز رجسٹر کہتے ہیں ۔ انسٹرکشن گروپ بھی پروسیسر کو سمجھنے میں آسانی مہیا کرتا ہے ۔ انٹل iAPX88 آرکیٹکچر ( INTEL IAPX88 ARCHITECTURE) چودہ رجسٹرز رکھتا ہے ۔ جن میں سے AX, BX, CX and DX جنرل رجسٹرز کے طور پر کام کرتے ہیں ۔
پروگرام کو ایگزیکیوٹ ایبل بائنری کوڈ میں کنورٹ کرنے کے لیے اسمبلر کی ضرورت ہوتی ہے جو پروگرام کو اسمبل کرتا ہے ۔ ہمیں ورچوئل یونیورسٹی کے کورس”اسمبلی لینگویج پروگرامنگ “ ، میں نیٹ وائیڈ اسمبلر ( Netwide Assembler or NASM.) اور فل سکرین ڈیبگر ( Fullscreen Debugger or AFD) استعمال کرنے کی ہدایت دی گئی ہے جو مفت دستیاب ہے ۔ فرض کریں ہماری ان پٹ فائل کا نام ہے :”AAM.ASM”، ہے تو ہمیں اس فائل کو اسمبل کرنے کے لیے یہ کمانڈ دینی پڑے گی کہ :”nasm aam.asm -o aam.com -l aam.lst”۔ اس سے دو فائلیں بنیں گیں جن میں ایک :”AAM.COM” ، جو ایگزیکیوٹ ایبل فائل ہو گی اور دوسری : “AAM.LST”، جو لسٹنگ فائل ہے ۔
ہم اسمبلی میں اپنی آسانی کے لیے کئی طریقوں سے ایڈریسنگ کر سکتے ہیں ۔ مثلا:”ڈیٹا ڈیکلیئر کر کے ، ڈیرکٹ ایڈریسنگ اور رجسٹر ان ڈیرکٹ ایڈرسینگ ، رجسٹر+ آف سیٹ ایڈریسنگ ، سیگمنٹ اسوسی ایشن اور ایڈریس ریپ آروئنڈ (Wraparound)وغیرہ “۔ ڈیرکٹ ایڈریسنگ میں میموری ایڈریس فِکس ہوتا ہے اور ہدایت (Instruction) میں دیا جاتا ہے جبکہ ان ڈیرکٹ ایڈریسنگ میں ایڈریس رجسٹر میں بھی رکھا جاسکتا ہے اور بدلا بھی جا سکتا ہے ۔ایڈریس ریپ آروئنڈ کی دو قسمیں ہیں ، ایک طرح کا اکیلے سیگمنٹ کے اندر اور دوسرا تمام فیزیکل میموری کے اندر ہوتا ہے ۔ سیگمنٹ ریپ آروئنڈ اس وقت سرزد ہوتا ہے جب ایفیکٹو ایڈریس کیلکولیشن کے دوران کیری جنریٹ ہوتا ہے ۔
فلیگز کی ہر دلچسپ یا بامعنی صورت کےلیے ایک کنڈیشنل جمپ ہوتا ہے ۔ پروگرام میں کئی کنڈیشنز ممکن ہوتی ہیں ۔ مثلاََ :"ایک اوپیرانڈ دوسرے اوپیرانڈ سے بڑا بھی ہو سکتا ہے اور برابر بھی ہوسکتا ہے "۔ مختلف جمپس کی کنڈیشنز یہ ہیں کہ : " جمپ اِف کیری : JC، جمپ اِف بیلو : JB، جمپ اِف ناٹ آبو اور ایکول : JNAE، جمپ اِف ناٹ کیری : JNC، جمپ اِف ناٹ بیلو : JNB، جمپ اِف آبو اور ایکول : JAE، جمپ اِف ایکول : JE، جمپ اِف زیرو : JZ، جمپ اِف ناٹ ایکول : JNE، جمپ اِف آبو : JA، جمپ اِف ناٹ بیلو اور ایکول : JNBE، جمپ اِف ناٹ آبو : JNA، جمپ اِف لیس : JL، جمپ اِف ناٹ گریٹر اور ایکول : JNGE، جمپ اِف ناٹ لیس : JNL، جمپ اِف گریٹر اور ایکول: JGE، جمپ اِف گریٹر : JG، جمپ اِف ناٹ لیس اور ایکول : JNLE، جمپ اِف ناٹ گریٹر : JNG، جمپ اِف لیس اور ایکول : JLE، جمپ اِف اوور فلو : JO، جمپ اِف ناٹ اوور فلو : JNO، جمپ اِف سائن : JS، جمپ اِف ناٹ سائن : JNS، جمپ اِف پرائٹی: JP، جمپ اِف ایون: JPE، جمپ اِف ناٹ پرائٹی : JNP، جمپ اِف اوڈ پرائٹی : JPOاور جمپ اِف سی ایکس اِز زیرو : JCXZ وغیرہ "۔ ایک اور JMPہدایت ہے جو اَن کنڈیشنل جمپ ہے ۔ جمپ تین طرح کے ہوتے ہیں : " نیئر (Near) ، شورٹ (Short)اور فار (Far)جمپ ۔ہم نمبرز کی لسٹ کو اسینڈنگ یا ڈیسینڈنگ آرڈر میں سورٹ کر سکتے ہیں ۔
ضرب دینے کا عمل بڑا عام ہے اور ہم ابتدائی تعلیم یعنی سکول میں ہی اسے سیکھنا شروع کر دیتے ہیں ۔ ہمیں پروگرامنگ میں بھی اس کی ضرورت پڑتی ہے ۔ شیفٹنگ اور روٹیشن کی ہدایات کا سیٹ کسی بھی پروسیسر میں نہایت ہی مفید ہوتا ہے ۔ یہ بہت ہی مشکل کاموں کو بہت ہی صاف اور مختصر ایگورتھم سے آسان بنا دیتا ہے ۔ ہمارے پروسیسر میں جو شیفٹنگ اور روٹیشن ، آپریشن موجود ہیں وہ یہ ہیں کہ : " شیفٹ لوجیکل رائٹ (SHR)، شیفٹ لوجیکل لیفٹ (SHL)/شیفٹ ارتھمیٹک لیفٹ (SAL)، شیفٹ ارتھمیٹک رائٹ (SAR) ، روٹیٹ رائٹ (ROR )، روٹیٹ لیفٹ (ROL) ، روٹیٹ تھرو کیری رائٹ (RCR) اور روٹیٹ تھرو کیری لیفٹ (RCL) ۔ ہم چار بنیادی لوجیکل آپریشنز استعمال کرتے ہیں جو : " اینڈ (AND)، اور (OR)، ایکس اور (XOR)اور ناٹ (NOT)ہیں۔
سٹیک ایسا ڈیٹا سٹرکچر ہے جو فرسٹ ان لاسٹ آوٹ طریقے سے کام کرتا ۔ جب ہم کوئی ایلیمنٹ داخل کرتے ہیں تو وہ دوسرے تمام ایلینٹس کے اوپر بیٹھتا ہے اور جب کوئی ایلیمنٹ نکالا جاتا ہے تو سب سے اوپر والا پہلے نکلتاہے ۔ سٹیک میں کسی ایلیمنٹ کو داخل کرنے کے عمل کو پشّنگ (Pushing)اور نکالنے کے عمل کو پوپّنگ(Popping) کہتے ہیں ۔ہم ڈیبگر کے علاوہ سکرین پر بھی اپنے پروگرام کا ڈسپلے دیکھ سکتے ہیں ۔ ہم الفاظ کو مختلف رنگ اور بیک گراونڈ کلر بھی دے سکتے ہیں اور اپنی مرضی سے سکرین پر جہاں چاہیں الفاظ پرنٹ کر سکتے ہیں۔ اسمبلی میں سٹرنگ انسٹرکشنز بھی بہت اہم کردار ادا کرتی ہے ۔ سٹرنگ انسٹرکشنز ، ڈیٹا کے ایک بلاک پر کام کرتیں ہیں ۔ انسٹرکشنز بلاک کے شروع سے آخراور آخر سے شروع کی طرف کام کر سکتیں ہیں یعنی وہ دونوں سمتوں میں کام کر سکتیں ہیں ۔ (جاری ہے )
اس مضمون کو تیار کرنے کے لیے ورچوئل یونیورسٹی آف پاکستان کی کتاب :" Assembly Language Programming " ، سے مدد لی گئی ہے ۔
By: Abdullah Amanat Muhammadi