CSC231 Homework 7 Solution 2010

From dftwiki3
Revision as of 14:45, 7 November 2012 by Thiebaut (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

--D. Thiebaut 15:04, 19 November 2010 (UTC)



...


Part 2

;;; hw7.asm
;;; Amy Tayloe, 231a-ai
;;; Last modified 11/10/10
;;; 
;;; Program that takes an unsigned, 32-bit integer and prints it out.
;;; Assumes integer (held in x) is in decimal form.
;;; Uses the stack and at least one function.
;;; Sample output:
;;; 1234589
;;;
;;; to assemble and run:
;;;
;;;     nasm -f elf -F  stabs hw7.asm
;;;     ld -melf_i386 -o hw7 hw7.o
;;;     ./hw7
;;; -------------------------------------------------------------------
 
;%include files here...
 
EXIT    equ     1
WRITE   equ     4
STDOUT  equ     1
 
      	;; ------------------------------------------------------------
	;; Data Area
	;; ------------------------------------------------------------
	section	.data
;;; Variable to print
x	dd	1234589
;;; Array to hold the decimal values of x
arrx	dd	0,0,0,0,0,0,0,0,0,0
;;; Place in memory to hold ascii value of integer to be printed
temp	dd	0
nl	dd	10
 
	;; ------------------------------------------------------------
	;; Code Area
	;; ------------------------------------------------------------
 
	section	.text
	global	_start
 
_start:

;;; Master function
	call	getDecimal
	mov	eax, arrx
;;; Loops N times, where N is the number of integers
	mov	ecx, 10
.for:
	push	eax
	call	moveTemp
	call	printTemp
;;; Increments eax by 4 to go to the next value
	add	eax, 4
	loop	.for

	call	printNL

;;; 	call	printNL


	
	;; exit()
theEnd:
	mov	eax,EXIT
	mov	ebx,0
	int	0x80		; final system call





	

;;; Function to put the decimal values of the integer in x onto the stack
;;; Assumes nothing on the stack
getDecimal:
	pushad
	 
;;; Loop 10 times (held in nl)
	mov	ecx, [nl]
	dec	ecx
.for:
;;; Put the integer into eax, to be divided
	mov	edx, 0
	mov	eax, [x]
	mov	ebx, 10
	div	ebx
;;; Replace previous value with quotient
	mov	[x], eax
;;; Push the remainder into the array
	mov	ebx, arrx
	add	ebx, ecx
	add	ebx, ecx
	add	ebx, ecx
	add	ebx, ecx
	mov	[ebx], edx
	loop	.for
	popad
	ret



	
	
;;; Funtion to put the ascii value of a given integer into temp
;;; Assumes the location of the integer is on the stack
moveTemp:	
	push	ebp
	mov	ebp, esp
	pushad
;;; Move the location of the integer into ebx
	mov	ebx, [ebp+8]
;;; Move the integer into eax
	mov	eax, [ebx]
;;; Increments the value by 48 (the ascii decimal value of 0)
	add	eax, 48
;;; Put that value into temp
	mov	[temp], eax
	
	popad
	pop	ebp
	ret	1*4




	
;;; Function to print the word held at temp
;;; Assumes nothing on the stack
printTemp:
	pushad
	mov	eax, WRITE
	mov	ebx, STDOUT
	mov	ecx, temp
	mov	edx, 4
	int	0x80
	popad
	ret




	
;;; Function to print a new line, to look nice
;;; Assumes nothing on the stack
printNL:
	pushad
	mov	eax, WRITE
	mov	ebx, STDOUT
	mov	ecx, nl
	mov	edx, 4
	int	0x80
	popad
	ret