; Assessment, Excersise 2 ; ; Program to sort the contents of a file ; and store it on disk ; ; By Andy Bennett (andyjpb@ashurst.eu.org), 2002 ; ; we use the insertion sort because it is more efficient than a bubble sort: An insertion ; sort is often twice as fast as an equivalent bubble sort whilst being only mildly more ; complex. AREA sortFile, CODE, READONLY ; declare code area SWI_Exit EQU 0x11 ; finish program SWI_Open EQU 0x66 ; open a file or device SWI_Close EQU 0x68 ; close an open file or device SWI_Read EQU 0x6a ; read from an open file or device SWI_Flen EQU 0x6c ; returns the current length of an open file or device SWI_Write EQU 0x69 ; write to an open file or device readonly EQU 0 ; open a file or device for reading writeonly EQU 4 ; open a file or device for writing ENTRY ; code entry point START ADR r0, INFILE ; set r0 to point to INFILE MOV r1, #readonly ; set access mode to file as readonly SWI SWI_Open ; open the file pointed at by r0 CMP r0, #0 ; check for success on opening file SWIEQ SWI_Exit ; if file could not be opened then exit now MOV r5, r0 ; save the file handle in r5 for later SWI SWI_Flen ; store the length of the file in r0 CMP r0, #-1 ; check that the call was successful SWIEQ SWI_Exit ; if the call failed then exit now MOV r2, r0 ; move the length of the file into r2 MOV r9, r0 ;move the length of the file into r9 as well MOV r0, r5 ; move the file handle back into r0 ADR r1, FILECONTENTS ; point r1 at a place for the contents of the file SWI SWI_Read ; read the data from the file CMP r0, #0 ; check that the call was successful SWIEQ SWI_Exit ; if anything was left unread from the file then exit now MOV r0, r5 ; move the file handle back into r0 SWI SWI_Close ; close the file ADD r2, r1, r2 ; r2 = r1 + r2. r2 points to the end of the file MOV r3, r1 ; start sorting near the top of the file ADD r3, r3, #1 ; start with the second byte SORT CMP r3, r2 BEQ ENDSORT ; if we are at the end of the file, goto ENDSORT LDRB r5, [r3] ; get the first byte MOV r4, r3 ; start comparisons at the bottom of the sorted bytes LOOP CMP r4, r1 ; see if we are at the top of the file again BEQ NEXT ; if we are, go to the next byte SUB r8, r4, #1 LDRB r6, [r8] ; get the next byte up CMP r6, r5 BLE NEXT ; if the next byte up is less than or equal then our byte is in the correct place: goto next byte STRB r6, [r4] ; move the next byte up into this position then move to the next byte up SUB r4, r4, #1 B LOOP NEXT STRB r5, [r4] ; put the byte we are sorting into the current position ADD r3, r3, #1 ; move onto the next byte B SORT ; resume processing with the next byte ENDSORT MOV r6, r1 ; set r6 to point at the top of the file MOV r7, r2 ; set r7 to point at the bottom of the file ADR r0, OUTFILE ; set r0 to point to OUTFILE MOV r1, #writeonly ; set access mode to file as writeonly SWI SWI_Open ; open the file pointed to by r0 CMP r0, #0 ; check for success on opening file SWIEQ SWI_Exit ; if file could not be opened then exit now MOV r5, r0 ; save the file handle in r5 for later WRITEF MOV r0, r5 ; put the file handle into r0 MOV r1, r6 ; put the current position in the file into r6 ADD r6, r6, #1 ; increment the position in the file CMP r6, r7 ; check to see if we are past the end of the file BGT ENDWRITEF ; if we are, stop writing bytes MOV r2, #1 ; otherwise we want to write one byte LDRB r8, [r1] ; load the value pointed at by r1 into r8 CMP r8, #33 ; non white space occurs between ASCII 33 and 126 inclusive BLT WRITEF ; if we have white space, resume processing with the next byte CMP r8, #127 BEQ WRITEF ; or if we have a DEL character CMP r8, #255 BEQ WRITEF ; or if we have character 255 SWI SWI_Write ; write byte to the file B WRITEF ; resume processing with the next byte ENDWRITEF SWI SWI_Close ; close the file SWI SWI_Exit ; end of execution INFILE = "turing.txt", 0 ; input filename + null OUTFILE = "out.txt", 0 ; output filename + null FILECONTENTS = "" ; arbitrary amount of memory for contents of file END