Skip to content

Instantly share code, notes, and snippets.

@b-adams
Created October 28, 2012 21:17
Show Gist options
  • Save b-adams/3969958 to your computer and use it in GitHub Desktop.
Save b-adams/3969958 to your computer and use it in GitHub Desktop.
CS225 Multiplication notes
;CallER addresses for procedure mult
frame: .equate 6
argN: .equate -6
argM: .equate -4
retval: .equate -2
;CallEE addresses for procedure mult
;You'll need space for local variables, and names for the two parameters and the return value
;When counting bytes, don't forget the Return Address that sits between the caller and the callee sections of the stack
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Function mult
;; Two integer arguments: argN, argM
;; Returns an integer: retval
;; Purpose: return argN*argM
;; This implementation IS A STUB
;; It will say that all products equal 42
;; You can use it to test something that uses mult
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;CallER addresses for procedure mult
frame: .equate 6
argN: .equate -6
argM: .equate -4
retval: .equate -2
;CallEE addresses for procedure mult
locframe: .equate 0 ;No local variables, this is just a stub
n: .equate 2 ;argument n is at locframe+2, argument #2d
m: .equate 4 ;argument m is at locframe+4, argument #2d
result: .equate 6 ;returned result is at locframe+6, return value #2d
stub1: .ASCII "You are trying to find \x00"
stub2: .ASCII " but I am a stub and always return 42!\n\x00"
mult: NOP0 ;ENTER FUNCTION mult
SUBSP locframe,i ;allocate nothing
STRO stub1,d ;print "You are trying to find "
DECO n,s ;print n
CHARO '*',i ;print '*'
DECO m,s ;print m
STRO stub2,d ;print "But I am a stub..."
;return 42
LDA 42,i
STA result,s
ADDSP locframe,i ;deallocate nothing
RET0 ;EXIT FUNCTION mult
#include <stdio.h>
int main(int argc, char const *argv[])
{//main
int n,m;
int total=0;
int inc,dec;
printf("Please enter two numbers to multiply:");
scanf("%d %d", &m, &n);
inc=n;
dec=m;
printf("m:%3d n:%3d\n", m, n);
while(dec!=0)
{//loop
printf("\n\tdec:%3d inc:%3d total:%3d\n", dec, inc, total);
if(dec%2==1)
{ //odd
total += inc;
printf("\t\tdec is odd, add inc to total\n");
}
else
{ //even
printf("\t\tdec is even, nothing special to do\n");
}
//always
dec = dec/2;
inc = inc*2;
printf("\t\tHalving dec, Doubling inc\n");
}
//done
printf("\n\tdec:%3d inc:%3d total:%3d\n", dec, inc, total);
printf("\t\tdec is exhausted, the answer is total\n");
printf("%d*%d=%d\n", n, m, total);
return 0;
}
BR main
n: .block 2 ;global variable #2d
m: .block 2 ;global variable #2d
inc: .block 2 ;global variable #2d
dec: .block 2 ;global variable #2d
product: .block 2 ;global variable #2d
prompt: .ASCII "\nPlease enter two numbers to multiply: \x00"
main: NOP0
lda 0,i
sta product,d ;product = 0
STRO prompt,d
DECI m,d ;input original m
LDA m,d
STA dec,d ;dec = m
DECI n,d ;input original n
LDA n,d
STA inc,d ;dec = n
loop: NOP0
lda dec,d
BREQ done ;Nothing more to multiply
RORA ;Put parity of dec into C
BRC odd
BR even
;In case of a 0, just halve one side and double the other
even: NOP0
BR always
;In case of a 1, double&half AND add to the running product
odd: NOP0
;product = product + inc
lda product,d
adda inc,d
sta product,d
BR always
always: NOP0
;dec = dec/2
lda dec,d
ASRA
sta dec,d
;inc = 2*inc
lda inc,d
asla
sta inc,d
BR loop
done: NOP0
DECO m,d
CHARO '*',i
DECO n,d
CHARO '=',i
DECO product,d
BR main
STOP
.end
#define SHOWSTEPS false
int main(int argc, char const *argv[])
{//main
int userIn1,userIn2;
printf("Please enter two numbers to multiply:");
scanf("%d %d", &userIn1, &userIn1);
printf("%d*%d=%d\n", userIn1, userIn2, mult(userIn1,userIn2));
}
int mult(int m, int n)
{//mult:
int inc,dec;
int total=0;
inc=n;
dec=m;
if(SHOWSTEPS) printf("m:%3d n:%3d\n", m, n);
while(dec!=0)
{//loop:
if(SHOWSTEPS) printf("\n\tdec:%3d inc:%3d total:%3d\n", dec, inc, total);
if(dec%2==1)
{ //odd:
total += inc;
if(SHOWSTEPS) printf("\t\tdec is odd, add inc to total\n");
}
else
{ //even:
if(SHOWSTEPS) printf("\t\tdec is even, nothing special to do\n");
}
//always:
dec = dec/2;
inc = inc*2;
if(SHOWSTEPS) printf("\t\tHalving dec, Doubling inc\n");
}
//done:
if(SHOWSTEPS) printf("\n\tdec:%3d inc:%3d total:%3d\n", dec, inc, total);
if(SHOWSTEPS) printf("\t\tdec is exhausted, the answer is total\n");
return total;
}
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; Function testmult
;; No arguments
;; No return value
;; Tests a few multiplications
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;CallER addresses for procedure testmult
TMframe: .equate 0
;CallEE addresses for procedure testmult
TMlframe: .equate 6 ;No l
a: .equate 0 ;local variable #2d
b: .equate 2 ;local variable #2d
res: .equate 4 ;local variable #2d
testmult: NOP0 ;ENTER FUNCTION testmult
SUBSP TMlframe,i ;allocate #res #b #a
;a=6
lda 6,i
sta a,s
;b=7
lda 7,i
sta b,s
;res = mult(a,b)
lda a,s
sta argN,s
lda b,s
sta argM,s
SUBSP frame,i ;allocate #result #m #n
CALL mult
ADDSP frame,i ;deallocate #n #m #result
lda retval,s
sta res,s
;printf("%d * %d = %d \n", a, b, res);
deco a,s
charo '*',i
deco b,s
charo '=',i
deco res,s
charo '\n',i
;a=2
lda 2,i
sta a,s
;b=2
lda 2,i
sta b,s
;res = mult(a,b)
lda a,s
sta argN,s
lda b,s
sta argM,s
SUBSP frame,i ;allocate #result #m #n
CALL mult
ADDSP frame,i ;deallocate #n #m #result
lda retval,s
sta res,s
;printf("%d * %d = %d \n", a, b, res);
deco a,s
charo '*',i
deco b,s
charo '=',i
deco res,s
charo '\n',i
ADDSP TMlframe,i ;deallocate #a #b #res
RET0 ;EXIT FUNCTION testmult
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment