diff options
| -rw-r--r-- | src/array_maker.s | 9 | ||||
| -rw-r--r-- | src/insertion_sort.s | 34 | ||||
| -rw-r--r-- | src/main.s | 34 | ||||
| -rw-r--r-- | src/outputGenerator.s | 47 |
4 files changed, 73 insertions, 51 deletions
diff --git a/src/array_maker.s b/src/array_maker.s index d4c0afc..7586d84 100644 --- a/src/array_maker.s +++ b/src/array_maker.s @@ -10,6 +10,7 @@ .type make_array_from_file, @function make_array_from_file: + # save push %r15 push %r14 push %r13 @@ -47,6 +48,7 @@ end: movq %r13, %rax # Return pointer to array movq %r14, %rdx # Return the number of elements in the array + # retrieve pop %r12 pop %r13 pop %r14 @@ -67,6 +69,7 @@ end: .globl make_pairwise_data .type make_pairwise_data, @function make_pairwise_data: + # save push %r15 push %r14 push %r13 @@ -82,7 +85,7 @@ end: movq %rax, %r13 # Save number of lines (coordinates) in r13 # Allocate space for the pairwise coordinates after parseData - # The space allocated should be 2*(#coordinates)*8 bytes + # The space allocated = 2*(#coordinates)*8 bytes imulq $16, %r13 # Multiply number of coordinates with 2*8 movq %r13, %rdi # Select the number of coordinates call allocate @@ -105,6 +108,7 @@ end: movq %rax, %rdx # Return number of pairs (the quotient of division) movq %r12, %rax # Return pointer to pairwise data + # retrieve pop %r12 pop %r13 pop %r14 @@ -124,7 +128,7 @@ end: .globl create_file_buffer .type create_file_buffer, @function create_file_buffer: - + # save push %r15 push %r14 push %r13 @@ -147,6 +151,7 @@ end: movq %r13, %rax # Return pointer to start of file movq %r14, %rdx # Return length of file + # retrieve pop %r13 pop %r14 pop %r15 diff --git a/src/insertion_sort.s b/src/insertion_sort.s index ed4ade2..f5c38ad 100644 --- a/src/insertion_sort.s +++ b/src/insertion_sort.s @@ -12,41 +12,45 @@ .globl insertion_sort .type insertion_sort, @function insertion_sort: + # save push %r8 push %r9 push %r10 push %r11 push %r14 push %r15 - cmp $1, %rsi # n <= 1 -> done + + + cmp $1, %rsi # if n <= 1 jmp done jle done - movq $1, %r15 # i , start with 2nd element + # set up i + movq $1, %r15 # i , start with 2nd element loop: # load A[i] - movq (%rdi,%r15,8), %r8 # pointer to key -> r8 - movq (%r8,%rdx,8), %r9 # key -> r9 + movq (%rdi,%r15,8), %r8 # pointer to key -> r8 + movq (%r8,%rdx,8), %r9 # key -> r9 - # set up index - 1 now - movq %r15, %r14 # j -> r14 + # set up j + movq %r15, %r14 # j -> r14 decq %r14 inner_loop: - cmpq $0, %r14 # if j < 0 stop + cmpq $0, %r14 # if j < 0 stop and insert the key jl insert_key # load A[j] - movq (%rdi, %r14, 8), %r10 # pointer to key -> r10 - movq (%r10, %rdx, 8), %r11 # key -> r11 + movq (%rdi, %r14, 8), %r10 # pointer to key -> r10 + movq (%r10, %rdx, 8), %r11 # key -> r11 - # compare at A[i] with A[j] + # compare A[i] with A[j] cmpq %r11, %r9 jge insert_key # if A[i] >= A[j] stop # if A[i] < A[j] - movq %r10, 8(%rdi, %r14, 8) # pointer to key of j -> A[j+1] + movq %r10, 8(%rdi, %r14, 8) # pointer to key of j -> A[j+1] decq %r14 # move to j - 1 jmp inner_loop @@ -55,14 +59,16 @@ inner_loop: insert_key: movq %r8, 8(%rdi,%r14,8) - # take the next number now - incq %r15 # i++ - cmpq %rsi, %r15 # if i < n there are still numbers left to be sorted + # take the next number + incq %r15 # i++ + cmpq %rsi, %r15 # if i < n there are still numbers left to be sorted jl loop jmp done done: movq %rdi, %rax + + # retrieve pop %r15 pop %r14 pop %r11 @@ -2,27 +2,29 @@ .globl _start _start: # Open file - movq 16(%rsp), %rdi # Select first argument as file name - movq $0, %rsi # Select read only - movq $0, %rdx # Unused mode for read only - movq $2, %rax # Select open syscall - syscall # Open file, file descriptor returned in rax + movq 16(%rsp), %rdi # Select first argument as file name + movq $0, %rsi # Select read only + movq $0, %rdx # Unused mode for read only + movq $2, %rax # Select open syscall + syscall # Open file, file descriptor returned in rax # Convert to array - movq %rax, %rdi # Select file descriptor - call make_array_from_file # Convert file to array format - movq %rdx, %r15 # Save length of array in r15 + movq %rax, %rdi # Select file descriptor + call make_array_from_file # Convert file to array format + movq %rdx, %r15 # Save length of array in r15 - movq %rax, %rdi # Select address of array - movq %r15, %rsi # Select length of array - movq $1, %rdx # Sort by key 1 + # Sort + movq %rax, %rdi # Select address of array + movq %r15, %rsi # Select length of array + movq $1, %rdx # Sort by key 1 call insertion_sort # Sort the array # Print array - movq %rax, %rdi # Select the pointer to the array - movq %r15, %rsi # Select length of array - call print_buffer # Print array + movq %rax, %rdi # Select the pointer to the array + movq %r15, %rsi # Select length of array + call print_buffer # Print array - movq $60, %rax # Select exit syscall - movq $0, %rdi # Exit code 0 + # Exit + movq $60, %rax + movq $0, %rdi # Exit code 0 syscall diff --git a/src/outputGenerator.s b/src/outputGenerator.s index 34377ba..1e9224b 100644 --- a/src/outputGenerator.s +++ b/src/outputGenerator.s @@ -1,4 +1,5 @@ .section .data
+# This buffer holds the ASCII code for tab and newline
newline:
.byte 10 # '\n'
@@ -16,10 +17,10 @@ tab: .globl print_tab
.type print_tab, @function
print_tab:
- movq $1, %rax # write
- movq $1, %rdi # stdout
- movq $tab, %rsi # load tab character
- movq $1, %rdx # 1 byte
+ movq $1, %rax # write
+ movq $1, %rdi # stdout
+ movq $tab, %rsi # load tab character
+ movq $1, %rdx # 1 byte
syscall
ret
@@ -34,10 +35,10 @@ print_tab: .globl print_newline
.type print_newline, @function
print_newline:
- movq $1, %rax # write
- movq $1, %rdi # stdout
- movq $newline, %rsi # load newline character
- movq $1, %rdx # 1 byte
+ movq $1, %rax # write
+ movq $1, %rdi # stdout
+ movq $newline, %rsi # load newline character
+ movq $1, %rdx # 1 byte
syscall
ret
@@ -55,13 +56,13 @@ print_buffer: cmpq $0, %rsi
jle done # if n > 0 print_coordinate
- movq %rdi, %rdx # keep pointer here, rdi will be used for print_num
+ movq %rdi, %rdx # save pointer, rdi is used for print_num
loop:
movq (%rdx), %r15 # Pointer element
# print x and tab
- movq (%r15), %rdi # Get first number from element
+ movq (%r15), %rdi # Get 1st number from element
call print_num # Print it
push %rdx # save pointer
push %rsi # save n
@@ -70,7 +71,7 @@ loop: pop %rdx # retrieve pointer
# print y and newline
- movq 8(%r15), %rdi # Get the second number
+ movq 8(%r15), %rdi # Get the 2nd number
call print_num # Print it
push %rdx # save pointer
push %rsi # save n
@@ -78,6 +79,7 @@ loop: pop %rsi # retrieve n
pop %rdx # retrieve pointer
+
# move to next coordinate and decq n
addq $8, %rdx
decq %rsi
@@ -89,9 +91,16 @@ done: ret
-# Print RDI as an unsigned integer without any new line.
+# --------------------------------------------
+# FUNCTION: print_num
+# PURPOSE : print rdi as an unsigned integer
+# INPUTS : rdi
+# OUTPUTS :
+# CLOBBERS:
# Note: the function does not follow the ordinary calling convention,
# but restores all registers.
+# --------------------------------------------
+
.type print_num, @function
.globl print_num
print_num:
@@ -107,22 +116,22 @@ print_num: push %r8
push %r9
- movq %rdi, %rax # arg
- movq $0, %r9 # digit count
+ movq %rdi, %rax # arg
+ movq $0, %r9 # digit count
.Lprint_num_convertLoop:
movq $0, %rdx
movq $10, %rcx
idivq %rcx
- addq $48, %rdx # '0' is 48
+ addq $48, %rdx # '0' is 48
push %rdx
addq $1, %r9
cmpq $0, %rax
jne .Lprint_num_convertLoop
.Lprint_num_printLoop:
- movq $1, %rax # sys_write
- movq $1, %rdi # stdout
- movq %rsp, %rsi # buf
- movq $1, %rdx # len
+ movq $1, %rax # sys_write
+ movq $1, %rdi # stdout
+ movq %rsp, %rsi # buf
+ movq $1, %rdx # len
syscall
addq $8, %rsp
addq $-1, %r9
|