CSC231 Homework 8 2015

From dftwiki3
Revision as of 14:24, 3 December 2015 by Thiebaut (talk | contribs) (Additional Questions & Submission)
Jump to: navigation, search

--D. Thiebaut (talk) 12:40, 2 December 2015 (EST)



This is the last homework, and it is due on 12/14/15, the last day of class, at 11:55 p.m.



Problem 1


Write an assembly program called hw8.asm that computes the product of 2 integer numbers recursively, using only additions, as the algorithm below illustrates.

Algorithm


Inputs
a and b are integers
a is a positive integer and can be null
Algorithm
mult( a, b ) is recursive, and returns a multiplied by b
if a==0 mult( a, b ) = 0
if a==1 mult( a, b ) = b
otherwise mult( a, b ) = mult( a-1, b ) + b


Python Version


Your program should emulate the Python program below, at least in the way the mult() function operates.

#! /usr/bin/python
# mult.py
# implements multiplication as a recursive
# process.  Works only with integers. a must
# be positive.
# mult( a, b ) = 0    if a == 0
# mult( a, b ) = b    if a == 1 
#              = b + mult( a-1, b ) otherwise
#

def mult( a, b ):
    if a==0: return 0
    if a==1: return b
    return b + mult( a-1, b )


def main():
    a = 0
    b = 100
    print "a = %d  b = %d  mult( %d, %d ) = %d " \
          % ( a, b, a, b, mult( a, b ) )


    a = 1
    b = 100
    print "a = %d  b = %d  mult( %d, %d ) = %d " \
          % ( a, b, a, b, mult( a, b ) )


    a = 3
    b = 100
    print "a = %d  b = %d  mult( %d, %d ) = %d " \
          % ( a, b, a, b, mult( a, b ) )


    a = 100
    b = 0
    print "a = %d  b = %d  mult( %d, %d ) = %d " \
          % ( a, b, a, b, mult( a, b ) )

main()


Note


  • Only positive numbers will be used to test your program.


Main Program


  • Your main program should prompt the user for 2 integers, as illustrated below, output a blank line, and then output the result.
  • The blank line is important, as it will be used to separate input from output.
  • Example of user interaction:
./hw8
> 3
> 10

30
./hw8
> 5
> 11

55


Additional Questions & Submission


  • Document your code well! Your program will be reviewed for documentation and style.
  • In the header of the program, indicate how much stack space will be used as a function of a and b. Express your answer in bytes.
  • In the header of the program, indicate as well, how much faster or slower the recursive method implemented by your function is, relative to:
  • The mul instruction.
  • a for-loop that would accumulate the product of a and b by adding a to some sum b times, or by adding b to some sum a times.
You may assume that each instruction takes 1 cycle. Since we are interested in a ration, you don't need to specify the actual speed of the processor.
  • Submit your program to Moodle, in the HW 8 section. The grade you get is only for the execution of the program. It may get reduced for poor style and/or documentation, or the use of the MUL instruction, which should not appear in your program!
  • You do not need to submit the 231Lib.asm library.






<showafterdate after="20151215 00:00" before="20151230 00:00">

Solution Program

;;; ---------------------------------------------------------------------------
;;; mult.asm 
;;; D. Thiebaut
;;; computes the product of two positive integers a, and b, using
;;; a recursive method.
;;; ---------------------------------------------------------------------------
%include "asm_io.inc"

	section 	.data
a	dd		3
b	dd		100
	
	section		.text
	global		asm_main
;;; ---------------------------------------------------------------------------
asm_main:
	mov		eax, [ a ] 		; print a
	call		print_int
	call		print_nl
	
	mov		eax, [ b ] 		; print b
	call		print_int
	call		print_nl
	
	push		eax			; make room for returned value
	push		dword[ a ]              ; pass a
	push		dword[ b ]              ; pass b
	call		mult                    ; call mult( a, b )
	pop		eax                     ; get product
	call		print_int               ; print it
	call		print_nl
	call		print_nl
	ret
	
;;; ---------------------------------------------------------------------------
;;; mult( a, b )
;;; implements following algorithm:
;;; def mult( a, b ):
;;;     if a==0: return 0
;;;     if a==1: return b
;;;     return b + mult( a-1, b )
;;; 
;;;  stack after "mov ebp, esp"
;;;         ??     <---ebp+16
;;;          a     <---ebp+12
;;;          b     <---ebp+8
;;;       ret addr <---ebp+4
;;;       old ebp  <---ebp
;;; 
mult:	push		ebp
	mov		ebp, esp

%define m_result  dword[ebp+16]
%define m_a       dword[ebp+12]
%define m_b       dword[ebp+8]

.if1:	
	cmp		m_a, 0			; is a == 0 ?
	jne		.if2
	mov		m_result, 0 		; yes: return 0
	pop		ebp
	ret		2*4

.if2:	cmp		m_a, 1			; is a == 1 ?
	jne		.else2	
	mov		eax, m_b 		; yes: return b 
	mov		m_result, eax
	pop		ebp
	ret		2*4

.else2:	push		eax			; make room for value returned
	mov		eax, m_a		; by mult( )
	dec		eax
	push		eax			; pass a-1
	mov		eax, m_b
	push		eax			; pass b
	call		mult			; compute mult( a-1, b )
	pop		ebx			; ebx <-- (a-1)*b
	mov		eax, m_b		; eax <-- b
	add		eax, ebx		; eax <-- b+(a-1)*b
	mov		m_result, eax		; pass back
	
	pop		ebp
	ret		2*4

</showafterdate>