2015-11-14 7 views
0

Я разрабатываю виртуальную машину и имею проблему с моей инструкцией по нажатию. Это толкает явное значение, а не то, что проводится в указанной книге, например:сломанная команда push для vm

0x0064 //this line puts hexadecimal for 100 into register 0 
    0x4000 //this is the line i question this will literally put 
      //0 into the stack as an explicit value. i want it to 
      //put what is in register 0(line 1) into the stack 

я включил исходный код С для моей VM ниже:

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

#define NUM_REGS 16 
unsigned short regs[ NUM_REGS ]; 

unsigned program[] = { 0x10C8, 0x1164, 0x2201, 0x4200, 0x0000 }; 

unsigned stack[10]; 
int i = 0; 

/* program counter */ 
int pc = 0; 

/* fetch the next word from the program */ 
int fetch() 
{ 
    return program[ pc++ ]; 
} 

/* instruction fields */ 
int instrNum = 0; 
int reg1  = 0; 
int reg2  = 0; 
int reg3  = 0; 
int imm  = 0; 

/* decode a word */ 
void decode(int instr) 
{ 
    instrNum = (instr & 0xF000) >> 12; 
    reg1  = (instr & 0xF00) >> 8; 
    reg2  = (instr & 0xF0) >> 4; 
    reg3  = (instr & 0xF ); 
    imm  = (instr & 0xFF ); 
} 

/* the VM runs until this flag becomes 0 */ 
int running = 1; 

/* push element onto stack */ 
void push(reg) 
{ 
    int a; 

    for(a = 10; a <= 10; i--){ 
    stack[a] = stack[a++]; 
    } 
    stack[0] = reg; 

} 

/* evaluate the last decoded instruction */ 
void eval() 
{ 
    switch(instrNum) 
    { 
    case 0: 
     /* halt */ 
     printf("halt\n"); 
     running = 0; 
     break; 
    case 1: 
     /* loadi */ 
     printf("loadi r%d #%d\n", reg1, imm); 
     regs[ reg1 ] = imm; 
     break; 
    case 2: 
     /* add */ 
     printf("add r%d r%d r%d\n", reg1, reg2, reg3); 
     regs[ reg1 ] = regs[ reg2 ] + regs[ reg3 ]; 
     break; 
    case 3: 
     /* sub */ 
     printf("sub r%d r%d r%d\n", reg1, reg2, reg3); 
     regs[reg1] = regs[reg2] - regs[reg3]; 
     break; 
    case 4: 
     /* push */ 
     printf("push r%d\n", reg1); 
     push(reg1); 
     showStack(); 
     break; 
    } 
} 

/* display all registers as 4-digit hexadecimal words */ 
void showRegs() 
{ 
    int i; 
    printf("regs = "); 
    for(i=0; i<NUM_REGS; i++) 
    printf("%04X ", regs[ i ]); 
    printf("\n"); 
} 

/* show the stack as 4-digit hexadecimal words */ 
void showStack() 
{ 
    printf("stack = "); 
    for(i=0; i<10; i++) 
    printf("%04X ", stack[i]); 
    printf("\n"); 
} 

    void run() 
{ 
    while(running) 
    { 
    showRegs(); 
    int instr = fetch(); 
    decode(instr); 
    eval(); 
    } 
    showRegs(); 
    showStack(); 
} 

int main(int argc, const char * argv[]) 
{ 
    run(); 
    return 0; 
} 

им положительного, что все остальное является функциональным и хорошо работает , так что, если вы можете помочь с моей проблемой виртуального стека, дайте мне советы

+0

Разве это не просто 'stack [0] = regs [reg];'? – Jester

+0

да, спасибо, что это меня сбило с толку за 2 часа, я очень любезно, я должен был сразу это увидеть XD –

ответ

1

Мне жаль, что мне просто нужно было добавить: stack [0] = regs [reg]; как указано «Jester»