Difference between revisions of "CSC231 Homework 8 2015"
(Created page with "--~~~~ ---- <center> <font size="+2">Page under construction!</font> </center> <P> center|300px <br /> <bluebox> This is the last homework,...") |
|||
(15 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) | ||
---- | ---- | ||
− | |||
− | |||
− | |||
− | |||
− | |||
<br /> | <br /> | ||
+ | |||
<bluebox> | <bluebox> | ||
− | This is the last homework, and it is due on 12/ | + | 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= | ||
<br /> | <br /> | ||
− | + | Write an assembly program called '''hw8.asm''' that computes the product of 2 integer numbers recursively, using only additions, as the algorithm below illustrates. | |
<br /> | <br /> | ||
− | = | + | ==Algorithm== |
<br /> | <br /> | ||
− | + | ;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 | ||
<br /> | <br /> | ||
− | = | + | ==Python Version== |
<br /> | <br /> | ||
− | + | Your program should emulate the Python program below, at least in the way the '''mult()''' function operates. | |
+ | ::<source lang="python"> | ||
+ | #! /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() | ||
+ | |||
+ | </source> | ||
<br /> | <br /> | ||
+ | |||
+ | ==Note== | ||
<br /> | <br /> | ||
+ | * Only positive numbers will be used to test your program. | ||
<br /> | <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. | ||
+ | * 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 | ||
+ | |||
<br /> | <br /> | ||
+ | |||
+ | ==Additional Questions & Submission== | ||
<br /> | <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 /> | ||
<br /> | <br /> | ||
<br /> | <br /> | ||
+ | |||
+ | |||
+ | <showafterdate after="20151220 00:00" before="20151231 00:00"> | ||
+ | =Solution Program= | ||
+ | |||
+ | <source lang="python"> | ||
+ | ;;; --------------------------------------------------------------------------- | ||
+ | ;;; 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 | ||
+ | |||
+ | |||
+ | |||
+ | </source> | ||
+ | </showafterdate> | ||
+ | |||
<br /> | <br /> | ||
+ | |||
<br /> | <br /> | ||
+ | |||
<br /> | <br /> | ||
+ | |||
<br /> | <br /> | ||
− | [[Category:CSC231]][[Category: | + | |
+ | <br /> | ||
+ | |||
+ | <br /> | ||
+ | |||
+ | <br /> | ||
+ | |||
+ | <br /> | ||
+ | [[Category:CSC231]][[Category:Asm]][[Category:Python]][[Category:Homework]] |
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.
Contents
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>