File: hex0.hex0

package info (click to toggle)
mescc-tools 1.5.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 1,640 kB
  • sloc: ansic: 9,338; asm: 2,350; sh: 360; makefile: 163; lisp: 83
file content (152 lines) | stat: -rw-r--r-- 5,904 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
## Copyright (C) 2016 Jeremiah Orians
## This file is part of stage0.
##
## stage0 is free software: you can redistribute it and/or modify
## it under the terms of the GNU General Public License as published by
## the Free Software Foundation, either version 3 of the License, or
## (at your option) any later version.
##
## stage0 is distributed in the hope that it will be useful,
## but WITHOUT ANY WARRANTY; without even the implied warranty of
## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
## GNU General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with stage0.  If not, see <http://www.gnu.org/licenses/>.

## Self Bootstrapping Hex Assembler written in Hex
## And a shitload of comments
## That can be converted to assembly and compiled

## If you were linked to this file and have come to assume that the elf header
## is indicative of a dependency of on linux, unix or even operating systems you
## would be mistaken, this is not the bootstrap work that is hardware native,
## that work would be located here: http://git.savannah.nongnu.org/cgit/stage0.git
## This repository is for solely providing tools enabling one to arbitrary verify
## All of the steps and the binaries produced for arbitrary hardware platforms on
## Any arbitrary hardware platform they choose.
## This of course being an example of an arbitrary Linux bootstrap for those not
## Comfortable with native hardware bootstraps and need a simple example to follow

## ELF Header
7F 45 4C 46        ## e_ident[EI_MAG0-3] ELF's magic number
02                 ## e_ident[EI_CLASS] Indicating 64 bit
01                 ## e_ident[EI_DATA] Indicating little endianness
01                 ## e_ident[EI_VERSION] Indicating original elf
03                 ## e_ident[EI_OSABI] Set at 3 because FreeBSD is strict
00                 ## e_ident[EI_ABIVERSION] See above
00 00 00 00 00 00 00 ## e_ident[EI_PAD]
02 00              ## e_type Indicating Executable
3E 00              ## e_machine Indicating AMD64
01 00 00 00        ## e_version Indicating original elf
FB 00 60 00 00 00 00 00 ## e_entry Address of the entry point
40 00 00 00 00 00 00 00 ## e_phoff Address of program header table
00 00 00 00 00 00 00 00 ## e_shoff Address of section header table
00 00 00 00        ## e_flags
40 00              ## e_ehsize Indicating our 64 Byte header
38 00              ## e_phentsize size of a program header table
01 00              ## e_phnum number of entries in program table
00 00              ## e_shentsize size of a section header table
00 00              ## e_shnum number of entries in section table
00 00              ## e_shstrndx index of the section names

## Program Header table
01 00 00 00             ## p_type
07 00 00 00             ## ph_flags: PF-X|PF-W|PF-R = 7
00 00 00 00 00 00 00 00 ## p_offset
00 00 60 00 00 00 00 00 ## p_vaddr
00 00 00 00 00 00 00 00 ## Undefined
9B 01 00 00 00 00 00 00 ## p_filesz
9B 01 00 00 00 00 00 00 ## p_memsz
00 00 20 00 00 00 00 00 ## Required alignment

## Hex
48 83 f8 23        # cmp $0x23,%rax
74 26              # je 6000a4 <purge_comment>
48 83 f8 30        # cmp $0x30,%rax
7c 6f              # jl 6000f3 <ascii_other>
48 83 f8 3a        # cmp $0x3a,%rax
7c 5a              # jl 6000e4 <ascii_num>
48 83 f8 41        # cmp $0x41,%rax
7c 63              # jl 6000f3 <ascii_other>
48 83 f8 47        # cmp $0x47,%rax
7c 58              # jl 6000ee <ascii_high>
48 83 f8 61        # cmp $0x61,%rax
7c 57              # jl 6000f3 <ascii_other>
48 83 f8 67        # cmp $0x67,%rax
7c 47              # jl 6000e9 <ascii_low>
eb 4f              # jmp 6000f3 <ascii_other>

## Purge Comment
48 c7 c2 01 00 00 00 # mov $0x1,%rdx
48 c7 c6 99 01 60 00 # mov $0x600199,%rsi
48 c7 c7 00 00 00 00 # mov $0x0,%rdi
48 c7 c0 00 00 00 00 # mov $0x0,%rax
0f 05                # syscall
48 85 c0             # test %rax,%rax
0f 84 be 00 00 00    # je 600189 <Done>
8a 04 25 99 01 60 00 # mov 0x600199,%al
48 0f b6 c0          # movzbq %al,%rax
48 83 f8 0a          # cmp $0xa,%rax
75 c8                # jne 6000a4 <purge_comment>
48 c7 c0 ff ff ff ff # mov $0xffffffffffffffff,%rax
c3                   # retq

## ascii num
48 83 e8 30          # sub $0x30,%rax
c3                   # retq

## ascii low
48 83 e8 57          # sub $0x57,%rax
c3                   # retq

## ascii high
48 83 e8 37          # sub $0x37,%rax
c3                   # retq

## ascii other
48 c7 c0 ff ff ff ff # mov $0xffffffffffffffff,%rax
c3                   # retq

## start
49 c7 c7 ff ff ff ff # mov $0xffffffffffffffff,%r15
49 c7 c6 00 00 00 00 # mov $0x0,%r14

## Loop
48 c7 c2 01 00 00 00 # mov $0x1,%rdx
48 c7 c6 99 01 60 00 # mov $0x600199,%rsi
48 c7 c7 00 00 00 00 # mov $0x0,%rdi
48 c7 c0 00 00 00 00 # mov $0x0,%rax
0f 05                # syscall
48 85 c0             # test %rax,%rax
74 5d                # je 600189 <Done>
8a 04 25 99 01 60 00 # mov 0x600199,%al
48 0f b6 c0          # movzbq %al,%rax
e8 3c ff ff ff       # callq 600078 <hex>
48 83 f8 00          # cmp $0x0,%rax
7c c7                # jl 600109 <loop>
49 83 ff 00          # cmp $0x0,%r15
7d 0c                # jge 600154 <print>
49 89 c6             # mov %rax,%r14
49 c7 c7 00 00 00 00 # mov $0x0,%r15
eb b5                # jmp 600109 <loop>

## print
49 c1 e6 04          # shl $0x4,%r14
4c 01 f0             # add %r14,%rax
88 04 25 9a 01 60 00 # mov %al,0x60019a
49 c7 c7 ff ff ff ff # mov $0xffffffffffffffff,%r15
48 c7 c2 01 00 00 00 # mov $0x1,%rdx
48 c7 c6 9a 01 60 00 # mov $0x60019a,%rsi
48 c7 c7 01 00 00 00 # mov $0x1,%rdi
48 c7 c0 01 00 00 00 # mov $0x1,%rax
0f 05                # syscall
eb 80                # jmp 600109 <loop>

## Done
48 c7 c7 00 00 00 00 # mov $0x0,%rdi
48 c7 c0 3c 00 00 00 # mov $0x3c,%rax
0f 05                # syscall

## Place for input, This actually isn't required but here it is
02 00 00