예제 #1
0
파일: Assembler.cpp 프로젝트: olegp/tyro
bool Assembler::SetLabels(Assembly& assembly, LabelVector& labels)
{
  dword *bytecode = assembly.bytecode;
  dword curpos = assembly.curpos;

  size_t size = labels.size();
  for(dword *cp = bytecode; cp < bytecode + curpos; cp += 2) {
    if(IsJumpOp(cp[0])) {
      if(cp[1] < size) {
        dword pos = labels.at(cp[1]).pos;
        if(pos != -1)
          cp[1] = pos;
        else {
          // this is a common error
          printf("Label not found: %s\n", labels.at(cp[1]).label.c_str());
          labels.clear();
          return false;
        }
      } else {
        // if we get here, there's a bug in the assembler ;(
        printf("Label index not found: %d\n", cp[1]);
        labels.clear();
        return false;
      }
    }
  }
  
  labels.clear();
  return true;
}