ASMOperations 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 89740ea8468f7681e4df347d129c9dab9c6ed590
4
+ data.tar.gz: 309be8c07a634cd9d406bf7b558f9ce2f45d0865
5
+ SHA512:
6
+ metadata.gz: cc0be576c1f12c5d84eeae183345397f8581be793b442cbae6a0814e5ede53f343b9897691b2814da8cfcfac4838dff9e4f56705cc9e9a197f5fc40cbd033b6d
7
+ data.tar.gz: 8dac4feba9bb9d4757f9db6699a471baf3f7950f126f8ce7bfaac782ab3a91a8e16353ff3de0f7eb87b0a008c5f14b9bc7ad795e946a91758555cf5e11e40110
data/README.md ADDED
@@ -0,0 +1,18 @@
1
+ ###ASMOperations
2
+
3
+ [![Build Status](https://travis-ci.org/leftis/ASMOperations.svg?branch=master)](https://travis-ci.org/leftis/ASMOperations)
4
+ [![Coverage Status](https://img.shields.io/coveralls/leftis/ASMOperations.svg)](https://coveralls.io/r/leftis/ASMOperations)
5
+
6
+ I am reading Assembly Language for x86 Processors, 7/e - Kip Irvine this repository is the implementation in high level language wanted by the book.
7
+
8
+ ####Simple CLI added
9
+ ASMOperations ships with a basic thor cli. Run in your console
10
+ **asmp** and converting options will show up.
11
+
12
+ ####Intentions
13
+ - Add basic add, substractions operations between all types
14
+ - Add logic gates operations between all types
15
+ - Suggest more...
16
+
17
+ #####This project is for fun and about learning assembly as i describe on top of README.
18
+
data/bin/asmp ADDED
@@ -0,0 +1,48 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ lib = File.expand_path(File.dirname(__FILE__) + '/../lib')
4
+ $LOAD_PATH.unshift(lib) if File.directory?(lib) && !$LOAD_PATH.include?(lib)
5
+
6
+ require 'thor'
7
+ require 'asm_operations'
8
+ require 'pry'
9
+
10
+ module ASMOperations
11
+ class CLI < Thor
12
+ desc 'b2d', 'Converts binary to decimal'
13
+ def b2d(binary)
14
+ puts Binary.new(binary).to_decimal
15
+ end
16
+
17
+ desc 'b2h', 'Converts binary to hex'
18
+ def b2h(binary)
19
+ puts Binary.new(binary).to_hex
20
+ end
21
+
22
+ desc 'd2b', 'Converts decimal to binary'
23
+ def d2b(decimal)
24
+ decimal = Decimal.new(decimal)
25
+ puts decimal.binary
26
+ end
27
+
28
+ desc 'd2h', 'Converts decimal to hex'
29
+ def d2h(decimal)
30
+ decimal = Decimal.new(decimal)
31
+ puts decimal.to_hex
32
+ end
33
+
34
+ desc 'h2b', 'Converts hexademical to binary'
35
+ def h2b(hex)
36
+ hex = Hex.new(hex)
37
+ puts hex.binary
38
+ end
39
+
40
+ desc 'h2d', 'Converts hexademical to decimal'
41
+ def h2d(hex)
42
+ hex = Hex.new(hex)
43
+ puts b2d(hex.binary)
44
+ end
45
+ end
46
+ end
47
+
48
+ ASMOperations::CLI.start(ARGV)
@@ -0,0 +1,10 @@
1
+ module ASMOperations
2
+ HEX_TABLE = {
3
+ '0' => 0, '1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5, '6' => 6, '7' => 7,
4
+ '8' => 8, '9' => 9, 'A' =>10, 'B' =>11, 'C' =>12, 'D' =>13, 'E' =>14, 'F' => 15
5
+ }
6
+
7
+ autoload :Decimal, 'types/decimal'
8
+ autoload :Binary, 'types/binary'
9
+ autoload :Hex, 'types/hex'
10
+ end
@@ -0,0 +1,3 @@
1
+ module ASMOperations
2
+ VERSION = '0.0.1'
3
+ end
@@ -0,0 +1,63 @@
1
+ module ASMOperations
2
+ class Binary
3
+ attr_accessor :bit_count, :binary, :errors, :warnings
4
+
5
+ def initialize(unsigned_binary)
6
+ @errors, @warnings = [], []
7
+ @binary = unsigned_binary
8
+ @bit_count = count_bits and unsigned?
9
+ fix_bytes
10
+ end
11
+
12
+ def to_decimal
13
+ bits_powers.reduce(0) do |acc, pow|
14
+ acc += 2**pow
15
+ end
16
+ end
17
+
18
+ def to_hex
19
+ binary.split('').each_slice(4).to_a.map do |binary_slice|
20
+ decimal = Binary.new(binary_slice.join('')).to_decimal
21
+ ASMOperations::HEX_TABLE.invert[decimal]
22
+ end.join('')
23
+ end
24
+
25
+ private
26
+
27
+ def fix_bytes
28
+ return false if @binary.length == bit_count || bit_count == 0
29
+ remaining_bits = bit_count - @binary.length
30
+ @binary = Array.new(remaining_bits) { '0' }.join('') + @binary
31
+ end
32
+
33
+ def bits_powers
34
+ @binary.split('').reverse.map.with_index(0).to_a.map do |object|
35
+ next if object.first == '0'
36
+ object.last
37
+ end.compact
38
+ end
39
+
40
+ def unsigned?
41
+ return if @binary.split('').first == '0'
42
+ @warnings << 'Number is a signed one'
43
+ end
44
+
45
+ def count_bits
46
+ case @binary.split('').length
47
+ when 1..4
48
+ 4
49
+ when 5..8
50
+ 8
51
+ when 9..16
52
+ 16
53
+ when 17..32
54
+ 32
55
+ when 33..64
56
+ 64
57
+ else
58
+ @errors.push 'Not an 8 || 16 || 32 || 64 bit'
59
+ 0
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,23 @@
1
+ module ASMOperations
2
+ class Decimal < Binary
3
+ attr_accessor :decimal
4
+
5
+ def initialize(decimal)
6
+ @decimal = decimal
7
+ super(self.to_binary)
8
+ end
9
+
10
+ def to_binary
11
+ remaining, _bit = decimal.to_i, 0
12
+ bits = (remaining == 0 ? [0, 0, 0, 0] : [])
13
+
14
+ while remaining > 0
15
+ bits.push(remaining % 2)
16
+ remaining /= 2
17
+ end
18
+
19
+ bits.reverse!
20
+ bits.map!(&:to_s).join('')
21
+ end
22
+ end
23
+ end
data/lib/types/hex.rb ADDED
@@ -0,0 +1,25 @@
1
+ module ASMOperations
2
+ class Hex < Binary
3
+ attr_accessor :hex
4
+
5
+ def initialize(hex)
6
+ @hex = hex
7
+ super(to_binary)
8
+ end
9
+
10
+ def fix_byte(byte)
11
+ return byte if byte.length == 4 || byte.empty?
12
+ remaining_bits = 4 - byte.length
13
+ Array.new(remaining_bits) { '0' }.join('') + byte
14
+ end
15
+
16
+ def to_binary
17
+ binary = []
18
+ hex.split('').map do |element|
19
+ hexed_element = HEX_TABLE.keys.detect { |k| k.match(Regexp.new(element, Regexp::IGNORECASE)) }
20
+ binary << fix_byte(ASMOperations::Decimal.new(HEX_TABLE[hexed_element.to_s]).binary)
21
+ end
22
+ binary.join('')
23
+ end
24
+ end
25
+ end
metadata ADDED
@@ -0,0 +1,94 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ASMOperations
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Lefteris Georgatos
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-11-07 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: thor
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - '='
18
+ - !ruby/object:Gem::Version
19
+ version: 0.19.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - '='
25
+ - !ruby/object:Gem::Version
26
+ version: 0.19.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: rspec
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 3.1.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 3.1.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - '='
46
+ - !ruby/object:Gem::Version
47
+ version: 0.10.1
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - '='
53
+ - !ruby/object:Gem::Version
54
+ version: 0.10.1
55
+ description: Simple project, right now supports only basic types, later on i will
56
+ add more assembly operations
57
+ email: lefteros.georgatos@gmail.com
58
+ executables:
59
+ - asmp
60
+ extensions: []
61
+ extra_rdoc_files: []
62
+ files:
63
+ - README.md
64
+ - bin/asmp
65
+ - lib/asm_operations.rb
66
+ - lib/asm_operations/version.rb
67
+ - lib/types/binary.rb
68
+ - lib/types/decimal.rb
69
+ - lib/types/hex.rb
70
+ homepage: http://georgatos.gr
71
+ licenses:
72
+ - MIT
73
+ metadata: {}
74
+ post_install_message:
75
+ rdoc_options: []
76
+ require_paths:
77
+ - lib
78
+ required_ruby_version: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ required_rubygems_version: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: '0'
88
+ requirements: []
89
+ rubyforge_project:
90
+ rubygems_version: 2.2.2
91
+ signing_key:
92
+ specification_version: 4
93
+ summary: Assembly types and operations
94
+ test_files: []