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;
}
им положительного, что все остальное является функциональным и хорошо работает , так что, если вы можете помочь с моей проблемой виртуального стека, дайте мне советы
Разве это не просто 'stack [0] = regs [reg];'? – Jester
да, спасибо, что это меня сбило с толку за 2 часа, я очень любезно, я должен был сразу это увидеть XD –