Getting Started with x86 » History » Revision 71
« Previous |
Revision 71/87
(diff)
| Next »
Alexander Kamkin, 04/06/2017 08:18 PM
Getting Started with x86¶
Prerequisite¶
MicroTESK should be installed.
Demo Specifications¶
Specifications of the x86 (8086) instruction set architecture (ISA) can be found in $MICROTESK_HOME/arch/demo/x86/model/x86.nml.
Instruction are described in nML by means of the following constructs (move r16/r16 is taken as an example):
- the signature
op mov_r16r16 (dst: R16, src: R16)
- the assembly format
syntax = format("mov %s, %s", dst.syntax, src.syntax)
- the binary encoding
image = format("1000101111%s%s", dst.image, src.image)
- the semantics
action = { dst = src; ... }
To compile the ISA model, run the following command:
sh $MICROTESK_HOME/bin/compile.sh x86.nml
Demo Templates¶
Test templates for the x86 (8086) ISA can be found in $MICROTESK_HOME/arch/demo/x86/templates.
The directory contains a number of demo templates including the following ones:
block.rb | demonstrates how to use block constructs |
block_random.rb | demonstrates how to create randomized instruction sequences using block constructs |
euclid.rb | demonstrates test program simulation to predict the resulting microprocessor state |
random.rb | demonstrates how to randomize tests by using biases and distributions |
random_immediate.rb | demonstrates how to randomize immediate values |
random_registers.rb | demonstrates how to randomize registers (dependencies) |
Test templates are written in Ruby extended with specific constructs (let us look at block.rb):
- the code in the beginning includes the x86_base.rb file where a base template
X86BaseTemplate
is defined and declares aBlockTemplate
template:require_relative ''x86_base'' class BlockTemplate < X86BaseTemplate # BlockTemplate is a heir of @X86BaseTemplate@
- here comes a
run
method, which is a template entry point:def run
- this block produces a sequence consisting of three instructions:
sequence { # sequence: {mov, sub, add} mov_r16r16 ax, bx sub_r16r16 cx, dx # registers: fixed add_r16r16 r16(_), r16(_) # registers: randomized }.run
- this block produces an atomic sequence consisting of three instructions (atomic sequences are not interrupted while being merged with other ones):
atomic { # atomic sequence: {mov, add, sub} mov_r16r16 ax, bx add_r16r16 cx, dx sub_r16r16 r16(_), r16(_) }.run
- this block produces three sequences each consisting of one instruction:
iterate { # sequences: {{mov}, {sub}, {add}} mov_r16r16 ax, bx sub_r16r16 cx, dx add_r16r16 r16(_), r16(_) }.run
- this block produces four sequences each consisting of two instructions
the combinator constructs the Cartesian product of the nested sets of sequences, while the compositor randomly merges each tuple of the product into one sequence:block(:combinator => ''product'', :compositor => ''random'') { # combinator: {({sub}, {mov}), ({sub}, {sub}), ({add}, {mov}), ({add}, {sub})} # compositor: { {mov, sub}, {sub, sub}, {add, mov}, {sub, add} } iterate { # sequences: {{sub}, {add}} sub_r16r16 cx, dx add_r16r16 ax, bx } iterate { # sequences: {{mov}, {sub}} mov_r16r16 ax, bx sub_r16r16 r16(_), r16(_) } }.run
- merges two sequences in random fashion; atomic sequences are unmodifiable
block(:combinator => ''diagonal'', :compositor => ''random'', :obfuscator => ''random'') { sequence { sub_r16r16 bx, ax or_r16r16 cx, dx } atomic { prologue { comment ''Atomic starts'' } epilogue { comment ''Atomic ends'' } and_r16r16 r16(_), r16(_) } }.run
To generate test program(s) from a test template (in our case, from block.rb
), run the following command:
sh $MICROTESK_HOME/bin/generate.sh x86 block.rb --code-file-prefix block --code-file-extension s -v
When generation is finished, the resulting assembly code can be found in $MICROTESK_HOME
.
To compile the output file, run the following commands:
nasm -f elf block_0000.s ld -m i386pe -s -o block_0000 block_0000.o
To execute resulted test cases is possible by means of the online simulator
Updated by Alexander Kamkin over 7 years ago · 71 revisions