Assembler interpreter (part II)
Description:
This is the second part of this kata series. First part is here.
We want to create an interpreter of assembler which will support the following instructions:
mov x, y
- copy y (either an integer or the value of a register) into register x.inc x
- increase the content of register x by one.dec x
- decrease the content of register x by one.add x, y
- add the content of the register x with y (either an integer or the value of a register) and stores the result in x (i.e. register[x] += y).sub x, y
- subtract y (either an integer or the value of a register) from the register x and stores the result in x (i.e. register[x] -= y).mul x, y
- same with multiply (i.e. register[x] *= y).div x, y
- same with integer division (i.e. register[x] /= y).label:
- define a label position (label = identifier + ":"
, an identifier being a string that does not match any other command). Jump commands andcall
are aimed to these labels positions in the program.jmp lbl
- jumps to the labellbl
.cmp x, y
- compares x (either an integer or the value of a register) and y (either an integer or the value of a register). The result is used in the conditional jumps (jne
,je
,jge
,jg
,jle
andjl
)jne lbl
- jump to the labellbl
if the values of the previouscmp
command were not equal.je lbl
- jump to the labellbl
if the values of the previouscmp
command were equal.jge lbl
- jump to the labellbl
if x was greater or equal than y in the previouscmp
command.jg lbl
- jump to the labellbl
if x was greater than y in the previouscmp
command.jle lbl
- jump to the labellbl
if x was less or equal than y in the previouscmp
command.jl lbl
- jump to the labellbl
if x was less than y in the previouscmp
command.call lbl
- call to the subroutine identified bylbl
. When aret
is found in a subroutine, the instruction pointer should return to the instruction next to thiscall
command.ret
- when aret
is found in a subroutine, the instruction pointer should return to the instruction that called the current function.msg 'Register: ', x
- this instruction stores the output of the program. It may contain text strings (delimited by single quotes) and registers. The number of arguments isn't limited and will vary, depending on the program.end
- this instruction indicates that the program ends correctly, so the stored output is returned (if the program terminates without this instruction it should return the default output: see below).; comment
- comments should not be taken in consideration during the execution of the program.
Output format:
The normal output format is a string (returned with the end
command). For Scala and Rust programming languages it should be incapsulated into Option.
If the program does finish itself without using an end
instruction, the default return value is:
-1 (as an integer)
Input format:
The function/method will take as input a multiline string of instructions, delimited with EOL characters. Please, note that the instructions may also have indentation for readability purposes.
For example:
program = """
; My first program
mov a, 5
inc a
call function
msg '(5+1)/2 = ', a ; output message
end
function:
div a, 2
ret
"""
assembler_interpreter(program)
The above code would set register a
to 5, increase its value by 1, calls the subroutine function, divide its value by 2, returns to the first call instruction, prepares the output of the program and then returns it with the end
instruction. In this case, the output would be (5+1)/2 = 3
.
Similar Kata:
Stats:
Created | Apr 6, 2017 |
Published | Apr 6, 2017 |
Warriors Trained | 10826 |
Total Skips | 2104 |
Total Code Submissions | 19823 |
Total Times Completed | 2757 |
Python Completions | 1029 |
Java Completions | 312 |
JavaScript Completions | 663 |
CoffeeScript Completions | 10 |
Swift Completions | 38 |
C# Completions | 223 |
Ruby Completions | 60 |
C++ Completions | 200 |
C Completions | 65 |
Scala Completions | 35 |
Rust Completions | 182 |
Haskell Completions | 49 |
COBOL Completions | 4 |
Total Stars | 883 |
% of votes with a positive feedback rating | 97% of 700 |
Total "Very Satisfied" Votes | 669 |
Total "Somewhat Satisfied" Votes | 23 |
Total "Not Satisfied" Votes | 8 |
Total Rank Assessments | 5 |
Average Assessed Rank | 2 kyu |
Highest Assessed Rank | 2 kyu |
Lowest Assessed Rank | 4 kyu |