Initial starting point for the creation of our hex bootstrap toolchain

This commit is contained in:
Jeremiah Orians 2016-05-01 09:03:41 -04:00
commit 02d5888f16
No known key found for this signature in database
GPG Key ID: 7457821534D2ACCD
5 changed files with 264 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
bin/
tmp/

50
exec_enable.s Normal file
View File

@ -0,0 +1,50 @@
.text # section declaration
msg:
.string "needs a proper file name\n"
len = . - msg # length of our dear string
# we must export the entry point to the ELF linker or loader.
# They convientionally recognize _start as their entry point.
# Use ld -e main to override the default if you wish
.global _start
_start:
# first check that we got the correct number of inputs
pop %rax # Get the number of arguments
pop %rdi # Get the program name
pop %rdi # Get the actual argument
# Check if we have the correct number of inputs
cmp $2, %rax
# Jump to Bail if the number is not correct
jne Bail
# Load our preferred mode
mov $0755, %rsi
# Load the syscall number for chmod
mov $90, %rax
# Call the kernel
syscall
Done:
# program completed Successfully
mov $0, %rdi # All is well
mov $60, %rax # put the exit syscall number in eax
syscall # Call it a good day
Bail:
# first let the user know what was wrong
mov $len,%rdx # third argument: message length
mov $msg,%rsi # second argument: pointer to message to write
mov $1,%rdi # first argument: file handle (stdout)
mov $1,%rax # system call number (sys_write)
syscall # call kernel
# Second terminate with an error
mov $1, %rdi # there was an error
mov $60, %rax # put the exit syscall number in eax
syscall # bail out

137
hex1.s Normal file
View File

@ -0,0 +1,137 @@
.text # section declaration
# we must export the entry point to the ELF linker or loader.
# They convientionally recognize _start as their entry point.
# Use ld -e main to override the default if you wish
.global _start
hex:
# Purge Comment Lines
cmp $35, %rax
je purge_comment
# deal all ascii less than 0
cmp $48, %rax
jl ascii_other
# deal with 0-9
cmp $58, %rax
jl ascii_num
# deal with all ascii less than A
cmp $65, %rax
jl ascii_other
# deal with A-F
cmp $71, %rax
jl ascii_high
#deal with all ascii less than a
cmp $97, %rax
jl ascii_other
#deal with a-f
cmp $103, %rax
jl ascii_low
# The rest that remains needs to be ignored
jmp ascii_other
purge_comment:
# Attempt to read 1 byte from STDIN
mov $1, %rdx # set the size of chars we want
mov $input, %rsi # Where to put it
mov $0, %rdi # Where are we reading from
mov $0, %rax # the syscall number for read
syscall # call the Kernel
test %rax, %rax # check what we got
jz Done # Got EOF call it done
# load byte
movb input, %al # load char
movzx %al, %rax # We have to zero extend it to use it
# Loop if not LF
cmp $10, %rax
jne purge_comment
# Otherwise return -1
mov $-1, %rax
ret
ascii_num:
sub $48, %rax
ret
ascii_low:
sub $87, %rax
ret
ascii_high:
sub $55, %rax
ret
ascii_other:
mov $-1, %rax
ret
_start:
# Our flag for byte processing
mov $-1, %r15
# temp storage for the sum
mov $0, %r14
loop:
# Attempt to read 1 byte from STDIN
mov $1, %rdx # set the size of chars we want
mov $input, %rsi # Where to put it
mov $0, %rdi # Where are we reading from
mov $0, %rax # the syscall number for read
syscall # call the Kernel
test %rax, %rax # check what we got
jz Done # Got EOF call it done
# load byte
movb input, %al # load char
movzx %al, %rax # We have to zero extend it to use it
# process byte
call hex
# deal with -1 values
cmp $0, %rax
jl loop
# deal with toggle
cmp $0, %r15
jge print
# process first byte of pair
mov %rax, %r14
mov $0, %r15
jmp loop
# process second byte of pair
print:
# update the sum and store in output
shl $4, %r14
add %r14, %rax
mov %al, output
# flip the toggle
mov $-1, %r15
# Print our first Hex
mov $1, %rdx # set the size of chars we want
mov $output, %rsi # What we are writing
mov $1, %rdi # Stdout File Descriptor
mov $1, %rax # the syscall number for write
syscall # call the Kernel
jmp loop
Done:
# program completed Successfully
mov $0, %rdi # All is well
mov $60, %rax # put the exit syscall number in eax
syscall # Call it a good day
# Our writable space
.data
read_size = 2
input:
.byte read_size
output:
.byte 0x00

12
test.sh Executable file
View File

@ -0,0 +1,12 @@
#!/bin/bash
# Build new
./hex2 < hex2_1.hex | sponge trial && ./exec_enable trial
# Test compile
./trial < foo > example2
readelf -a trial > summary2
# Check results
sha256sum example* summary*

63
xeh1.s Normal file
View File

@ -0,0 +1,63 @@
.text # section declaration
output: .byte 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x0A
# we must export the entry point to the ELF linker or loader.
# They convientionally recognize _start as their entry point.
# Use ld -e main to override the default if you wish
.global _start
_start:
loop:
# Attempt to read a single byte from STDIN
mov $1, %rdx # set the size of chars we want
mov $input, %rsi # Where to put it
mov $0, %rdi # Where are we reading from
mov $0, %rax # the syscall number for read
syscall # call the Kernel
# If we didn't read any bytes jump to Done
test %rax, %rax # check what we got
jz Done # Got EOF call it done
# Move our byte into registers for processing
movb input, %al # load char
movzx %al, %r12 # We have to zero extend it to use it
movzx %al, %r13 # We have to zero extend it to use it
# Break out the nibbles
shr $4, %r12 # Purge the bottom 4 bits
and $0xF, %r13 # Chop off all but the bottom 4 bits
# add our base pointer
add $output, %r12 # Use that as our index into our array
add $output, %r13 # Use that as our index into our array
# Print our first Hex
mov $1, %rdx # set the size of chars we want
mov %r12, %rsi # What we are writing
mov $1, %rdi # Stdout File Descriptor
mov $1, %rax # the syscall number for write
syscall # call the Kernel
# Print our second Hex
mov $1, %rdx # set the size of chars we want
mov %r13, %rsi # What we are writing
mov $1, %rdi # Stdout File Descriptor
mov $1, %rax # the syscall number for write
syscall # call the Kernel
jmp loop
Done:
# program completed Successfully
mov $0, %rdi # All is well
mov $60, %rax # put the exit syscall number in eax
syscall # Call it a good day
.data
write_size = 2
input:
.byte write_size