• Stars
    star
    381
  • Rank 112,502 (Top 3 %)
  • Language
    JavaScript
  • License
    GNU General Publi...
  • Created over 9 years ago
  • Updated almost 7 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A machine emulator that visualizes how each instruction is processed

visulator build status

A machine emulator that visualizes how each instruction is processed

Status

MAD SCIENCE

Play with it

API and Notes

Table of Contents generated with DocToc

cu::_byteRegPair

Used for byte sized operations on registers or a register pair.

In case a register pair is used the names of both registers are provided. In case only one register is used, the same code is used except we only use the first register of the pair.

Source:

cu::_dwordRegPair

Used for any operation that operates on a register pair mov, add, etc.

Same code used no matter of the pair size dword, word. For byte size general puropose regs we use @see _byteRegPair instead.

Operations for smaller pairs just have a different opcode than dword operations prefixing the pair.

Certain operations like add/sub only use first reg of the pair, addressing it via the pair code. In that case the operation may also be encoded in the reg pair code, i.e.

add ecx, ...  ; 83 c1 ... uses c1 to indicate ecx
sub ecx, ...  ; 83 e9 ... uses e9 to indicate ecx
cmp ecx, ...  ; 83 f9 ... uses f9 to indicate ecx
Source:

registers::_flagIndexes

Index of each flag in the eflags register.

Source:

registers::_flagMasks

Flags representation for each case of ONE flag set at a time. Used to isolate each flag for flag operations

Flag's Meanings

  • CF: carry flag set if the result of an add or shift operation carries out a bit beyond the destination operand; otherwise cleared
  • PF: parity flag set if the number of 1-bits in the low byte of the result is even, otherwise cleared
  • AF: adjust flag auxiliary carry used for 4-bit BCD math, set when an operation causes a carry out of a 4-bit BCD quantity
  • ZF: zero flag set if the result of an operation is zero, otherwise cleared
  • TF: trap flag for debuggers, permits operation of a processor in single-step mode
  • SF: sign flag set when the sign of the result forces the destination operand to become negative, i.e. its most significant bit is set
  • IF: interrupt enable flag determines whether or not the CPU will handle maskable hardware interrupts
  • DF: direction flag controls the left-to-right or right-to-left direction of string processing
  • OF: overflow flag set if the result is too large to fit in the destination operand

see: wiki flags register

Source:

auxiliary(dst, src) → {Boolean}

Determnies if a carry or borrow has been generated out of the least significant four bits when adding src to dst wiki

Parameters:
Name Type Description
dst Number

destination register

src Number

source register

Source:
Returns:

true if a half-carry occurs when adding src to dst, otherwise false

Type
Boolean

cu::_dec(opcode, asm, srcbytes, dstbytes)

Decrement a register

Parameters:
Name Type Description
opcode
asm
srcbytes
dstbytes
Source:

cu::_inc(opcode, asm, srcbytes, dstbytes)

Inccrement a register

Parameters:
Name Type Description
opcode
asm
srcbytes
dstbytes
Source:

cu::_movr(opcode, asm, srcbytes)

Moves one register into another. In order to execute this instruction we read the next code byte. It tells us which register pairs are affected (i.e. which register to move into which).

We look these up via a table.

Parameters:
Name Type Description
opcode Number
asm String
srcbytes Number

the size of the (sub)register to move

Source:

cu::next()

Fetches, decodes and executes next instruction and stores result.

This implementation totally ignores a few things about modern processors and instead uses a much simpler algorithm to fetch and execute instructions and store the results.

Here are some concepts that make modern processors faster, but are not employed here, followed by the simplified algorightm we actually use here.

Pipelining

  • instructions are processed in a pipe line fashion with about 5 stages, each happening in parallel for multiple instructions
    • load instruction
    • decode instruction
    • fetch data
    • execute instruction
    • write results for instruction
  • at a given time instruction A is loaded, B is decoded, data is fetched for C, D is executing and results for E are written
  • see: moores-law-in-it-architecture

Caches

  • modern processors have L1, L2 and L3 caches
  • L1 and L2 are on the processor while L3 is connected via a high speed bus
  • data that is used a lot and namely the stack and code about to be executed is usually found in one of these caches, saving a more expensive trip to main memory

Branch Prediction

  • in order to increase speed the processor tries to predict which branch of code is executed next in order to pre-fetch instructions
  • IA-64 replaces this by predication which even allows the processor to execute all possible branch paths in parallel

Translation to RISC like micro-instructions

  • starting with the Pentium Pro (P6) instructions are translated into RISC like micro-instructions
  • these micro-instructions are then executed (instead of the original ones) on a highly advanced core
  • see: pentium-pro-p6-6th-generation-x86-microarchitecture

Simplified Algorithm

  • 1) fetch next instruction (always from main memory -- caches don't exist here)
  • 2) decode instruction and decide what to do
  • 3) execute instruction, some directly here and others via the ALU
  • 4) store the result in registers/memory
  • 5) goto 1

  • and 2. basically become one step since we just call a function named after the opcode of the mnemonic.

We then fetch more bytes from the code in order to complete the instruction from memory (something that is inefficient and not done in the real world, where multiple instructions are pre-fetched instead).

The decoder is authored using this information.

Source:

cu:_push_reg(opcode)

Push 32 bit register onto stack. x50

50   push   eax
51   push   ecx
53   push   ebx
52   push   edx
54   push   esp
55   push   ebp
56   push   esi
57   push   edi
Parameters:
Name Type Description
opcode
Source:

hexstring(x)

Converts given number to a two digit hex str

Parameters:
Name Type Description
x Number

number between 0x00 and 0xff

Source:
Returns:

two digit string representation

leBytes(val, nbytes) → {Array.<Number>}

Antidote to leVal. Converts a value into a buffer of n bytes ordered little endian.

Parameters:
Name Type Argument Description
val Number

value 8, 16 or 32 bits

nbytes Number <optional>

number of bytes of the value to include (default: 4)

Source:
Returns:

byte representation of the given @see val

Type
Array.<Number>

leVal(bytes, nbytes) → {Number}

Calculates value of little endian ordered bytes.

leVal([ 0x00, 0x00, 0x00, 0x00 ]) // => 0x00 00 00 ff (            0)
leVal([ 0x01, 0x00, 0x00, 0x00 ]) // => 0x00 00 00 ff (            1)
leVal([ 0xff, 0x00, 0x00, 0x00 ]) // => 0x00 00 00 ff (          255)
leVal([ 0x00, 0x01, 0x00, 0x00 ]) // => 0x00 00 01 00 (          256)
leVal([ 0x01, 0x01, 0x00, 0x00 ]) // => 0x00 00 01 01 (          257)
leVal([ 0xff, 0x01, 0x00, 0x00 ]) // => 0x00 00 01 ff (          511)
leVal([ 0xff, 0xff, 0x00, 0x00 ]) // => 0x00 00 ff ff (       65,535)
leVal([ 0x00, 0x00, 0xff, 0x00 ]) // => 0x00 ff 00 00 (   16,711,680)
leVal([ 0xff, 0xff, 0xff, 0x00 ]) // => 0x00 ff ff ff (  16,777,215 )
leVal([ 0x00, 0x00, 0x00, 0x0f ]) // => 0x0f 00 00 00 ( 251,658,240 )
leVal([ 0x00, 0x00, 0x00, 0xf0 ]) // => 0xf0 00 00 00 (4,026,531,840)
leVal([ 0x00, 0x00, 0x00, 0xff ]) // => 0xff 00 00 00 (4,278,190,080)
leVal([ 0xff, 0xff, 0xff, 0xff ]) // => 0xff ff ff ff (4,294,967,295)
Parameters:
Name Type Argument Description
bytes Array.<Number>

bytes that contain number representation

nbytes Number <optional>

number of bytes, if not given it is deduced

Source:
Returns:

number contained in bytes

Type
Number

overflow(op1, op2, res, nbytes) → {Boolean}

Calculates if an overflow occurred due to the last arithmetic operation.

The overflow flag is set when the most significant bit (sign bit) is changed by adding two numbers with the same sign or subtracting two numbers with opposite signs.

A negative result out of positive operands (or vice versa) is an overflow.

overflow flag

Parameters:
Name Type Description
op1 Number

first operand of the arithmetic operation

op2 Number

second operand of the arithmetic operation

res Number

result of the arithmetic operation

nbytes Number

byte sizes of the operands and the result

Source:
Returns:

true if an overflow occurred, otherwise false

Type
Boolean

parity(v) → {Number}

Calculates parity of a given number and returns value to set parity flag to.

Mostly used to check for serial data communications correctness checking:

parity bit, or check bit is a bit added to the end of a string of binary code that indicates whether the number of bits in the string with the value one is even or odd. Parity bits are used as the simplest form of error detecting code. To determine odd parity if the sum of bits with a value of 1 is odd, the parity bit's value is set to zero.

Summary - parity flag is set to 0 if the number of set bits is odd - parity flag is set to 1 if the number of set bits is even

This method takes around 9 operations, and works for 32-bit words. It first shifts and XORs the eight nibbles of the 32-bit value together, leaving the result in the lowest nibble of v. Next, the binary number 0110 1001 1001 0110 (0x6996 in hex) is shifted to the right by the value represented in the lowest nibble of v. This number is like a miniature 16-bit parity-table indexed by the low four bits in v. The result has the parity of v in bit 1, which is masked and returned.

bithacks

x86 parity only applies to the low 8 bits x86 caveat

Parameters:
Name Type Description
v Number

32-bit number to get parity for

Source:
Returns:

0 if odd, otherwise 1

Type
Number

registers::_createRegister(k)

Registers are stored as a 4 byte array in order to allow accessing sub registers like ax, ah and al easily.

The byte order is little endian to be consistent with how things are stored in memory and thus be able to use the same store/load functions we use for the latter.

As an example eax is stored as follows:

this._eax = [
0x0 // al
, 0x0 // ah
, 0x0 // lower byte of upper word
, 0x0 // upper byte of upper word
]

Each register part can be accessed via a property, i.e. regs.ah, regs.ax.

Parameters:
Name Type Description
k String

the name of the register

Source:

registers::assign(regs)

Assigns given registers with the supplied values. Leaves all other flags alone.

Parameters:
Name Type Description
regs
Source:

registers::clearFlag(flag)

Clears a given flag

First we invert the mask for the flag to clear. Then we and the flags with that mask which clears our flag since that's the only bit in the mask that's 0.

Parameters:
Name Type Description
flag
Source:

registers::getFlag(flag) → {Number}

Returns a given flag

First masks out the bit of the flag we are interested in and then shifts our flag bit into lowest bit.

Parameters:
Name Type Description
flag
Source:
Returns:

1 if flag is set, otherwise 0

Type
Number

registers::setFlag(flag)

Sets a given flag

ors flags with mask that will preserve all other flags and set our flag since that bit is set in the mask.

Parameters:
Name Type Description
flag
Source:

signed(v, nbytes) → {Boolean}

Determines if a number is signed, i.e. the most significant bit is set

bithacks

Parameters:
Name Type Description
v Number

to check for signedness

nbytes Number

size of the value in bytes

Source:
Returns:

true if number is signed, otherwise false

Type
Boolean

generated with docme

License

GPL3

More Repositories

1

doctoc

📜 Generates table of contents for markdown files inside local git repository. Links are compatible with anchors generated by github or other sites.
JavaScript
4,207
star
2

proxyquire

🔮 Proxies nodejs require in order to allow overriding dependencies during testing.
JavaScript
2,748
star
3

v8-perf

⏱️ Notes and resources related to v8 and thus Node.js performance
JavaScript
2,229
star
4

deoptigate

⏱️ Investigates v8/Node.js function deoptimizations.
JavaScript
1,157
star
5

brace

📔 browserify compatible version of the ace editor.
JavaScript
1,060
star
6

browserify-shim

📩 Makes CommonJS incompatible files browserifyable.
JavaScript
935
star
7

learnuv

Learn uv for fun and profit, a self guided workshop to the library that powers Node.js.
C
711
star
8

es6ify

browserify >=v2 transform to compile JavaScript.next (ES6) to JavaScript.current (ES5) on the fly.
JavaScript
595
star
9

exorcist

Externalizes the source map found inside a stream to an external .js.map file
JavaScript
331
star
10

parse-link-header

Parses a link header and returns paging information for each contained link.
JavaScript
298
star
11

libuv-dox

Documenting types and methods of libuv, mostly by reading 'uv.h'.
247
star
12

rid-examples

Examples showing how to use Rid in order to build Dart/Flutter apps integrated with Rust.
Dart
215
star
13

replpad

Pipes content of files to a node repl whenever they change to enable a highly interactive coding experience.
JavaScript
213
star
14

browserify-ftw

Converts an entire project that uses requirejs amd into on that uses nodejs common modules so it can be browserified.
JavaScript
188
star
15

cardinal

Syntax highlights JavaScript code with ANSI colors to be printed to the terminal.
JavaScript
175
star
16

turbolizer

Turbolizer tool from the v8 repository with added support to preload a profile
JavaScript
175
star
17

convert-source-map

Converts a source-map from/to different formats.
JavaScript
169
star
18

cpuprofilify

Converts output of various profiling/sampling tools to the .cpuprofile format so it can be loaded into Chrome DevTools.
JavaScript
167
star
19

flamegraph

Generates flamegraphs with Node.js or in the browser.
HTML
164
star
20

proxyquireify

browserify >= v2 version of proxyquire. Mocks out browserify's require to allow stubbing out dependencies while testing.
JavaScript
153
star
21

batufo

UFO mutli-player game using Flutter.
Dart
152
star
22

spok

Checks a given object against a given specification to keep you from writing boilerplate tests.
TypeScript
147
star
23

v8-flags

Configures v8 flags at runtime.
C
119
star
24

wasm2js

Compile WebAssembly .wasm files to a commonjs module.
JavaScript
110
star
25

browserify-markdown-editor

A demo showing how to build a markdown editor with browserify and marked.
JavaScript
91
star
26

combine-source-map

Add source maps of multiple files, offset them and then combine them into one source map.
JavaScript
78
star
27

nad

Node Addon Developer, a tool to inject your addon code into a copy of the node codebase in order to integrate with IDEs and debuggers easily.
JavaScript
76
star
28

irish-pub

Feel like npm is drunk or maybe you are and want to verify what gets published via `npm publish`? irish-pub has you covered.
JavaScript
69
star
29

rid

Rust integrated Dart framework providing an easy way to build Flutter apps with Rust.
Rust
65
star
30

hypernal

Renders terminal output as html to simplify reusing server side modules in the browser.
JavaScript
64
star
31

exposify

browserify transform that exposes globals added via a script tag as modules so they can be required.
JavaScript
63
star
32

nif

node --inspect a file and open devtool url in chrome via chrome-cli.
JavaScript
60
star
33

active-handles

Prints out information about the process's active handles, including function source and location
JavaScript
58
star
34

doctoc-web

This is the source of the DocToc web application.
JavaScript
56
star
35

traceviewify

Converts .cpuprofile format to trace viewer JSON object format to allow analysing the data in chrome://tracing.
JavaScript
55
star
36

readline-vim

Adds vim bindings to nodejs readline.
JavaScript
55
star
37

docme

Generates github compatible API documentation from your project's jsdocs and adds them to your Readme.
JavaScript
54
star
38

bunyan-format

Writable stream that formats bunyan records that are piped into it
JavaScript
51
star
39

wicked

Generates github wiki compatible API documentation from your project's jsdocs and adds them to your wiki.
JavaScript
49
star
40

lldb-jbt

Adds JavaScript symbols to lldb stack traces
Python
48
star
41

phe

Poker hand evaluator
JavaScript
47
star
42

d3-gauge

Gauge visualization built on top of d3.
CSS
45
star
43

dev-null

/dev/null for node streams
JavaScript
43
star
44

WebToInk

Downloads and converts a properly set up Html book or a blog into mobi format
Haskell
40
star
45

docmac

Install docker on Mac including VirtualBox and boot2docker dependencies with one simple command.
Shell
39
star
46

stack-mapper

Initialize it with a source map, then feed it error stacks to have the trace locations mapped to the original files.
JavaScript
39
star
47

stream-viz

Visualizes streams in the browser.
JavaScript
37
star
48

dotfiles

My vim and bash related dotfiles.
Shell
36
star
49

iojs-inspect-entire-stack

Demonstrating how to inspect the entire io.js stack
JavaScript
36
star
50

hermit

Prints html in the terminal using colors and simple layout to reflect the document structure.
JavaScript
36
star
51

v8-map-processor

Processes and visualizes maps (aka hidden classes) created by v8 during execution.
HTML
35
star
52

mold-source-map

Mold a source map that is almost perfect for you into one that is.
JavaScript
35
star
53

bromote

Tool to setup and require remote scripts with browserify.
JavaScript
35
star
54

log.h

Minimal yet colorful logging lib.
C
34
star
55

inline-source-map

Adds source mappings and base64 encodes them, so they can be inlined in your generated file.
JavaScript
34
star
56

testlingify

Adds github hooks and browser config for testling.
JavaScript
33
star
57

browserify-swap

A transform that swaps out modules according to a config in your package.json selected via an environment variable.
JavaScript
32
star
58

v8-profiling

Exploring how to hook into the various v8 profilers
C++
32
star
59

scriptie-talkie

Makes your code tell you what the intermediate results are when executing a script.
JavaScript
31
star
60

ee.c

EventEmitter in C.
C
30
star
61

resolve-bin

Resolves the full path to the bin file of a given package by inspecting the \"bin\" field in its package.json.
JavaScript
30
star
62

node-syntaxhighlighter

Node friendly version of Alex Gorbachev's great SyntaxHighlighter.
CSS
29
star
63

v8-runtime-functions

Exposing and documenting v8 runtime functions.
JavaScript
27
star
64

anchor-markdown-header

Generates an anchor for a markdown header.
JavaScript
27
star
65

hyperwatch

Streams server side log messages to the browser and renders them inside your page.
JavaScript
27
star
66

sass-resolve

Resolves all sass files in current project and all dependencies to create one sass file which includes them all.
JavaScript
26
star
67

ansicolors

Functions that surround a string with ansicolor codes so it prints in color.
JavaScript
26
star
68

dockerify

Prepares any tarball containing a project so that a docker image can be built from it.
JavaScript
26
star
69

spinup

Spins up multiple versions of your app, each in its own docker container
JavaScript
25
star
70

redeyed

Takes JavaScript code, along with a config and returns the original code with tokens wrapped and/or replaced as configured.
JavaScript
25
star
71

nasmx

The NASMX Project (manually maintained mirror) Documentation: https://thlorenz.github.io/nasmx
Assembly
25
star
72

find-parent-dir

Finds the first parent directory that contains a given file or directory.
JavaScript
24
star
73

dox

Notes and cheat sheets on various topics
DTrace
23
star
74

benchgraph

Runs {io,node}.js benchmarks and generates pretty graphs
JavaScript
22
star
75

kebab

Half queue half pubsub. Super small (< 30 loc) and simple queue that supports subscribers.
JavaScript
22
star
76

pong.asm

pong game written in assembly for i386 (32-bit) architecture.
Assembly
22
star
77

peacock

JavaScript syntax highlighter that generates pygments compatible html and therefore supports pygments styles.
CSS
22
star
78

linuxasmtools

This package is part of AsmTools (a collection of programs for assembler development on Linux X86 cpu's.)
Assembly
22
star
79

talks

Numerous talks I gave at meetups and conferences some based on reveal.js.
HTML
20
star
80

valiquire

Validates that all require statements in a project point to an existing path and are correctly cased.
JavaScript
20
star
81

chromium-remote-debugging-proxy

A proxy that sits in between a chromium devtools frontend and the remote chromium being debugged and logs requests, responses and websocket messages that are exchanged.
JavaScript
20
star
82

prange

Parses poker hand range short notation into a range array.
JavaScript
19
star
83

jsdoc-githubify

A transform that adapts html files generated with jsdoc to be rendered in a github wiki or readme.
JavaScript
19
star
84

ocat

Inspect an object various ways in order to easily generate test cases.
JavaScript
17
star
85

v8-sandbox

C++
17
star
86

hhp

Poker HandHistory Parser
JavaScript
16
star
87

node-traceur

Mirror of experimental ES6 to ES5 compiler that is kept in sync with code on google.
JavaScript
16
star
88

v8-ic-processor

Processes and visualizes IC (inline cache) information collected for functions in your application
HTML
16
star
89

pec

Poker equity calculator. Compares two combos or one combo against a range to compute winning equity.
JavaScript
16
star
90

floodgate

Throttles a stream to pass one value per given interval.
JavaScript
16
star
91

level-dump

Dumps all values and/or keys of a level db or a sublevel to the console.
JavaScript
15
star
92

tap-stream

Taps a nodejs stream and logs the data that's coming through
JavaScript
14
star
93

parse-key

Parses strings into key objects of the same format as the ones emitted by nodejs readline.
JavaScript
14
star
94

nf-rated

Store and process Netflix movies including IMDB rating.
Rust
14
star
95

dockops

docker convenience functions on top of dockerode
JavaScript
14
star
96

lib.asm

Collection of assembly routines in one place to facilitate reuse.
Assembly
13
star
97

sql-escape-string

Simple SQL string escape.
JavaScript
13
star
98

caching-coffeeify

A coffeeify version that caches previously compiled coffee-script to optimize the coffee-script compilation step.
JavaScript
13
star
99

cathode

Example for react server side rendering without the fluff
JavaScript
11
star
100

dog

Developer blOGgin Engine, markdown based, made to be simple and fast, yet feature rich.
JavaScript
11
star