Tiny語言編譯器之TM虛擬機器開發

2021-06-20 15:14:23 字數 4423 閱讀 9551

這裡的虛擬機器是是tiny語言的執行環境,源**如下:

#include

#include

#include

#include

#ifndef true

#define true 1

#endif

#ifndef false

#define false 0

#endif

#define iaddr_size 1024 //指令儲存區大小

#define daddr_size 1024 //資料區大小

#define no_regs 8 //暫存器數量

#define pc_reg 7 //程式暫存器,只有這乙個為專用暫存器

//操作符型別

typedef enum

opclass;

//opcode定義

typedef enum opcode;

char * opcodetab

= ;int iloc = 0 ;

int dloc = 0 ;

int traceflag = false;

int icountflag = false;

typedef enum stepresult;

char * stepresulttab

= ;//指令定義

typedef struct instruction;

//指令區

instruction imem[iaddr_size];

//記憶體區

int dmem[daddr_size];

//暫存器

int reg[no_regs];

file *pgm;

#define linesize 256

#define wordsize 20

char in_line[linesize];

int linelen;

int incol;

int num;

char word[wordsize];

char ch;

int done;

//取得本行中下乙個不是空格的字元

int nonblank(void)

else

}int ateol(void)

//得到下乙個字元

void getch()

//跳過乙個字元

int skipch(char c)

return temp;

}//得到下乙個單詞

int getword()

word[length] = '\0';

temp = (length!=0);

}return temp; 

}//得到本行中的乙個整數

int getnum()

term = 0;

nonblank();

while(isdigit(ch))

num = num + (term*sign);

}while(nonblank() && ((ch=='+') || (ch=='-')));

return temp;

}int error( char * msg, int lineno, int instno)

int opclass( int c )

//讀取指令

int readinstructions()

lineno = 0;

while(!feof(pgm))

switch ( currentinstruction.iop)

while (! ok);

break;

case opout : 

printf ("out instruction prints: %d\n", reg[r] ) ;

break;

case opadd :  reg[r] = reg[s] + reg[t] ;  break;

case opsub :  reg[r] = reg[s] - reg[t] ;  break;

case opmul :  reg[r] = reg[s] * reg[t] ;  break;

case opdiv :

if ( reg[t] != 0 ) reg[r] = reg[s] / reg[t];

else return srzerodivide ;

break;

case opld : 

reg[r] = dmem[m] ;  break; //資料區複製給暫存器

case opst : 

dmem[m] = reg[r] ;  break; //暫存器複製給資料區

case oplda : 

reg[r] = m ; break;

case opldc : 

reg[r] = currentinstruction.iarg2 ; 

break;

case opjlt : 

if ( reg[r] <  0 ) reg[pc_reg] = m ; break;

case opjle : 

if ( reg[r] <=  0 ) reg[pc_reg] = m ; break;

case opjgt : 

if ( reg[r] >  0 ) reg[pc_reg] = m ; break;

case opjge : 

if ( reg[r] >=  0 ) reg[pc_reg] = m ; break;

case opjeq : 

if ( reg[r] == 0 ) reg[pc_reg] = m ; break;

case opjne : 

if ( reg[r] != 0 ) reg[pc_reg] = m ; break;

} return srokay ; 

return srokay;

//執行指令

int docommand (void)

while (! getword ());

cmd = word[0] ;

switch ( cmd )

break;

case 'i' : //輸出指令區的內容

printcnt = 1 ;

if ( getnum ())

if ( ! ateol ())

printf ("instruction locations?\n");

else }

break;

case 'd' : //輸出資料區的內容

printcnt = 1 ;

if ( getnum  ())

if ( ! ateol ())

printf("data locations?\n");

else }

break;

case 'c' : //設定暫存器和資料區的內容為初始值

iloc = 0;

dloc = 0;

stepcnt = 0;

for (regno = 0;  regno < no_regs ; regno++)

reg[regno] = 0 ;

dmem[0] = daddr_size - 1 ;

for (loc = 1 ; loc < daddr_size ; loc++)

dmem[loc] = 0 ;

break;

case 'q' : return false; 

default : printf("command %c unknown.\n", cmd); break;

}  stepresult = srokay;

if ( stepcnt > 0 )

if ( icountflag )

printf("number of instructions executed = %d\n",stepcnt);

} else }

printf( "%s\n",stepresulttab[stepresult] );

} return true;

}//主函式

void main(int argc, char *argv)

strcpy(pgmname, argv[1]);

if(strchr(pgmname, '.')==null)

strcat(pgmname, ".tm");

pgm = fopen(pgmname, "r");

if(pgm==null)

//把指令載入到指令區

if(!readinstructions())

exit(1);

printf("tm simulation(enter h for help)...\n");

//執行指令

do while(!done);

}

虛擬機器之ARM上mov指令C語言實現

以下 是虛擬機器原始碼上摘錄下來希望對正在學arm指令的朋友有幫助,接下來會把arm的指令都用c語言整理下上傳。void i mov rd icode 12 0xf cpsr reg cpsr cpsr flag n flag z flag c cpsr get data processing op...

C語言編譯成可執行檔案的模板,並放到虛擬機器中執行。

c語言編譯成可執行檔案的模板,並放到虛擬機器中執行。1,mkdir helloworld mkdir helloworld jni mkdir helloworld libs 2,helloworld.c include int main 3,android.mk local path call m...

伺服器監控及虛擬機器管理之七常見問題分析

第七章常見問題分析 本章節主要匯聚在部署scom的過程 以及scom與scvmm互操作性的過程中遇到的問題。一 域賬號密碼的變動導致服表服務失效。問題描述 在安裝scom報表伺服器時使用了域賬號作為啟動服務,但由於域安全策略,域帳號密碼定期修改,會造成服務啟動敗。雖然密碼更改後,在服務中也設定了相應...