Write an assembly language program that sorts a list of date

Write an assembly language program that sorts a list of dates and then prints out the dates sorted oldest to newest.

The dates are in the format of DD- MMM-YYYY, e.g. ?23-JUL-2010?.

Define and implement the following as procedures or macros (your choice) and use them to accomplish this task:

DateToNumber

Parameter is the address of a string.

Turns the string form of the date, DD-MMM-YYY, into a unique 32-bit number.

The date numbers are unsigned and sort the same as the dates they represent.

For example, if 23-JUL-2010 is the number 42, then 24-JUL-2010 will be bigger than 42 and 22-JUL-2010 will be smaller than 42.

Returns the 32-bit date number.

NumberToDate

Parameter is a 32-bit unsigned number.

Turns the number back into its corresponding date string.

Returns the address of the string.

BubbleSort

Parameters are the address of an array of 32-bit unsigned numbers and the length of the array.

Sorts the array in place from smallest to largest.

No return value.

Some starting code (MASM32)

include \\masm32\\include\\masm32rt.inc

    .data

      dates BYTE \"23-JUL-2010\", 0, \"23-JAN-2010\", 0, \"23-JUL-2009\", 0, \"31-JUL-2012\", 0, \"05-MAR-2010\", 0

      nDates DWORD 5

    .code

start:

    lea EAX, dates      ; create pointer to beginning of dates array

    mov ECX, nDates     ; set up loop counter

   

loop_top:

    push EAX            ; save EAX and ECX because print macros change these

    push ECX

    print EAX           ; print date at pointer location

    print chr$(13,10)

    pop ECX

    pop EAX

   

    add EAX, 12         ; increment pointer, note that date has 12

; bytes including null-terminator

    loop loop_top       ; continue loop

  

    exit

end start

Solution

include \\masm32\\include\\masm32rt.inc

.data?
number dd ?
.data

dates BYTE \"23-JUL-2010\", 0, \"22-JUL-2010\", 0, \"23-JUL-2009\", 0, \"31-JUL-2012\", 0, \"05-MAR-2010\", 0, \"12-MAR-1010\", 0
values dd 5 DUP(0, 0, 0, 0, 0)
nDates DWORD 6
counter DD 0
temp dd 0
years dd 0
months BYTE \"JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC\",0

.code

DateToNumber MACRO items, mons, result
    LOCAL loop_top
    PUSHAD
  
    lea EDI, [items]
    MOV AL, [EDI]
    AAA
    MOV BL, 10
    MUL BL
    MOV DL, AL
    ADD EDI, 1
    SUB EAX, EAX
    MOV AL, [EDI]
    AAA
    ADD DL, AL
    MOV result, EDX
    SUB EDX, EDX
    SUB ESI, ESI
    SUB EDI, EDI
    mov EAX, 0          ; EAX is the month number

    loop_top:
         lea ESI, [items+3] ; ESI will be a ptr into the date string we are trying to convert to a number
         lea EDI, [mons + EAX * 4]   ; EDI will be a ptr into the months array

         inc EAX
         mov ECX, 3          ; length of a month string
         cld
         repe cmpsb          ; compare mystring and months for 3 characters

         jne loop_top        ; keep looping until we find the month

    mov EBX, result
    mov BH,AL
    SUB EBX, EBX
    MOV years, EBX  
    lea EDI, [items]
    ADD EDI,7
    MOV AL, [EDI]
    AAA
    MOV BX, 1000
    MUL BX
    MOV years, EAX
    SUB BX, BX
    SUB EAX, EAX
    ADD EDI, 1
    MOV AL, [EDI]
    AAA
    MOV BX, 100
    MUL BX
    SUB BX, BX
    ADD years, EAX
    SUB EAX, EAX
    ADD EDI, 1
    MOV AL, [EDI]
    AAA
    MOV BX, 10
    MUL BX
    SUB BX, BX
    ADD years, EAX
    SUB EAX, EAX
    ADD EDI, 1
    MOV AL, [EDI]
    AAA
    SHL EAX, 16
    ADD result, EAX
    POPAD
ENDM


start:
    MOV ECX, 1
    SUB EDX, EDX
    SUB EAX, EAX
    DateToNumber dates, months, number
    MOV EAX, number
    MOV values, EAX
    DateToNumber [dates+12], months, number
    MOV EAX, number

    MOV [values+4], EAX
    DateToNumber [dates+24], months, number
    MOV EAX, number
    MOV [values+8], EAX
    DateToNumber [dates+48], months, number
    MOV EAX, number
    MOV [values+16], EAX
    DateToNumber [dates+36], months, number
    MOV EAX, number
    MOV [values+12], EAX
    DateToNumber [dates+60], months, number
    MOV EAX, number
    MOV [values+20], EAX
    print chr$(\"[ \",)

    ;lea EDI, [values]
    ;push EDI
    ;Call BubbleSort

    ;Call NumberToDate
out_top:
  
    mov eax, [values+esi*4]
    mov temp, eax
    print str$(temp)
    print chr$(\", \")
    inc esi
    cmp esi, 5
    jne out_top

    ; Formatting the last character
    mov eax, [values+esi*4]
    mov temp, eax
    print str$(temp)
    print chr$(\" ]\", 13, 10)
exit

;NumberToDate-
;   Parameter is a 32-bit unsigned number.
;   Turns the number back into its corresponding date string.
;   Returns the address of the string.
;
NumberToDate :

    enter 0, 0
  
    print \"NumberToDate called\"
    leave
    ret 0

;BubbleSort-
;   Parameters are the address of an array of 32-bit unsigned numbers and the length of the array.
;   Sorts the array in place from smallest to largest.
;   No return value.
;
BubbleSort:

    enter 0, 0
    PUSHAD
    mov ecx, 0
    mov edx, 0
    print \"BubbleSort called\"

    MOV ESI, [EBP + 8]
  
    top:
        cmp edx, 5
        je inc_loop
        inc edx           
        mov eax, [esi+ecx*4] ; moves array index 0 into eax

        cmp [esi+edx*4], eax ; compares index 1 to index 2
        jl top             ; jumps to top if index1 is less than or equal to index 2
      
        ; swaps the values edx and ecx are pointing to
        mov ebx, [esi+edx*4]
        mov [esi+ecx*4], ebx
        mov [esi+edx*4], eax
        jmp top

    inc_loop:
        mov edx, -1
        inc ecx
        cmp ecx, 5
        jl top
      
    POPAD
    leave
    ret 4  

END start

Write an assembly language program that sorts a list of dates and then prints out the dates sorted oldest to newest. The dates are in the format of DD- MMM-YYYY
Write an assembly language program that sorts a list of dates and then prints out the dates sorted oldest to newest. The dates are in the format of DD- MMM-YYYY
Write an assembly language program that sorts a list of dates and then prints out the dates sorted oldest to newest. The dates are in the format of DD- MMM-YYYY
Write an assembly language program that sorts a list of dates and then prints out the dates sorted oldest to newest. The dates are in the format of DD- MMM-YYYY
Write an assembly language program that sorts a list of dates and then prints out the dates sorted oldest to newest. The dates are in the format of DD- MMM-YYYY

Get Help Now

Submit a Take Down Notice

Tutor
Tutor: Dr Jack
Most rated tutor on our site