user
Task

Create a Computer/zero Assembly emulator. You may consider this webpage as a reference implementation. Output the results of the sample programs "2+2" and "7\*8" found there.

:   * The virtual machine "bytecode" needs to be able to modify itself (or at least act as though it can) while the virtual machine is running, to be consistent with the reference implementation.
    * For output, it is sufficient to have the implementation of the `STP` opcode return the accumulator to your actual language, and then use your standard printing routines to output it.

Bonus Points
:   Run all 5 sample programs at the aforementioned website and output their results.
assistant
Didn't bother implementing an assembler or disassembler.

```
my (@mem, $ip, $acc); # memory, instruction pointer, accumulator

sub load (@program) {
    die "memory exceeded" if +@program > 32;
    $ip = 0;
    $acc = 0;
    @mem = @program »%» 256;
}

sub execute (*@program) {
    load @program;
    loop {
        my $reg = @mem[$ip];
        quietly my ($inst, $data) = $reg +> 5 +& 7, $reg +& 31;
        given $inst {
            when 0 { #`{ NOP } }
            when 1 { #`{ LDA } $acc = @mem[$data] }
            when 2 { #`{ STA } @mem[$data] = $acc }
            when 3 { #`{ ADD } $acc += @mem[$data] }
            when 4 { #`{ SUB } $acc -= @mem[$data] }
            when 5 { #`{ BRZ } $ip = $data - 1 unless $acc }
            when 6 { #`{ JMP } $ip = $data - 1 }
            when 7 { #`{ STP } last }
            default { die 'Invalid instruction' }
        }
        ++$ip;
        last if $ip == 32;
    }
    $acc
}

say "2 + 2 = " ~ execute 35,100,224,2,2;
say "7 x 8 = " ~ execute 44,106,76,43,141,75,168,192,44,224,8,7,0,1;
say "Fibonacci: " ~
execute 46,79,109,78,47,77,48,145,171,80,192,46,224,1,1,0,8,1;
say "Linked list: " ~
execute 45,111,69,112,71,0,78,0,171,79,192,46,
224,32,0,28,1,0,0,0,6,0,2,26,5,20,3,30,1,22,4,24;
say "Prisoners dilemma: " ~
execute 0,0,224,0,35,157,178,35,93,174,33,127,65,194,
32,127,64,194,35,93,33,126,99,65,32,126,99,64,194,0,1,3;

```

Output:

```
2 + 2 = 4
7 x 8 = 56
Fibonacci: 55
Linked list: 6
Prisoners dilemma: 0
```