아래의 가상 머신은 bin 포인터에서 스택 오프셋을 가져 와서 하나씩 증가시키는 스택 증분 명령어에서 segfaulting합니다. 값 -1을 사용하면 올바르게 작동하지만 bp[1]
오프셋을 통해 -1
에 액세스하면 충돌이 발생합니다. 이것은 정말로 나에게 이해가 가지 않는다, 내가 뭘 잘못하고 있니?Mico C 가상 머신 세그먼트 화 오류
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
typedef enum {PUSH,STACKINC,EXIT} opCodes;
char * opCode[] = {"Push","Stack Increment","Exit"};
typedef struct VirtualMachine
{
uint32_t * sp; /* Stack Pointer */
uint32_t * bp; /* Bin Pointer */
uint32_t stack[100]; /* VM stack */
} VM;
void processVM(VM * vm)
{
uint32_t * bp = vm->bp;
uint32_t * sp = vm->sp;
printf("OP: %s\n",opCode[bp[0]]);
switch (bp[0])
{
case PUSH: sp[0] = bp[1]; sp++; bp+=2; break;
case STACKINC: sp[bp[1]]++; bp+=2; break;
}
vm->bp = bp;
vm->sp = sp;
/* Set out stack and bin pointers back */
}
int main()
{
uint32_t binFile[] = {PUSH,1,PUSH,2,PUSH,3,STACKINC,-1,EXIT};
VM myVM;
myVM.bp = binFile;
myVM.sp = myVM.stack;
while(myVM.bp[0] != EXIT)
{
processVM(&myVM);
usleep(200000);
}
printf("VM done executing\n");
}
당신 말이 맞아, 감사 !!!! 어리석은 오류 :-) – Andrew