CSE 30 -- Lecture 4 -- Oct 8


Hand assembly -- code generation

We just write down the address of the variables and the address of the next instruction etc in most cases. Generating the negretaddr and retproto is a little trickier, but is not that hard.
0x21 0x21 0x1	;0 mult:	subz s,s,next		; s = 0;
0x25 0x25 0x2	;1		subz i,i,next
0x25 0x22 0x3	;2		subz i,x,next		; i = -x;
0x25 0x26 0x16	;3 mloop:	subz i,zero,mdone	; while (i != 0) {
		;		; prepare to call add
0x1d 0x1d 0x5	;4		subz t,t,next		; move s to a
0x1d 0x21 0x6	;5		subz t,s,next
0x1e 0x1e 0x7	;6		subz a,a,next
0x1e 0x1d 0x8	;7		subz a,t,next
0x1d 0x1d 0x9	;8		subz t,t,next		; move y to b
0x1d 0x23 0xa	;9		subz t,y,next
0x1f 0x1f 0xb	;a		subz b,b,next
0x1f 0x1d 0xc	;b		subz b,t,next
0x1c 0x1c 0xd	;c		subz addret,addret,next
0x1c 0x28 0xe	;d		subz addret,retproto,next
0x1c 0x29 0xf	;e		subz addret,negretaddr,next
0x1d 0x1d 0x17	;f		subz t,t,add
		;retaddr:
0x1d 0x1d 0x11	;10		subz t,t,next		; move c to s
0x1d 0x20 0x12	;11		subz t,c,next
0x21 0x21 0x13	;12		subz s,s,next
0x21 0x1d 0x14	;13		subz s,t,next
0x25 0x27 0x15	;14		subz i,neg1,next
0x1d 0x1d 0x3	;15		subz t,t,mloop		; }
0x1d 0x1d 0x16	;16 mdone:	subz t,t,mdone		; infinite loop to indicate done
		;;
		;; Add subroutine
		;;
0x1d 0x1d 0x18	;17	add:	subz t,t,next		; t = -a-b
0x1d 0x1e 0x19	;18		subz t,a,next
0x1d 0x1f 0x1a	;19		subz t,b,next
0x20 0x20 0x1b	;1a		subz c,c,next		; c = -t
0x20 0x1d 0x1c	;1b		subz c,t,next
0 0 0		;1c addret:	0 0 0			; generated return instr goes here
		;;
		;; Data
		;;
0 0 0		;1d  t:		0 0 0
0 0 0		;1e  a:		0 0 0
0 0 0		;1f  b:		0 0 0
0 0 0		;20  c:		0 0 0
0 0 0		;21  s:		0 0 0
0 0 3		;22  x:		0 0 3			; inputs, should be elsewhere
0 0 8		;23  y:		0 0 8			; inputs, should be elsewhere
0 0 0		;24  z:		0 0 0
0 0 0		;25  i:		0 0 0
		;;
		;; Constants
		;;
0 0 0		;26  zero:	0 0 0
0xffff 0xffff 0xffff		;27  neg1:	0xffff 0xffff 0xffff
		;28  retproto:
0xffe2 0xffe3 0x0000		;		- ( t t 0 )
		;29  negretaddr:
0xffff 0xffff 0xfff0		;		-retaddr  (constant was wrong)
		;
The see now the value in retproto was arrived at, write down
t t 0
as
0x001d 0x001d 0x0000
and then compute its two's complement (as if it was a 48-bit number). Similarly, negretaddr contains just the two's complement of retaddr.

Voila!


[ CSE home | CSE talks | bsy's home page | webster i/f | yahoo | lycos | altavista | pgp key svr | spam | commerce ]
picture of bsy

bsy@cse.ucsd.edu, last updated Sun Oct 26 23:14:24 PST 1997.

email bsy


Don't make me hand over my privacy keys!