Well, let’s see if we can get some stuff straight here. First of all, there really isn’t such thing as a “simple CPU” if you want something that actually functions. I recommend the book “Computer Systems - A Programmer’s Perspective 2nd Edition” It goes through everything you need to do to simulate the x86 architecture (albeit with not quite as many instructions).
Things to consider when designing the cpu:
It’s not as simple as reading a file and calling a function that represents each line.
You’ll want to separate the different stages, such as getting the instructions (fetching), determining what they do (decoding), executing them, making changes to memory as needed, and then setting up the registers for the next cycle.
You’ll want to look into pipe-lining (basically what I mentioned above). There are different methods of pipe-lining though, so it’s good to know your options.
You’ll need registers to store temporary data.
You’ll need some memory for longer term storage.
You need to know what instructions you want to support and assign them all op-codes and operands. op code being the unique ID of an instruction and the operands being the information needed by the instruction to carry out whatever it does.
Labels are accomplished with a symbol table. You need map for each label and the address it corresponds to. This means you need to read through your assembly code twice. Once to build the symbol table and a second time to execute the instructions. (After being loaded into your memory) Symbols are used with jump instructions. So, when you call a jump, it’s as simple as getting the address from the symbol table and setting the program counter to that.
Interrupts are exactly what they sound like. Though, what you don’t understand is that is something that can be implemented on the code level. In your assembly code, you just create a subfunction that acts as the interrupt code to run, then whenever it needs to be called, you jump to it, and at the end of the subfunction, you return back to where you were. Case in point, that’s not something you need to implement in your simulator.
This is really an extensive topic. I spent an entire semester learning nothing but how the CPU works and building my own simulator. It’s not something you are going to be able to tackle in a few days time.