Order Now  +1 678 648 4277 

Determining the minimum a maximum value in an array using x86 assembly assignment help

The assignment deals with finding the minimum and maximum values in a given array using an x86 assembly procedure. The array that our x86 assembly assignment helpers use is predefined in the data segment. The main function calls the subroutine given the array, size, and addresses to save the maximum and minimum as arguments. The procedure is written following the C++ calling convention.

Subroutine for Determining Array Size and Address

INCLUDE NoIrvineBegin.inc .data minposmsg DB "The position in array of last occurrence of minimum element is: ",0 minelemmsg DB "The minimum element in the array is: ",0 maxposmsg DB "The position in array of last occurrence of maximum element is: ",0 maxelemmsg DB "The maximum element in the array is: ",0 array DWORD 5, 46, 90, 50, 5, 6, 90, 8, 20 max DWORD 0 maxposn DWORD 0 min DWORD 0 minposn DWORD 0 .code MyProgram PROC push eax ; save registers eax,ecx and edx before calling the subroutine push ecx push edx mov eax,9 push eax ; push last parameter, size of array Arrsze push OFFSET array ; push &array push OFFSET minposn ; push &minposn push OFFSET min ; push &min push OFFSET maxposn ; push &maxposn push OFFSET max ; push first parameter &max call MinandMax ; call the minmax routine to fill in the variables with the max and min values found in the array add esp,24 ; pop all the values we pushed on the stack for the function arguments pop edx ; restore the registers we saved before the call pop ecx pop eax mov edx,OFFSET minposmsg ; load address of min pos message in edx for displaying it call WriteString ; display the message using the WriteString function mov eax,minposn ; load the min pos value in eax for displaying call WriteDec ; display the value as an integer using the WriteDec function call CrLf ; print a line feed to change to next line mov edx,OFFSET minelemmsg ; load address of min element message in edx for displaying it call WriteString ; display the message using the WriteString function mov eax,min ; load the min value in eax for displaying call WriteDec ; display the value as an integer using the WriteDec function call CrLf ; print a line feed to change to next line mov edx,OFFSET maxposmsg ; load address of max pos message in edx for displaying it call WriteString ; display the message using the WriteString function mov eax,maxposn ; load the max pos value in eax for displaying call WriteDec ; display the value as an integer using the WriteDec function call CrLf ; print a line feed to change to next line mov edx,OFFSET maxelemmsg ; load address of max element message in edx for displaying it call WriteString ; display the message using the WriteString function mov eax,max ; load the max value in eax for displaying call WriteDec ; display the value as an integer using the WriteDec function call CrLf ; print a line feed to change to next line exit ; exit the program MyProgram ENDP ;MinandMax(int &max, int &maxposn, int &min, int&minposn, ; int& Array, int Arrsze); MinandMax PROC push ebp ; save ebp in the stack mov ebp,esp ; point to top of stack with ebp push ebx ; save registers push edi push esi mov ecx,0 ; ecx will be the index in the array, start from zero mov esi,[ebp+24] ; get the array address mov eax,[esi] ; load the first element in the array mov ebx,[esi] ; set the minimum in register ebx for comparing mov edx,[esi] ; set the maximum in register edx for comparing loop1: mov eax,[esi+ecx*4] ; load current element in the array ifmin: cmp eax,ebx ; compare current value with the minimum jg ifmax ; if it's greater than the minimum, skip and test the maximum mov edi,[ebp+16] ; load the address of the minimum value in edi mov [edi],eax ; put the minimum value as the current element in the array mov edi,[ebp+20] ; load the address of the minimum position in edi mov [edi],ecx ; set the minimum position as the curent element position mov ebx,eax ; load the new minimum in ebx jmp else1 ; jump to else1 to continue the loop with the next element ifmax: cmp eax,edx ; compare current value with the maximum jl else1 ; if it's less than the maximum, skip to go to next element mov edi,[ebp+8] ; load the address of the maximum value in edi mov [edi],eax ; put the maximum value as the current element in the array mov edi,[ebp+12] ; load the address of the maximum position in edi mov [edi],ecx ; set the maximum position as the curent element position mov edx,eax ; load the new maximum in edx else1: inc ecx ; increment ecx to go to next element in array cmp ecx,[ebp+28] ; compare the current position with the size of the array jl loop1 ; if we haven't gone beyond the last element continue the loop pop esi ; restore registers pop edi pop ebx pop ebp ; restore ebp from the stack ret ; return to caller MinandMax ENDP INCLUDE NoIrvineEnd.inc END MyProgram