commit 02d5888f16ae0fd5c70722e1a0972bf4cc5cdeef Author: Jeremiah Orians Date: Sun May 1 09:03:41 2016 -0400 Initial starting point for the creation of our hex bootstrap toolchain diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ec905b5 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +bin/ +tmp/ diff --git a/exec_enable.s b/exec_enable.s new file mode 100644 index 0000000..9126715 --- /dev/null +++ b/exec_enable.s @@ -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 + diff --git a/hex1.s b/hex1.s new file mode 100644 index 0000000..7c7a690 --- /dev/null +++ b/hex1.s @@ -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 diff --git a/test.sh b/test.sh new file mode 100755 index 0000000..17bd9f6 --- /dev/null +++ b/test.sh @@ -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* + diff --git a/xeh1.s b/xeh1.s new file mode 100644 index 0000000..fb01f42 --- /dev/null +++ b/xeh1.s @@ -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 + +