Difference between revisions of "CSC231 Homework 8 2015"

From dftwiki3
Jump to: navigation, search
 
(13 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
--[[User:Thiebaut|D. Thiebaut]] ([[User talk:Thiebaut|talk]]) 12:40, 2 December 2015 (EST)
 
--[[User:Thiebaut|D. Thiebaut]] ([[User talk:Thiebaut|talk]]) 12:40, 2 December 2015 (EST)
 
----
 
----
<center>
 
<font size="+2">Page under construction!</font>
 
</center>
 
<P>
 
[[File:UnderConstruction.jpg|center|300px]]
 
 
<br />
 
<br />
 +
 
<bluebox>
 
<bluebox>
 
This is the last homework, and it is due on 12/14/15, the last day of class, at 11:55 p.m.
 
This is the last homework, and it is due on 12/14/15, the last day of class, at 11:55 p.m.
 
</bluebox>
 
</bluebox>
 
<br />
 
<br />
 +
__TOC__
 
<br />
 
<br />
 
=Problem 1=
 
=Problem 1=
Line 28: Line 25:
 
:: otherwise  mult( a, b ) = mult( a-1, b ) + b  
 
:: otherwise  mult( a, b ) = mult( a-1, b ) + b  
 
<br />
 
<br />
=Python Version=
+
==Python Version==
 
<br />
 
<br />
 
Your program should emulate the Python program below, at least in the way the '''mult()''' function operates.
 
Your program should emulate the Python program below, at least in the way the '''mult()''' function operates.
::<souce lang="python">
+
::<source lang="python">
 
#! /usr/bin/python
 
#! /usr/bin/python
 
# mult.py
 
# mult.py
Line 76: Line 73:
 
</source>
 
</source>
 
<br />
 
<br />
=Main Program=
+
 
 +
==Note==
 +
<br />
 +
* Only positive numbers will be used to test your program.
 +
<br />
 +
==Main Program==
 
<br />
 
<br />
 
* Your main program should prompt the user for 2 integers, as illustrated below, output a blank line, and then output the result.
 
* Your main program should prompt the user for 2 integers, as illustrated below, output a blank line, and then output the result.
Line 94: Line 96:
 
  55
 
  55
 
   
 
   
 +
<br />
 +
 +
==Additional Questions &amp; Submission==
 +
<br />
 +
* Document your code well!  Your program will be reviewed for documentation and style.
 +
* In the header of the program,<font color="magenta"> indicate how much stack space will be used as a function of a and b.  Express your answer in bytes.</font>
 +
* In the header of the program,<font color="magenta"> 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'' variable, ''b'' times, or by adding ''b'' to some sum variable  ''a'' times.</font>
 +
: 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. 
 +
<br />
 +
<br />
 +
<br />
 +
<br />
 +
  
<showafterdate after="20151215 00:00" before="20151230 00:00">
+
<showafterdate after="20151220 00:00" before="20151231 00:00">
 
=Solution Program=
 
=Solution Program=
  
<code><pre>
+
<source lang="python">
 
;;; ---------------------------------------------------------------------------
 
;;; ---------------------------------------------------------------------------
 
;;; mult.asm  
 
;;; mult.asm  

Latest revision as of 08:57, 16 December 2015

--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 variable, b times, or by adding b to some sum variable 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="20151220 00:00" before="20151231 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>