assembly code

profileAbdull2004

 

Computer Science Assembler Problem

Do not modify or change the C++ program.

The first parameter is the number of elements in the array and the address of the array is the second parameter.

For this assignment:
The stack must managed directly by the assembler code
No masm directives can be used to manage the stack
The masm function is called by the C++ program using the decl C style stack model
The masm function must do all its responsibilities for a decl C style stack mdel
The stack parameters must be accessed from the stack using [BP + stack offset] addressing style.

The function will determine the average of the values in the array and return the average rounded to the nearest whole number.

So, if the fractional part of the result is >= 0.5, the result is rounded to the next integer number.
If not, then the integer part of the number is used as the result.

C++ File (Dont change this one)

#include "stdafx.h"
#include
#include

using namespace std;

uint32_t array1ui32 [] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
uint32_t array1Elementui32 = sizeof(array1ui32) / sizeof(array1ui32[0]);

uint32_t array2ui32 [] = { 111, 222, 333, 444, 555, 666, 777, 888, 999, 1000 };
uint32_t array2Elementui32 = sizeof(array2ui32) / sizeof(array2ui32[0]);

extern "C" { uint32_t AverageFunc(uint32_t, uint32_t[]); }

int _tmain(int argc, _TCHAR* argv []) {

   cout << "Array 1 Average : " << AverageFunc(array1Elementui32, array1ui32) << endl;
   cout << "Array 2 Average : " << AverageFunc(array2Elementui32, array2ui32) << endl;

}

Assembler File (Need help here)

.586 ;Target processor, use Pentium class machines
.MODEL FLAT, C ;Use the flat memory model. Use C calling and return conventions

.STACK ;Define a stack segment of 1KB (Not required for this example)
.DATA ;Create a near data segment. Local variables are declared here (Not required for this example)

.CODE ;Indicates the start of a code segment.

AverageFunc PROC

NoOfElemenstsDW EQU 08
ArrayAddrStartPtr EQU 12
ElementSize EQU Type DWORD
 

push ebp ;save curent stack frame pointer
mov ebp, esp ;set current stack frame pointer

push esi ;perserve registers for calling program
push ecx
push edx
push ebx

;get parameters from stack using stack frame into dedicated registers
;ecx set as NoOfElemenstsDW
;esi set as index pointer   

;process the array sum
sub eax,eax ;clear summer
arrayLoop:
; sum into summer
; update index pointer to next element
loop arrayLoop

;take average and calcuate rounding
;clear upper dividend
; set divisor from stackset              
;edx:eax / ebx
;multiply remainder by 2
if 2 x remainder is greater or equal than divisor
jb NoRound                                      
; round quotient up to next integer
NoRound: ;endif

pop ebx ; restore used registers
pop edx
pop ecx
pop esi

pop ebp ;retore calling bp frame   

ret

AverageFunc ENDP

END

  • 9 years ago
  • 15
Answer(1)

Purchase the answer to view it

blurred-text
NOT RATED
  • attachment
    labxx.txt
  • attachment
    labxx.asm