*** empty log message ***
This commit is contained in:
		
							parent
							
								
									79457dabd1
								
							
						
					
					
						commit
						8202444413
					
				
					 3 changed files with 43 additions and 16 deletions
				
			
		|  | @ -3,13 +3,38 @@ | |||
| #include "as.h" | ||||
| #include "const.h" | ||||
| 
 | ||||
| 
 | ||||
| /* This file contains the routine assemble(). Assemble() cuts an
 | ||||
|  * assembly instruction in a label, a mnemonic and several operands. | ||||
|  * For a label and operands it calls table writer defined routines,  | ||||
|  * process_label() and process_operand(), to give the table writer  | ||||
|  * the oppurtunity to do something special. At the end assemble() calls | ||||
|  * the routine belonging to the mnemonic with the supplied operands. | ||||
|  *     If the table writer has other expectations of assemble() he should | ||||
|  * write his own version. | ||||
|  * 	Assemble parser the following instructions : | ||||
|  * INSTR ::= [ STRING ':']? [ STRING [ OPERAND ( ',' OPERAND)*]? ]? | ||||
|  * OPERAND ::= STRING [ '{' char* '}' | | ||||
|  * 			'(' char* ')' |  | ||||
|  * 			'[' char* ']'     ]? | ||||
|  * note : nested brackets are not recognized. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| /* The following global varaibles are defined in the EM_parser.
 | ||||
|  */ | ||||
| 
 | ||||
| extern char *mnemonic[]; | ||||
| extern int (*instruction[])(), n_mnems; | ||||
| 
 | ||||
| /* The struct t_operand must be defined by the table writer in "as.h".
 | ||||
|  * The constant MAX_OPERANDS is defined in "const.h" | ||||
|  * To change MAX_OPERANDS effectively, the last statement in  | ||||
|  * execute_mnem() must be changed. | ||||
|  */ | ||||
| 
 | ||||
| struct t_operand operand[ MAX_OPERANDS]; | ||||
| 
 | ||||
| /* To change MAX_OPERANDS, the last statement in execute_mnem() must
 | ||||
|  * be changed. | ||||
|  */ | ||||
| 
 | ||||
| 
 | ||||
| char *skip_space(), *parse_label(), *parse_mnemonic(), *parse_operand(), | ||||
|  | @ -19,12 +44,7 @@ int  label(); | |||
| 
 | ||||
| assemble( instr) | ||||
| 	char *instr; | ||||
| 
 | ||||
| /* INSTR ::= [ STRING ':']? [ STRING [ OPERAND ( ',' OPERAND)*]? ]?
 | ||||
|  * OPERAND ::= STRING [ '{' char* '}' | | ||||
|  * 			'(' char* ')' |  | ||||
|  * 			'[' char* ']'     ]? | ||||
|  * Break an assembly instruction down in a LABEL, MNEMONIC and OPERANDS. | ||||
| /* Break an assembly instruction down in a LABEL, MNEMONIC and OPERANDS.
 | ||||
|  */ | ||||
| { | ||||
| 	char *ptr, *copy, *mnem; | ||||
|  | @ -33,19 +53,19 @@ assemble( instr) | |||
| 	copy = ptr = Salloc( instr, strlen( instr)+1); | ||||
| 
 | ||||
| 	ptr = skip_space( ptr); | ||||
| 	if  ( label( ptr))  { | ||||
| 	if  ( label( ptr))  {     /* Look for a label */ | ||||
| 		ptr = parse_label( ptr); | ||||
| 		if  ( *ptr == '\0')  return; | ||||
| 	} | ||||
| 
 | ||||
| 	ptr = parse_mnemonic( ptr, &mnem); | ||||
| 	while  ( *ptr != '\0')  { | ||||
| 	while  ( *ptr != '\0')  {  /* parse operans */ | ||||
| 		if ( n_ops++ == MAX_OPERANDS)  | ||||
| 			error( "to many operands\n"); | ||||
| 		ptr = parse_operand( ptr, n_ops, instr); | ||||
| 	} | ||||
| 
 | ||||
| 	execute_mnemonic( mnem); | ||||
| 	execute_mnemonic( mnem);   /* Execute the assembler instruction */ | ||||
| 	free( copy); | ||||
| } | ||||
| 
 | ||||
|  | @ -164,7 +184,7 @@ char *ptr; | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| /****************************************************************************/ | ||||
| /*** Execution **************************************************************/ | ||||
| 
 | ||||
| 
 | ||||
| execute_mnemonic( mnem) | ||||
|  | @ -198,13 +218,15 @@ char *mnem; | |||
| } | ||||
| 
 | ||||
| 
 | ||||
| /*** Error ****************************************************************/ | ||||
| 
 | ||||
| error( fmt, argv) | ||||
| char *fmt; | ||||
| int argv; | ||||
| { | ||||
| 	extern int yylineno; | ||||
| 
 | ||||
| 	fprint( STDERR, "!! ERROR in line %d :	", yylineno); | ||||
| 	fprint( STDERR, "ERROR in line %d :	", yylineno); | ||||
| 	doprnt( STDERR, fmt, &argv); | ||||
| 	fprint( STDERR, "	!!\n"); | ||||
| 	fprint( STDERR, "\n"); | ||||
| } | ||||
|  |  | |||
|  | @ -1,4 +1,10 @@ | |||
| block_assemble( instructions, nr, first, last) | ||||
| 
 | ||||
| /* Assembles a block of assembly instructions. If the table writer wants 
 | ||||
|  * to combine a block of instructions (e.g., push/pop optimization) he | ||||
|  * should changes this routine to his own needs. | ||||
|  */ | ||||
| 
 | ||||
| char **instructions; | ||||
| int nr, first, last; | ||||
| { | ||||
|  |  | |||
|  | @ -1,4 +1,3 @@ | |||
| 
 | ||||
| #define Bool	int | ||||
| 
 | ||||
| #define TRUE		1 | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue