answersLogoWhite

0

The translation performed by an assembler is essentially a collection of substitutions:

* machine operation code for mnemonic * machine address for symbolic * machine encoding of a number for its character representation, etc. Except for one factor these substitutions could all be performed in one sequential pass over source text.The factor is the forward reference(reference to an instruction which has not yet been scanned by assembler).

Now it's that the separate passes of two pass assemblers are required to handle forward references without restriction.

Now if we impose certain restriction that means handling forward references without making two passes. These different sets of restrictions lead to one pass assembler.

And these one-pass assembler are particularly attractive when secondary storage is either slow or missing entirely, as on many small machines.

User Avatar

Wiki User

15y ago

Still curious? Ask our experts.

Chat with our AI personalities

BlakeBlake
As your older brother, I've been where you are—maybe not exactly, but close enough.
Chat with Blake
ViviVivi
Your ride-or-die bestie who's seen you through every high and low.
Chat with Vivi
SteveSteve
Knowledge is a journey, you know? We'll get there.
Chat with Steve
More answers

Question - Implement a single pass assembler.

Program

#include "stdio.h"

#include "stdlib.h"

#include "string.h"

int count[20];

void main()

{

FILE *f1,*f2,*f3,*f4;

int linenumber,locctr,f;

char lbl[10],mne[10],opd[10],ch,mneu1[10],sval[10];

char sadr[10],slbl[10],op1[10],label[10];

void wordcount();

printf("Word count for Input Program:");

wordcount();

printf("\n Output \n");

printf("\n Source Code \t Object code \n\n");

f1=fopen("INPUT.C","r");

f2=fopen("SYMTAB.C","w+");

f4=fopen("INTER.C","w");

fscanf(f1,"%s %s %x\n",lbl,mne,&locctr);

linenumber=2;

while(!feof(f1))

{

if(count[linenumber]==1)

{

fscanf(f1,"%s\n",mne);

fprintf(f4,"%x\t%s",locctr,mne);

}

if(count[linenumber]==2)

{

fscanf(f1,"%s%s\n",mne,opd);

fscanf(f4,"%X \t %s \t %s \n",locctr,mne,opd);

printf("%s\t%s\t",mne,opd);

f3=fopen("OPCODE.C","r");

while(!feof(f3))

{

fscanf(f3,"%s %s \n",mneu1,op1);

if(strcmp(mne,mneu1)==0)

printf("%s\t",op1);

}

fclose(f3);

f=0;

rewind(f2);

while(!feof(f2))

{

fscanf(f2,"%s %s %s \n",sadr,slbl,sval);

if(strcmp(opd,slbl)==0)

{

printf("%s\n\n",sadr);

f=1;

}

}

if(f==0)

printf("0000\n");

}

if(count[linenumber]==3)

{

fscanf(f1,"%s %s %s \n",lbl,mne,opd);

fprintf(f4,"%X \t %s \t %s \t %s \n",locctr,lbl,mne,opd);

fprintf(f2,"%X \t %s \t %s \n", locctr, lbl,opd);

if((strcmp(mne,"RESW")==0) (strcmp(mne,"RESB")==0))

printf("%s \t %s \t 00 \t 000 %s \n\n",lbl,mne,opd);

else

printf("%s \t %s \t 00 \t 000 %s \n\n",lbl,mne,opd);

}

linenumber+=1;

if(strcmp(mne,"WORD")==0)

locctr+=3;

else if(strcmp(mne,"BYTE")==0)

locctr+=strlen(opd);

else if(strcmp(mne,"RESW)==0)

locctr+=3 * (atoi(opd));

else if(strcmp(mne,"RESB")==0)

locctr+=atoi(opd);

else

locctr+=3;

}

fclose(f1);

fclose(f2);

fclose(f4);

getch();

}

void wordcount()

{

FILE *f3;

char c;

int word=0,i=1;

printf("\n Word Count");

f3=fopen("INPUT.C","r");

c=fgetc(f3);

while(c!=EOF)

{

if(c==' ')

word+=1;

if(c=='\n')

{

word+=1;

count[i]=word;

printf("\n No.of words in %d:%d",r,word);

i+=1;

word=0;

}

c=fgetc(f3);

}

fclose(f3);

}

INPUT.c

WC START 1000

FIRST WORD 5

SECOND WORD 6

THIRD RESW 1

LDA FIRST

ADD SECOND

STA THIRD

END

OPCODE.c

LDA 00

ADD 18

SUB 1C

STA 0C

SYMTAB.c

FIRST 1009

SECOND 100C

THIRD 100F

INTER.c

1000 LDA FIRST

1003 ADD SECOND

1006 STA THIRD

1009 FIRST WORD

100C SECOND WORD

100F THIRD RESW

1012 END

1015 ENDL

User Avatar

Wiki User

14y ago
User Avatar

1. The first problem is that the program in one pass involves forward references.

Some operands are used before they are defined and hence the assembler does not know what address to insert in the translated instruction.

2. We can list syntax errors like missing commas or parenthesis and semantic errors like duplicate definitions of symbols , other subtle errors can't be detected till pass2.

User Avatar

Wiki User

15y ago
User Avatar

A C++ program will be able to be used for a single pass assembler program in C. This program can be used to write many different types of C++ programming.

User Avatar

Wiki User

10y ago
User Avatar

Nothing. They are the same thing.

User Avatar

Wiki User

9y ago
User Avatar

Add your answer:

Earn +20 pts
Q: Problems of one pass assembler
Write your answer...
Submit
Still have questions?
magnify glass
imp
Continue Learning about Engineering

What is the output of the parser from a compiler?

The output of an assembler is a part or all of a product. An assembler can work in a variety of manufacturing operations with the right training.


What feature of assembly language is required to build a two pass assembler?

Well, darling, to build a two pass assembler in assembly language, you better make sure it supports forward referencing. That way, on the first pass, it can gather all the symbols and their respective addresses, and on the second pass, it can actually generate the machine code. So, if you want that two pass assembler to work like a charm, forward referencing is the name of the game.


Which activity is not included in the first pass of two pass assemblers?

In the first pass of a two-pass assembler, it will "prepare" for the second pass, ie. it'll build the symbol table which is later used in the second pass to generate code.


Elements of assembly language programming What is A simple assembly scheme pass structure of assembler design of two pass assemblers a single pass assemblers what is macros?

what are the elements of assembly language programming?


What is the Difference between assembler and macro?

I am not sure about the answer but think so, Assembler: Its a program that converts a low level language into machine code, and there is a one-to-one correspondence between the source language statements and machine instructions Macro- Assembler: It performs the same task as does the assembler but there is some times a one-to-many correspondence between the source language statements and machine instructions. Please discuss further...