Insertion sort From Knuth to Gnu AARCH64

Now that I can run the Knuth version of the Insertion sort via MIXAL, I want to convert it to AARCH64 Assembly. What I am going to try to do here is a line by line translation. This is not necessarily how I would write the insertion sort in AARCH64 assembly, but rather a direct translation of the MIXAL version.

I started by defining constants for the output parameters. This is the equivalent to the TERM definition in the MIXAL version.

I print out the completed buffer. You can see some trial and error here; I was trying to calculate N, the length of the buffer, bases on the addreses, just as I had done for Hello World messages, but the fact that I needed to put a blank in the first position made that logic more complex than I wanted. So, while I hand caluclated the leng of the bufffer (26) I add 2 to account for the lead blank and the trailing \n.

IUn MIXAL, Many of the comparisons are done between registers and memory. AARCH64 does not support this. You also cannot add two integers without first loading one of them into a register. Thus, many single commands in MIXAL become multiple. For example,

LDA INPUT+N, 1

This requires four distinct operations.

  • load input into a temporary register: ldr x8, =INPUT
  • add N to INPUT add x3, x8, N
  • add the offset of the X1 register to index the value of INPUT+T: add x3, x3, x1
  • load the x0 (used as the accumulator here) with the value stored in memory caluculated from the previous three steps: ldrb w0, [x3]

Here is the completed AARCH64 version. I put a comment with the MIXAL line at the start of each section. For the accumulator, I used X0. I used X10 for the extended register rX. Several other additional registers were used for temporary storage of values.

.global _start
 
.data
 
.equ  STDOUT, 1
.equ  SYS_WRITE,  64
.equ  SYSCALL, 0
 
INPUT:
   .ascii        " ZYXWVUTSRQPONMLKJIHGFEDCBA\n"
N = 26 
 
.text
 
_start:     
 
            mov  x0, STDOUT    //output the string before sorting
 	    ldr  x1, =INPUT
	    ldr  x2, =N  
	    add  x2, x2, 2
            mov  w8, SYS_WRITE   
	    svc  SYSCALL       
insert:     
            ldr  x7, =N  //START ENT1  2-N            
            mov  x9, 2
            sub  x1, x9, N 
H2:         ldr  x8, =INPUT //LDA INPUT+N, 1.  x7 = INPUT+N     
            add  x3, x8, N   
            add  x3, x3, x1
            ldrb  w0, [x3]
 
            sub   x2, x7, 1  //ENT2 N-1, 1
            add   x2, x2, x1
 
H3:         add  x3, x8, x2     //x4 will hold the value of INPUT,2
            ldrb w4, [x3]
            cmp  w0, w4
            B.GT H5
 
H4:         ADD  x11, x8, x2        //LDX INPUT,2
            ldrb w10, [x11]         //w10 is rX
            add  x11, x11, 1        //STX INPUT+1,2 
            strb w10, [x11]
            SUB  x2, x2, 1          //DEC2 1
            cmp  x2, 0             //J2P  3b
            B.GT  H3
 
H5:         ldr    x11, =INPUT     //STA  INPUT+1, 2 
            add    x11, x11, 1
            add    x11, x11, x2
            strb   w0, [x11]
 
            add    x1, x1, 1       //INC1   1
            cmp x1, 0              //J1NP   2B
            B.LE  H2
 
            mov  x0, STDOUT        //output the sorted string
            ldr  x1, =INPUT
            ldr  x2, =N
            add  x2, x2, 2
            mov  w8, SYS_WRITE
            svc  SYSCALL
 
            MOV     X0, #0
            MOV     X8, #93
            SVC     0

27 Lines of ARCH64 instruction, from 12 lines of MIXAL. I am sure that, using a more AARCH64 focused approach, you could greatly reduce the sort, but even still, I don’t think we’d get it down to 12 lines.

But you could make it much more legible.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.