這裡的虛擬機器是是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報表伺服器時使用了域賬號作為啟動服務,但由於域安全策略,域帳號密碼定期修改,會造成服務啟動敗。雖然密碼更改後,在服務中也設定了相應...