"সি তে একটি এসেমব্লার লিখুন" উচ্চ স্তরের ভাষায় নিম্ন স্তরের ভাষার জন্য একটি মেশিন কোড অনুবাদক কেন লিখছেন?


13

আমার মাইক্রোপ্রসেসর শ্রেণির প্রশিক্ষক আমাদের একটি কার্যভার দিয়েছেন এবং বলেছিলেন:

"সি তে একটি এসেমব্লার লিখুন" - আমার প্রিয় অধ্যাপক

তাই এটি আমার কাছে কিছুটা অযৌক্তিক মনে হয়েছিল।

আমি যদি ভুল না করি তবে মেশিন কোড থেকে উচ্চ স্তরের ভাষাগুলির যাত্রার প্রথম পদক্ষেপ হল অ্যাসেম্বলি ভাষা। আমি বলতে চাই সি সমাবেশের চেয়ে উচ্চ স্তরের ভাষা higher সুতরাং সি তে একটি এসেমব্লার লেখার লাভ কী? সি ভাষার অনুপস্থিতিতে তারা অতীতে কী করছিল? তারা কি মেশিন কোডে এসেমব্লার লিখছেন?

উচ্চ স্তরের ভাষায় নিম্ন স্তরের ভাষার জন্য একটি মেশিন কোড অনুবাদক লিখতে আমার কোনও অর্থ হয় না।

ধরা যাক আমরা একটি নতুন ব্র্যান্ডের মাইক্রোপ্রসেসরের আর্কিটেকচার তৈরি করেছি যে সেই আর্কিটেকচারের জন্য কোনও সি সংকলকও নেই। সিটিতে লেখা আমাদের এসেমব্লার কি নতুন আর্কিটেকচারের অনুকরণ করতে পারবে? মানে এটা কি অকেজো হবে নাকি?

যাইহোক আমি জানি যে জিএনইউ এসেম্ব্লার এবং নেটওয়াইড অ্যাসেমব্লার সিতে লেখা হয়েছে? আমিও ভাবছি যে সেগুলিতে কেন লেখা হয়?

শেষ অবধি এটি আমাদের সাধারণ অধ্যাপক আমাদের দিয়েছেন এমন এক সাধারণ সমাবেশকারীর উদাহরণের কোড:

// to compile, gcc assembler.c -o assembler
// No error check is provided.
// Variable names cannot start with 0-9.
// hexadecimals are twos complement.
// first address of the code section is zero, data section follows the code section.
//fout tables are formed: jump table, ldi table, label table and variable table.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


//Converts a hexadecimal string to integer.
int hex2int( char* hex)  
{
    int result=0;

    while ((*hex)!='\0')
    {
        if (('0'<=(*hex))&&((*hex)<='9'))
            result = result*16 + (*hex) -'0';
        else if (('a'<=(*hex))&&((*hex)<='f'))
            result = result*16 + (*hex) -'a'+10;
        else if (('A'<=(*hex))&&((*hex)<='F'))
            result = result*16 + (*hex) -'A'+10; 
        hex++;
    }
    return(result);
}


main()
{   
    FILE *fp;
        char line[100];
        char *token = NULL;
    char *op1, *op2, *op3, *label;
    char ch;
    int  chch;

    int program[1000];
    int counter=0;  //holds the address of the machine code instruction




// A label is a symbol which mark a location in a program. In the example 
// program above, the string "lpp", "loop" and "lp1" are labels.
    struct label  
    {
        int location;
        char *label;
    };
    struct label labeltable[50]; //there can be 50 labels at most in our programs
    int nooflabels = 0; //number of labels encountered during assembly.




// Jump instructions cannot be assembled readily because we may not know the value of 
// the label when we encountered a jump instruction. This happens if the label used by
// that jump instruction appear below that jump instruction. This is the situation 
// with the label "loop" in the example program above. Hence, the location of jump 
// instructions must be stored.
    struct jumpinstruction   
    {
        int location;
        char *label;
    };
    struct jumpinstruction jumptable[100]; //There can be at most 100 jumps
    int noofjumps=0;  //number of jumps encountered during assembly.    




// The list of variables in .data section and their locations.
    struct variable
    {
        int location;
        char *name;
    };
    struct variable variabletable[50]; //There can be 50 varables at most.
    int noofvariables = 0;




//Variables and labels are used by ldi instructions.
//The memory for the variables are traditionally allocated at the end of the code section.
//Hence their addresses are not known when we assemble a ldi instruction. Also, the value of 
//a label may not be known when we encounter a ldi instruction which uses that label.
//Hence, the location of the ldi instructions must be kept, and these instructions must be 
//modified when we discover the address of the label or variable that it uses.
    struct ldiinstruction   
    {
        int location;
        char *name;
    };
    struct ldiinstruction lditable[100];
    int noofldis=0;




    fp = fopen("name_of_program","r");

    if (fp != NULL)
    {
        while(fgets(line,sizeof line,fp)!= NULL)  //skip till .code section
        {
            token=strtok(line,"\n\t\r ");
            if (strcmp(token,".code")==0 )
                break;
        } 
        while(fgets(line,sizeof line,fp)!= NULL)
        {
            token=strtok(line,"\n\t\r ");  //get the instruction mnemonic or label

//========================================   FIRST PASS  ======================================================
            while (token)
            {
                if (strcmp(token,"ldi")==0)        //---------------LDI INSTRUCTION--------------------
                {
                    op1 = strtok(NULL,"\n\t\r ");                                //get the 1st operand of ldi, which is the register that ldi loads
                    op2 = strtok(NULL,"\n\t\r ");                                //get the 2nd operand of ldi, which is the data that is to be loaded
                    program[counter]=0x1000+hex2int(op1);                        //generate the first 16-bit of the ldi instruction
                    counter++;                                                   //move to the second 16-bit of the ldi instruction
                    if ((op2[0]=='0')&&(op2[1]=='x'))                            //if the 2nd operand is twos complement hexadecimal
                        program[counter]=hex2int(op2+2)&0xffff;              //convert it to integer and form the second 16-bit 
                    else if ((  (op2[0])=='-') || ((op2[0]>='0')&&(op2[0]<='9')))       //if the 2nd operand is decimal 
                        program[counter]=atoi(op2)&0xffff;                         //convert it to integer and form the second 16-bit 
                    else                                                           //if the second operand is not decimal or hexadecimal, it is a laber or a variable.
                    {                                                               //in this case, the 2nd 16-bits of the ldi instruction cannot be generated.
                        lditable[noofldis].location = counter;                 //record the location of this 2nd 16-bit  
                        op1=(char*)malloc(sizeof(op2));                         //and the name of the label/variable that it must contain
                        strcpy(op1,op2);                                        //in the lditable array.
                        lditable[noofldis].name = op1;
                        noofldis++;                                             
                    }       
                    counter++;                                                     //skip to the next memory location 
                }                                       

                else if (strcmp(token,"ld")==0)      //------------LD INSTRUCTION---------------------         
                {
                    op1 = strtok(NULL,"\n\t\r ");                //get the 1st operand of ld, which is the destination register
                    op2 = strtok(NULL,"\n\t\r ");                //get the 2nd operand of ld, which is the source register
                    ch = (op1[0]-48)| ((op2[0]-48) << 3);        //form bits 11-0 of machine code. 48 is ASCII value of '0'
                    program[counter]=0x2000+((ch)&0x00ff);       //form the instruction and write it to memory
                    counter++;                                   //skip to the next empty location in memory
                }
                else if (strcmp(token,"st")==0) //-------------ST INSTRUCTION--------------------
                {
                    //to be added
                }
                else if (strcmp(token,"jz")==0) //------------- CONDITIONAL JUMP ------------------
                {
                    //to be added
                }
                else if (strcmp(token,"jmp")==0)  //-------------- JUMP -----------------------------
                {
                    op1 = strtok(NULL,"\n\t\r ");           //read the label
                    jumptable[noofjumps].location = counter;    //write the jz instruction's location into the jumptable 
                    op2=(char*)malloc(sizeof(op1));         //allocate space for the label                  
                    strcpy(op2,op1);                //copy the label into the allocated space
                    jumptable[noofjumps].label=op2;         //point to the label from the jumptable
                    noofjumps++;                    //skip to the next empty location in jumptable
                    program[counter]=0x5000;            //write the incomplete instruction (just opcode) to memory
                    counter++;                  //skip to the next empty location in memory.
                }               
                else if (strcmp(token,"add")==0) //----------------- ADD -------------------------------
                {
                    op1 = strtok(NULL,"\n\t\r ");    
                    op2 = strtok(NULL,"\n\t\r ");
                    op3 = strtok(NULL,"\n\t\r ");
                    chch = (op1[0]-48)| ((op2[0]-48)<<3)|((op3[0]-48)<<6);  
                    program[counter]=0x7000+((chch)&0x00ff); 
                    counter++; 
                }
                else if (strcmp(token,"sub")==0)
                {
                    //to be added
                }
                else if (strcmp(token,"and")==0)
                {
                    //to be added
                }
                else if (strcmp(token,"or")==0)
                {
                    //to be added
                }
                else if (strcmp(token,"xor")==0)
                {
                    //to be added
                }                       
                else if (strcmp(token,"not")==0)
                {
                    op1 = strtok(NULL,"\n\t\r ");
                    op2 = strtok(NULL,"\n\t\r ");
                    ch = (op1[0]-48)| ((op2[0]-48)<<3);
                    program[counter]=0x7500+((ch)&0x00ff);  
                    counter++;
                }
                else if (strcmp(token,"mov")==0)
                {
                    //to be added
                }
                else if (strcmp(token,"inc")==0)
                {
                    op1 = strtok(NULL,"\n\t\r ");
                    ch = (op1[0]-48)| ((op1[0]-48)<<3);
                    program[counter]=0x7700+((ch)&0x00ff);  
                    counter++;
                }
                else if (strcmp(token,"dec")==0)
                {
                                    //to be added
                }
                else //------WHAT IS ENCOUNTERED IS NOT AN INSTRUCTION BUT A LABEL. UPDATE THE LABEL TABLE--------
                {
                    labeltable[nooflabels].location = counter;  //buraya bir counter koy. error check
                    op1=(char*)malloc(sizeof(token));
                    strcpy(op1,token);
                    labeltable[nooflabels].label=op1;
                    nooflabels++;
                } 
                token = strtok(NULL,",\n\t\r ");  
            }
        }


//================================= SECOND PASS ==============================

                //supply the address fields of the jump and jz instructions from the 
        int i,j;         
        for (i=0; i<noofjumps;i++)                                                                   //for all jump/jz instructions
        {
            j=0;
            while ( strcmp(jumptable[i].label , labeltable[j].label) != 0 )             //if the label for this jump/jz does not match with the 
                j++;                                                                // jth label in the labeltable, check the next label..
            program[jumptable[i].location] +=(labeltable[j].location-jumptable[i].location-1)&0x0fff;       //copy the jump address into memory.
        }                                                     




                // search for the start of the .data segment
        rewind(fp);  
        while(fgets(line,sizeof line,fp)!= NULL)  //skip till .data, if no .data, also ok.
        {
            token=strtok(line,"\n\t\r ");
            if (strcmp(token,".data")==0 )
                break;

        }


                // process the .data segment and generate the variabletable[] array.
        int dataarea=0;
        while(fgets(line,sizeof line,fp)!= NULL)
        {
            token=strtok(line,"\n\t\r ");
            if (strcmp(token,".code")==0 )  //go till the .code segment
                break;
            else if (token[strlen(token)-1]==':')
            {               
                token[strlen(token)-1]='\0';  //will not cause memory leak, as we do not do malloc
                variabletable[noofvariables].location=counter+dataarea;
                op1=(char*)malloc(sizeof(token));
                strcpy(op1,token);
                variabletable[noofvariables].name=op1;
                token = strtok(NULL,",\n\t\r ");
                if (token==NULL)
                    program[counter+dataarea]=0;
                else if (strcmp(token, ".space")==0)
                {
                    token=strtok(NULL,"\n\t\r ");
                    dataarea+=atoi(token);
                }
                else if((token[0]=='0')&&(token[1]=='x')) 
                    program[counter+dataarea]=hex2int(token+2)&0xffff; 
                else if ((  (token[0])=='-') || ('0'<=(token[0])&&(token[0]<='9'))  )
                    program[counter+dataarea]=atoi(token)&0xffff;  
                noofvariables++;
                dataarea++;
            }
        }






// supply the address fields for the ldi instructions from the variable table
        for( i=0; i<noofldis;i++)
        {
            j=0;
            while ((j<noofvariables)&&( strcmp( lditable[i].name , variabletable[j].name)!=0 ))
                j++;
            if (j<noofvariables)
                program[lditable[i].location] = variabletable[j].location;              
        } 

// supply the address fields for the ldi instructions from the label table
        for( i=0; i<noofldis;i++)
        {
            j=0;
            while ((j<nooflabels)&&( strcmp( lditable[i].name , labeltable[j].label)!=0 ))
                j++;
            if (j<nooflabels){
                program[lditable[i].location] = (labeltable[j].location)&0x0fff;
                printf("%d %d %d\n", i, j, (labeltable[j].location));   
            }           
        } 

//display the resulting tables
        printf("LABEL TABLE\n");
        for (i=0;i<nooflabels;i++)
            printf("%d %s\n", labeltable[i].location, labeltable[i].label); 
        printf("\n");
        printf("JUMP TABLE\n");
        for (i=0;i<noofjumps;i++)
            printf("%d %s\n", jumptable[i].location, jumptable[i].label);   
        printf("\n");
        printf("VARIABLE TABLE\n");
        for (i=0;i<noofvariables;i++)
            printf("%d %s\n", variabletable[i].location, variabletable[i].name);    
        printf("\n");
        printf("LDI INSTRUCTIONS\n");
        for (i=0;i<noofldis;i++)
            printf("%d %s\n", lditable[i].location, lditable[i].name);  
        printf("\n");
        fclose(fp);
        fp = fopen("RAM","w");
        fprintf(fp,"v2.0 raw\n");
        for (i=0;i<counter+dataarea;i++)
            fprintf(fp,"%04x\n",program[i]);
    }   
}

2
বিচ্ছিন্নভাবে কোনও ডিভাইস বিদ্যমান নেই। ক্রস টুলচেনগুলি খুব প্রচলিত, বিশেষত ক্ষুদ্র স্থাপত্যগুলির জন্য।
লার্স ভিক্লুন্ড

3
একটি "ক্রস" সংকলক / এসেম্ব্লার লক্ষ্যমাত্রার চেয়ে আলাদা সিস্টেমে চলে এবং লক্ষ্য সিস্টেমে ব্যবহারের উপযোগী শিল্পকর্ম তৈরি করে। প্রাচীন কালে, আপনার অগত্যা সিস্টেমগুলির মধ্যে ডেটা ইন্টারচেঞ্জ ছিল না, তবে নিজের দিক থেকে কোনও সিস্টেমকে স্ক্র্যাচ থেকে বুটস্ট্র্যাপ করতে হয়েছিল। আর্কিটেকচারের জন্য অনেক অনেক আধুনিক বিকাশ প্রতিষ্ঠিত সিস্টেমে করা হয়, সমস্ত কিছু সংশ্লেষ করে।
লার্স ভিক্লুন্ড

19
আপনি কি সি এর পরিবর্তে মেশিন কোডে এসেম্বলার লিখতে চান? আপনার অধ্যাপক আপনার ভাল লাগছে।
উইনস্টন ইওয়ার্ট

2
কেন আপনি সর্বোত্তম সম্ভাব্য প্রোগ্রামিং পরিবেশ / ভাষায় আপনার সমস্ত কোড লেখার চেষ্টা করবেন না? একটি সমাবেশকারীও এর ব্যতিক্রম নয়।
এরিক tদ

1
কোনও নির্দিষ্ট দিকের একটি নির্দিষ্ট "ভ্রমণ" নেই।
ভিসিয়াম

উত্তর:


18

লোকেরা মেশিন কোডে এসেমব্লার লিখেছেন। তারা তখন সমাবেশ ভাষায়ও লিখেছেন - প্রায়শই তারা নিজের ভাষায় অনুবাদ করা ভাষার একটি উপসেট থাকে, তাই তারা এসেম্বলারের একটি সাধারণ "বুটস্ট্র্যাপ" সংস্করণ দিয়ে শুরু করে, তারপরে এটির বৈশিষ্ট্যগুলি যুক্ত করে কারণ তাদের নিজেরাই এসেম্বলারের প্রয়োজন হয়।

তবে এগুলির কোনওটিই বিশেষত প্রয়োজনীয়তা নয়। শেষ পর্যন্ত, একটি এসেমব্লার হ'ল একটি (সাধারণত মোটামুটি) সহজ অনুবাদ প্রোগ্রাম। এটি একটি (পাঠ্য) ফর্ম্যাটে কোনও ফাইল নেয় এবং অন্যটিতে একটি ফাইল লেখায় (সাধারণত কোনও বস্তুর ফাইল ফর্ম্যাট)।

যে পাঠ্যটি ইনপুটটি পাঠ্য বিন্যাসে মেশিনের নির্দেশকে প্রতিনিধিত্ব করে এবং ফলাফলটি বাইনারি বিন্যাসে একই নির্দেশাবলী উপস্থাপন করে তা এসেম্বেবলার বাস্তবায়নের জন্য ব্যবহৃত ভাষায় খুব বেশি পার্থক্য রাখে না - আসলে, সি এর চেয়েও উচ্চতর ভাষা যেহেতু এসএনওবিএল এবং পাইথন বেশ সুন্দরভাবে কাজ করতে পারে - আমি (মোটামুটি) সম্প্রতি পাইথনে লেখা একটি এসেমব্লারের উপর কাজ করেছি এবং এটি কাজের জন্য বেশ ভালভাবে কাজ করেছে।

যতক্ষণ আপনি প্রাথমিকভাবে জিনিসগুলি বুটস্ট্র্যাপ করেন: সাধারণত অন্য কোনও মেশিনে শালীন বিকাশ সরঞ্জাম এবং এগুলি রয়েছে। আপনি যদি নতুন হার্ডওয়্যার বিকাশ করছেন তবে আপনি সাধারণত নতুন মেশিনের জন্য একটি সিমুলেটর (বা কমপক্ষে এমুলেটর) লিখে শুরু করতে পারেন, তাই প্রথমে আপনি কোনও হোস্ট সিস্টেমে কোডটি তৈরি করে চালাচ্ছেন।


3
"SNOBOL এবং পাইথনের মতো সি এর চেয়েও উচ্চতর ভাষাগুলি বেশ সুন্দরভাবে কাজ করতে পারে" - এটি একটি খুব ভাল বিষয়। এনএএসএম-এর জন্য আমরা কখনই সি-এর চেয়ে উচ্চ-স্তরের কিছুই বিবেচনা করি নি, তবে এটি ছিল 1995 যখন পারফরম্যান্স আজকের চেয়ে অনেক বেশি গুরুত্বপূর্ণ ছিল এবং উচ্চ-স্তরের ভাষাগুলি আজকের তুলনায় অনেক কম উন্নত ছিল। আজকাল, এটি অবশ্যই বিকল্প বিবেচনা মূল্যবান।
জুলাই

1
আমি 1980 এর দশক থেকে এসএনওবোল নামটি শুনিনি।
প্যাকম্যানিনবডব্লিউ

আমি একবার হাসকলে একটি সংকলক লিখেছি। অলস মূল্যায়ন এবং ফাংশনটির শৃঙ্খলা উত্পন্ন মেশিন কোডের জন্য একটি পীফোল অপ্টিমাইজার লিখতে তুচ্ছ সহজ করে তোলে।
থরবজর্ন রাভন অ্যান্ডারসন

11

আপনি এমন সংযোগগুলি দেখতে পাচ্ছেন যা বিদ্যমান নেই।

"অন্যান্য প্রোগ্রামিং টাস্কের মতো" "একটি এসেম্বলার লিখুন" একটি প্রোগ্রামিং কাজ is আপনি সেই টাস্কটি পরিচালনা করার জন্য সরঞ্জামগুলি ব্যবহার করেন যা সেই কাজের জন্য সেরা best এসেম্বেলারকে লেখার ক্ষেত্রে বিশেষ কিছু নেই; এটি একটি উচ্চ স্তরের ভাষায় না লেখার কোনও কারণ নেই। সি আসলে বেশ নিচু স্তরে এবং আমি সম্ভবত সি ++ বা অন্য কোনও উচ্চ স্তরের ভাষা পছন্দ করব।

সংসদীয় ভাষা আসলে এই জাতীয় কোনও কাজের জন্য সম্পূর্ণরূপে অনুপযুক্ত। যেসব ক্ষেত্রে আপনি যুক্তিসঙ্গতভাবে ভাষা ব্যবহার করবেন সে ক্ষেত্রে খুব বিরল। কেবলমাত্র যখন আপনার এমন কাজ করার দরকার হয় যা উচ্চ স্তরের ভাষায় প্রকাশ করা যায় না।


1
অন্যান্য উত্তরগুলি খুব ভাল, তবে আমি দেখতে পাচ্ছি যে এটি একটি খুব সোজা, বিশেষত প্রথম দুটি বাক্য দিয়ে। প্রশ্নটি পড়ার সময় আমি নিজেই একই কথা বলছিলাম।
মেটালমিকেস্টার

ম্যানুয়ালি অ্যাসেম্বলি ভাষা লেখার প্রয়োজন আজকাল কেবলমাত্র হার্ডওয়্যার নির্দিষ্ট হ্যাকের জন্য। উদাহরণস্বরূপ, কিছু সিপিইউতে সুরক্ষিত মোড সেট আপ করতে নির্দিষ্ট নির্দেশের অনুক্রম প্রয়োজন এবং যৌক্তিকভাবে সমতুল্য ক্রমটি যথেষ্ট ভাল নয়। খুব সুন্দর সমস্ত সাধারণ প্রোগ্রামে তাদের যে কাজটি করা দরকার তার জন্য কোনও নির্দিষ্ট নির্দেশ ক্রমের প্রয়োজন হয় না এবং ফলস্বরূপ কোনও নির্দিষ্ট অনুক্রমের প্রয়োজন হয় না তবে নির্দেশের কিছু যুক্তিসঙ্গত সমতুল্য সেট প্রয়োজন হয়। অপ্টিমাইজ করা সংকলকগুলি কার্যকর কার্য সম্পাদন (নির্দেশনা গণনা, প্রাচীর ঘড়ির সময়, কোড ক্যাশের আকার) উন্নত করতে ঠিক একই কাজ করে do
মিক্কো রেন্টালাইনেন

9

সি ভাষার অনুপস্থিতিতে তারা অতীতে কী করছিল? তারা কি মেশিন কোডে এসেমব্লার লিখছেন?

সমাবেশ মেশিন কোডের জন্য মূলত একটি স্মরণীয়; মেশিন ল্যাঙ্গুয়েজে প্রতিটি অপকোডকে অ্যাসেমব্লানি মেমোনিক দেওয়া হয় অর্থাৎ x86 এ এনওপি 0x90 হয়। এটি এসেম্বলারের পরিবর্তে সহজ করে তোলে (এনবি বেশিরভাগ সমাবেশকারীদের দুটি পাস থাকে, একটি অনুবাদ করতে পারে এবং দ্বিতীয়টি ঠিকানা / রেফারেন্স উত্পন্ন / সমাধান করতে পারে।) প্রথম এসেম্বলবার মেশিন কোডে হাতে লিখে (সম্ভবত কাগজে) অনুবাদ করেছিলেন। হাতের 'এসেম্বলড' এসেম্বলারের সাথে আরও ভাল সংস্করণ লেখা এবং একত্রিত হয়, নতুন বৈশিষ্ট্যগুলি এভাবে যুক্ত করা হয়। নতুন ভাষার জন্য সংকলকগুলি এভাবে নির্মিত যেতে পারে; অতীতে এই সংকলকদের পক্ষে সমাবেশ আউটপুট করা সাধারণ ছিল, এবং তাদের পিছনের শেষের জন্য একটি এসেমব্লার ব্যবহার করুন!

উচ্চ স্তরের ভাষায় নিম্ন স্তরের ভাষার জন্য একটি মেশিন কোড অনুবাদক লিখতে আমার কোনও অর্থ হয় না। ... [বিদ্যমান এসেমব্লাররা] সি-তে লেখা হয়েছে? আমিও ভাবছি কেন সেগুলিতে লেখা হয়?

  • উচ্চতর স্তরের ভাষায় আরও জটিল সফ্টওয়্যার লেখা সহজ হয়।
  • আপনি উচ্চ স্তরের চেয়ে নিম্ন স্তরের ভাষায় কী করছেন তা ট্র্যাক করতে সাধারণত আরও কোড এবং আরও মানসিক প্রচেষ্টা লাগে।
    • সি এর একটি এক লাইন প্রাক্তন নির্দেশাবলীতে অনুবাদ করতে পারে। সি ++ (বা সি) এ একটি সাধারণ কার্যপত্রক সাধারণত কমপক্ষে 3 টি বিধান নির্দেশাবলী উত্পন্ন করে (লোড করুন, সংশোধন করুন, সঞ্চয় করুন;) উচ্চতর স্তরের একক লাইন দিয়ে কী করা যায় তা করতে বিশ নির্দেশ বা আরও বেশি (সম্ভবত শত শত) লাগতে পারে it ভাষা (যেমন সি ++ বা সি।) একজন সাধারণত সমস্যা সমাধানে তাদের সময় ব্যয় করতে চান, এবং মেশিন কোডে কীভাবে সমাধানটি বাস্তবায়িত করতে পারেন তা নির্ধারণে সময় ব্যয় না করে।

যদিও স্ব-হোস্টিং একটি প্রোগ্রামিং ভাষা জন্য একটি সাধারণ মাইলফলক / কাম্য বৈশিষ্ট্য, সমাবেশ, যাতে নিম্ন স্তরের যে অধিকাংশ প্রোগ্রামারদের একটি উচ্চ স্তরের এ কাজ পছন্দ করেন হয়। অর্থাৎ কেউ সমাবেশে এসেম্বলার লিখতে চায় না (বা অন্য কিছু সত্যই)

ধরা যাক আমরা একটি নতুন ব্র্যান্ডের মাইক্রোপ্রসেসরের আর্কিটেকচার তৈরি করেছি যে সেই আর্কিটেকচারের জন্য কোনও সি সংকলকও নেই।

বুটস্ট্র্যাপিং একটি নতুন আর্কিটেকচারে একটি সরঞ্জাম-চেইন পাওয়ার প্রক্রিয়া।

প্রাথমিক প্রক্রিয়াটি হ'ল:

  • একটি নতুন পিছনে লিখুন যা আপনার নতুন সিপিইউ (বা এমসিইউ) এর কোড কীভাবে তৈরি করতে পারে তা বোঝে
  • আপনার পিছনের প্রান্তটি সংকলন করুন এবং পরীক্ষা করুন
  • আপনার নতুন ব্যাক-এন্ড ব্যবহার করে আপনার কাঙ্ক্ষিত সংকলক (এবং ওএস ইত্যাদি) ক্রস-সংকলন করুন
  • এই বাইনারিগুলি নতুন সিস্টেমে স্থানান্তর করুন

এটি করার জন্য আপনাকে একবার অ্যাসেমব্লিতে (নতুন বা পুরানো) লেখার দরকার নেই, আপনার এসেম্বলার / ব্যাক-এন্ড / কোড-জেনারেটর লেখার জন্য একটি সেরা ভাষা চয়ন করা উচিত।

সিটিতে লেখা আমাদের এসেমব্লার কি নতুন আর্কিটেকচারের অনুকরণ করতে পারবে?

এসেম্বলাররা অনুকরণ করে না!

যদি কোনও নতুন (বা বিদ্যমান) মেশিন ল্যাঙ্গুয়েজে একটি নতুন সিপিইউ বিকাশ করছিল, সাধারণত পরীক্ষার জন্য একটি সিমুলেটর প্রয়োজন; অর্থাত্ সিমুলেটারের মাধ্যমে এলোমেলো নির্দেশাবলী এবং ডেটা চালান এবং আপনার প্রোটোটাইপ সিপিইউতে একই নির্দেশাবলী এবং ডেটার সাথে আউটপুট তুলনা করুন। তারপরে বাগগুলি খুঁজে বার করুন, বাগগুলি ঠিক করুন, পুনরাবৃত্তি করুন।


3

সি (বা অন্য কোনও উচ্চ স্তরের ভাষা) তে এসেম্বলার লেখার কারণগুলির মধ্যে হ'ল উচ্চ কারণের ভাষায় অন্য কোনও প্রোগ্রাম লেখার ন্যায্যতা প্রমাণের জন্য আপনি যে কারণগুলি ব্যবহার করতে পারেন। এই ক্ষেত্রে তাদের মধ্যে প্রধান সম্ভবত বহনযোগ্যতা এবং ব্যবহারযোগ্যতা।

বহনযোগ্যতা: আপনি যদি নিজের অ্যাসেম্বলারকে কোনও মাতৃভাষায় লিখেন তবে সেই প্ল্যাটফর্মে আপনার একটি এসেমব্লার রয়েছে। আপনি যদি এটি সি তে লিখেন তবে আপনার কাছে একটি সি সংকলক সহ যে কোনও প্ল্যাটফর্মে একটি এসেমব্লার রয়েছে। এটি আপনাকে উদাহরণস্বরূপ, আপনার ওয়ার্কস্টেশনে আপনার এমবেড করা প্ল্যাটফর্মের জন্য কোড সংকলন করতে এবং বাইনারিটি সরাসরি টার্গেট ডিভাইসে সরাসরি করার দরকারের চেয়ে সরিয়ে ফেলতে দেয়।

ব্যবহারযোগ্যতা: বেশিরভাগ লোকের জন্য, প্রোগ্রামটি পড়া, যুক্তি করা এবং প্রোগ্রামগুলি সংশোধন করা যখন প্রোগ্রামটি উচ্চতর স্তরের ভাষায় থাকে তখন এটি এসেম্বলার বা (আরও খারাপ) কাঁচা মেশিন কোডের চেয়ে বেশি থাকে। অতএব, উচ্চ স্তরের ভাষায় এসেম্বলারের বিকাশ এবং বজায় রাখা সহজ কারণ আপনি যে উচ্চমানের জন্য দায়বদ্ধ সেগুলির জন্য আপনি যে মিনিটটিয়াতে দায়বদ্ধ সে সম্পর্কে আপনি চিন্তাভাবনা করার চেয়ে উচ্চ স্তরের ভাষাগুলি আপনাকে যে বিমূর্ততা সরবরাহ করেছেন তা বিবেচনা করতে পারেন।


3

কেবলমাত্র এই অংশটির বিশেষভাবে সম্বোধন করা:

"যেভাবে আমি জানি যে জিএনইউ এসেম্ব্লার এবং নেটওয়াইড অ্যাসেমব্লার সি-তে লেখা হয়েছে? আমিও ভাবছি যে সেগুলিতে কেন লেখা হয়?"

মূলত নেটওয়াইড অ্যাসেমব্লার লিখেছেন এমন একটি দলের অংশ হিসাবে বক্তব্য রেখে সিদ্ধান্তটি আমাদের কাছে তখন এতটাই সুস্পষ্ট বলে মনে হয়েছিল যে আমরা মূলত অন্য কোনও বিকল্প বিবেচনা করি নি, তবে আমরা যদি তাই করতাম তবে ভিত্তি করে আমরাও একই সিদ্ধান্তে পৌঁছতে পারতাম নিম্নলিখিত কারণগুলি:

  • এটি একটি নিম্ন স্তরের ভাষায় লেখা আরও শক্ত এবং অনেক বেশি সময়সাপেক্ষ ছিল।
  • এটি একটি উচ্চ স্তরের ভাষায় লেখার জন্য দ্রুত হতে পারে তবে কার্যকারিতা বিবেচনা ছিল (সংকলকটির পিছনের দিক হিসাবে ব্যবহৃত একটি এসেমব্লার, বিশেষত, কম্পাইলারটি খুব বেশি কমিয়ে না দেওয়ার জন্য খুব দ্রুত হওয়া দরকার, যেমনটি এটি পারে প্রচুর পরিমাণে কোড হ্যান্ডলিংয়ের অবসান ঘটে, এবং এটি এমন একটি ব্যবহারের কেস যা আমরা বিশেষভাবে মঞ্জুর করতে চেয়েছিলাম) এবং আমি বিশ্বাস করি না যে প্রাথমিক লেখকদের কোনও উচ্চ স্তরের ভাষা প্রচলিত ছিল (জাভা জনপ্রিয় হওয়ার আগে এটি ছিল, তাই বিশ্বজুড়ে এই জাতীয় ভাষাগুলি বরং ফিরে খণ্ডিত হয়েছিল)। আমরা কিছু ধাতব প্রোগ্রামিং কাজের জন্য পার্ল ব্যবহার করেছি (কোড জেনারেটরের পিছনের শেষের জন্য একটি দরকারী বিন্যাসে নির্দেশাবলী সারণী তৈরি করা), তবে এটি পুরো প্রোগ্রামটির জন্য যথাযথভাবে উপযোগী হত না।
  • আমরা অপারেটিং সিস্টেম বহনযোগ্যতা চেয়েছিলাম
  • আমরা হার্ডওয়ার প্ল্যাটফর্ম বহনযোগ্যতা (ক্রস সংকলক উত্পাদন জন্য) চেয়েছিলাম

এটি সিদ্ধান্তটি বেশ সহজ করে তুলেছিল: এএনএসআই-কমপ্লায়েন্ট সি (এই দিনগুলিতে সিএআরএফ, সিআরএইসি) তখন একমাত্র ভাষা যা সত্যই এই সমস্ত পয়েন্টকে আঘাত করেছিল। যদি কোনও মানক সি ++ ফিরে এসে থাকে তবে আমরা এটি বিবেচনা করে থাকতে পারি , তবে বিভিন্ন সিস্টেমের মধ্যে সি ++ সমর্থন তত্ক্ষণাত পিছনে ছিল, সুতরাং পোর্টেবল সি ++ লেখা কিছুটা দুঃস্বপ্ন ছিল।


1

একটি জিনিস অন্যটির সাথে একেবারে কিছুই করার নেই। ওয়েব ব্রাউজারগুলি কি এইচটিএমএল বা পিএইচপি বা অন্য কোনও ওয়েব সামগ্রীর ভাষা ব্যবহার করে কঠোরভাবে রচনা করা উচিত? না, তারা কেন করবে? গাড়ি কি কেবল অন্য গাড়ি দ্বারা চালিত হতে পারে না মানুষের দ্বারা চালিত হতে পারে?

বিটগুলির একটি ব্লবকে (কিছু ascii) অন্য বিটকে কিছু বিটকে রূপান্তর করা (কিছু মেশিন কোড) কেবল একটি প্রোগ্রামিং টাস্ক, আপনি সেই কাজের জন্য যে প্রোগ্রামিং ল্যাঙ্গুয়েজটি ব্যবহার করেন তা হ'ল আপনি যা চান তা। আপনি করতে পারেন এবং অনেকগুলি বিভিন্ন ভাষায় রচনা করা হয়েছে।

নতুন ভাষাগুলি তাদের নিজস্ব ভাষায় প্রাথমিকভাবে লেখা যায় না কারণ তাদের জন্য এখনও কোনও সংকলক / এসেম্বলার নেই। যদি কোনও নতুন ভাষার জন্য বিদ্যমান সংকলক না থাকে তবে আপনাকে প্রথমে অন্য কোনও ভাষায় লিখতে হবে এবং শেষ পর্যন্ত আপনি যদি বুটস্ট্র্যাপে বুদ্ধি করে তবে আপনি বুটস্ট্র্যাপ করুন। (এইচটিএমএল এবং একটি ওয়েব ব্রাউজার, এমন একটি প্রোগ্রাম যা কিছু বিট নেয় এবং কিছু বিট স্পিট করে কখনই এইচটিএমএল লিখিত হবে না, ক্যান্ট হতে পারে)।

একটি নতুন ভাষা হতে হবে না, একটি বিদ্যমান ভাষা হতে পারে। নতুন সি বা সি ++ সংকলক স্বয়ংক্রিয়ভাবে গেটের বাইরে নিজেকে সংকলন করবেন না।

অ্যাসেম্বলি ভাষা এবং সি এর জন্য প্রায় সমস্ত নতুন বা সংশোধিত নির্দেশাবলী সেটগুলির জন্য প্রথম দুটি ভাষা। আমরা অতীতে নই, আমরা বর্তমানে আছি। আমরা সি বা জাভা বা পাইথনগুলিতে সহজেই একটি এসেম্বলার জেনারেট করতে পারি বা যে কোনও নির্দেশিকা সেট এবং সমাবেশ ভাষা আমরা চাইলেও তা বিদ্যমান না থাকলেও তৈরি করতে পারি। তেমনি অনেক রিটার্জেটেবল সি সংকলক রয়েছে যে আমরা যে কোনও অ্যাসেম্বলি ভাষার জন্য এসেম্বলিংয়ের উপস্থিতি না থাকলেও আমরা এসেম্বলির ভাষা আউটপুট করতে পারি।

এটিই আমরা একটি নতুন নির্দেশিকা সেট নিয়ে করি। এমন কিছু কম্পিউটার নিন যা আমাদের নতুন নির্দেশের সেটে তার সি সংকলক সহ চলমান না যা আমাদের নতুন নির্দেশের সেট বা এর এসেম্বলারের জন্য নয়, একটি ক্রস এসেমব্লার এবং ক্রস সংকলক তৈরি করুন। যুক্তি তৈরি ও অনুকরণের সময় এটি বিকাশ এবং ব্যবহার করুন। কোনও বাগ খুঁজে বের করার স্বাভাবিক বিকাশের চক্রটি অতিক্রম করুন এবং একটি বাগটি ঠিক করে নিন এবং আবার পরীক্ষা করুন, যতক্ষণ না আদর্শভাবে সমস্ত সরঞ্জাম এবং যুক্তি প্রস্তুত মনে না করা হয়। এবং টার্গেটের উপর নির্ভর করে বলুন যে এটি কোনও মাইক্রোকন্ট্রোলার অপারেটিং সিস্টেম চালাতে অক্ষম, আপনার বুটস্ট্র্যাপ করার কোনও কারণ কখনই থাকবে না যে এই জাতীয় সরঞ্জামটি দেশীয় নির্দেশিকা সেট ব্যবহার করে তৈরি করে এবং চালায় runs আপনি সর্বদা সংকলন ক্রস হবে। ওয়েবব্যাক মেশিন ব্যতীত এটি এসেম্বলারের মধ্যে এসেম্বলারের লেখার জন্য অর্থবোধ করে না।

হ্যাঁ আপনি যদি ফিরে যেতে বা ফিরে যাবার ভান করতে পারতেন তবে প্রথম সমাবেশকারী একজন পেনসিল এবং কাগজযুক্ত একজন মানুষ ছিলেন যা তাদের বোঝার জন্য কিছু লিখেছিল এবং তারপরে বিটগুলি লিখতে পারে যা যুক্তিটি বোঝায়। তারপরে মেশিনে বিটগুলি আনার জন্য সুইচ বা অন্য কোনও উপায়ে ব্যবহার করা হয়েছে (গুগল পিডিপি 8 বা পিডিপি 11 বা বৈদ্যুতিন 8800) এবং এটিকে কিছু করার জন্য তৈরি করে। প্রাথমিকভাবে কোনও কম্পিউটার সিমুলেটর ছিল না আপনাকে কেবল দীর্ঘক্ষণ এটিকে দেখার জন্য বা চিপের কয়েকটি রেভ স্পিনিং করে যুক্তিটি পেতে হবে। সরঞ্জামগুলি আজ যথেষ্ট ভাল যে আপনি এ 0 সাফল্য পেতে পারেন যে জিনিসটি কেবল একটি বড় প্রতিরোধকের চেয়ে বেশি, এটির অনেকগুলি কাজ করে আপনার পুরোপুরি অনুকরণ করতে পারেননি এমন জিনিসগুলির জন্য আপনার একটি স্পিনের প্রয়োজন হতে পারে তবে আপনি প্রায়শই এখন বুট করতে পারেন তৃতীয় বা চতুর্থ স্পিনের জন্য অপেক্ষা না করেই প্রথম স্পি,

আপনার ওয়েবেব্যাক মেশিনে যেমন প্রত্যাশা করা যায়, আপনি তার পরে আপনার হাতের কোডটি সংগ্রহ করেন এবং আপনি টেপ বা কার্ড থেকে কোনও প্রোগ্রাম লোড করে বলতে ব্যবহার করেন। আপনি মেশিন কোডে একটি এসেম্বলারকেও হ্যান্ড কোড দেন, পুরোপুরি বিকশিত হতে পারে না তবে এটি প্রোগ্রামিংকে কিছুটা সহজ করে তোলে। তারপরে সেই সরঞ্জামটি এমন একটি তৈরিতে ব্যবহার করা হয় যা আরও উন্নত বা জটিল ল্যাঙ্গেজ (একটি ম্যাক্রো এসেম্বারার) পরিচালনা করতে পারে এবং আরও একটি জটিল তৈরি করতে পারে এবং আপনি ফোরট্রান বা বেসিক বা বি বা যা কিছু দিয়ে শেষ করেন। এবং তারপরে আপনি একই ভাষায় বুটস্ট্র্যাপিং সম্পর্কে চিন্তা করতে শুরু করেন, ক্রস সংকলকটিকে একটি দেশীয় সংকলক হিসাবে পুনরায় লেখার জন্য। অবশ্যই আপনার প্রয়োজন আদর্শ বা পরিবেশের জন্য কোনও ধরণের অপারেটিং সিস্টেম sort

যখন আমরা সিলিকন তৈরি বা পরীক্ষা করি তখন আমাদের যে সংকেতগুলি এবং শূন্যগুলি তা তাকানোর প্রয়োজন / প্রয়োজন। সরঞ্জামগুলি ডিফল্টরূপে আমাদের বাইনারি বা হেক্স প্রদর্শন করবে এবং কিছু সরঞ্জামের সাথে এমনকি লুক আপ করাও সম্ভব হবে যাতে সরঞ্জামগুলি কিছু স্মৃতিবিজ্ঞান প্রদর্শন করতে পারে (সম্ভবত সমাবেশ) তবে প্রকৌশলীরা (সিলিকন / হার্ডওয়্যার এবং সফ্টওয়্যার) হয় যথেষ্ট পরিমাণে পড়তে পারেন মেশিন কোড, বা নির্দেশাবলী "দেখুন" করতে বিচ্ছিন্নতা / তালিকা ব্যবহার করুন।

আপনি যা করছেন তার উপর নির্ভর করে আপনি পরীক্ষাটি পুনরায় লেখার এবং পুনরায় সংশ্লেষ করার বা পরীক্ষার পুনরায় একত্রিত করার পরিবর্তে কিছু মেশিন কোডে পরীক্ষা ভেক্টরগুলিতে সরিয়ে দিতে পারেন। উদাহরণস্বরূপ, যদি আপনার কোনও পাইপলাইন থাকে এবং কিছু গভীরতায় প্রিফেচ আপনার প্রয়োজন হতে পারে বা প্রোগ্রামের শেষের দিকে কিছু নম্বর বা অন্যান্য বাস্তব নির্দেশগুলি পূরণ করতে চান যাতে পাইপটি অপরিজ্ঞাত নির্দেশাবলীর উপর চাপ না দেয় এবং আপনি কেবল বেছে নিতে পারেন সংকলক বা এসেম্বলার বা লিঙ্কারটি করার চেয়ে বরং সর্বনিম্ন স্তরের তালিকা / ফাইলের মধ্যে মেশিন কোড পূরণ করুন।

অবশ্যই প্রসেসরের পরীক্ষার সময় আপনাকে অপরিজ্ঞাত ও সম্ভবত যত্ন বিট ইত্যাদির মোকাবেলা করতে হবে না তাই আপনাকে সাধারণভাবে কর্মক্ষম প্রোগ্রামে কোনও মেশিন কোডে যেতে হবে এবং কোনও নির্দেশিকায় এক বা একাধিক নির্দিষ্ট বিট সংশোধন করতে হবে। এটি করার জন্য কোনও প্রোগ্রাম লেখার পক্ষে কি তা কেবল হাতে হাতে করা। তেমনিভাবে ইসিসি পরীক্ষার সময় আপনি এক বা একাধিক বিট ফ্লিপ করতে চান এবং দেখুন যে সেগুলি সংশোধন হয়েছে বা আটকা পড়েছে। মঞ্জুরিপ্রাপ্ত যে কোনও প্রোগ্রাম লিখতে অনেক সহজ বা আপনি এটি হাতে হাতে করতে পারেন।

তারপরে অবশ্যই এমন ভাষা রয়েছে যা কোড তৈরি করে না যা প্রসেসর, প্রারম্ভিক প্যাস্কেল, জাভা, অজগর ইত্যাদিতে চলে। এই ভাষাগুলি ব্যবহার করার জন্য আপনার কোনও অন্য ভাষায় লিখিত ভিএম দরকার V আপনি জাভা ভিএম তৈরি করতে আপনার জাভা সংকলকটি ব্যবহার করতে পারবেন না, ভাষার নকশার উপর ভিত্তি করে কোনও ধারণা রাখেন না।

(হ্যাঁ এই ভাষাগুলির শুদ্ধ বাস্তবায়নের পরে অবশেষে কেউ একটি অনিশ্চিত ব্যাকএন্ড তৈরি করে যা কখনও কখনও বাস্তব নির্দেশকে লক্ষ্য করে তুলতে পারে ভিএম নির্দেশিকা সেট নয় এবং তারপরে আপনি যদি ভাষাটি সত্যই অনুভব করেন তবে এটি নিজের বা তার ভিএম সংকলন করতে ব্যবহার করতে পারেন) প্রয়োজন। উদাহরণস্বরূপ একটি gnu জাভা সামনে প্রান্তে জিসিসি)।

সময়ের সাথে সাথে সম্ভবত এখনও আমরা সি-তে সি সংকলক লিখি না We আমরা বাইসন / ফ্লেক্স জাতীয় কিছু ব্যবহার করি যা আমরা আমাদের জন্য সি তৈরি করতে ব্যবহার করি যা আমরা নিজেরাই লিখতে চাইনি। কিছু শতাংশ সি নিশ্চিত, তবে কিছু শতাংশ অন্য কয়েকটি ভাষায় যা কিছু অন্যান্য সংকলক ব্যবহার করে যা বিটগুলি আউটপুট দেয় এবং অন্যান্য বিটগুলি আউটপুট করে। কখনও কখনও এই পদ্ধতির একটি এসেমব্লার তৈরির জন্যও ব্যবহৃত হয়। সংকলক / এসেম্বলারের ডিজাইনার পর্যন্ত (যে প্রোগ্রামগুলিতে বিটগুলি ইনপুট করা এবং তারপরে অন্যান্য বিটগুলি আউটপুট দেওয়ার কাজ রয়েছে) তারা কীভাবে এটি প্রয়োগ করতে চলেছে। প্রোগ্রামটি উত্পন্ন পার্সারগুলি হ্যান্ড প্রোগ্রামটি নিশ্চিত হতে পারে, ঠিক সময় লাগছে তাই লোকেরা একটি শর্টকাট সন্ধান করে। ঠিক তেমনি আপনি এসেম্বেবলারে একটি এসেমব্লার লিখতে পারেন তবে লোকেরা একটি শর্টকাট সন্ধান করে।

ওয়েব ব্রাউজারটি এমন একটি প্রোগ্রাম যা কিছু বিট নেয় এবং কিছু বিট ফেলে দেয়। একটি অ্যাসেমব্লার একটি প্রোগ্রাম যা কিছু বিট নেয় এবং কিছু অন্যান্য বিট স্পিট করে। একটি সংকলক হ'ল একটি প্রোগ্রাম যা কিছু বিট নেয় এবং কিছু অন্যান্য বিট স্পিট করে। ইত্যাদির জন্য প্রতিটি প্রোগ্রামিং টাস্কের জন্য ইনপুট বিট এবং আউটপুট বিটগুলির জন্য নিয়মের একটি ডকুমেন্টেড সেট রয়েছে। এই টাস্কগুলি এবং বিটগুলি যথেষ্ট জেনেরিক যে কোনও উপলভ্য প্রোগ্রামিং ভাষা ব্যবহার করা যেতে পারে (এটি বিট / বাইট ম্যানিপুলেশন এবং ইনপুট এবং আউটপুটগুলি মোকাবেলা করতে সক্ষম)। এখানে কী উপলব্ধ। স্ক্র্যাচ বুক / টিউটোরিয়াল থেকে লিনাক্সটি পেয়ে দেখুন try সিমুলেটেড ফ্রন্ট প্যানেল সহ একটি পিডিপি 8 বা পিডিপি 11 বা এলডিয়ার 8800 বা অন্যান্য সিমুলেটর ব্যবহার করে দেখুন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.