CSC231 Loop Exercises

From dftwiki3
Revision as of 10:50, 12 October 2012 by Thiebaut (talk | contribs)
Jump to: navigation, search

--D. Thiebaut 11:21, 20 October 2010 (UTC)


Exercise 1

Write a loop using the LOOP instruction that prints all the numbers from 1 to 100, one per line

Exercise 2

Modify the loop so that it sums up all the numbers from 1 to 100 and prints the sum at the end.

Exercise 3

Modify the loop so that it prints all the numbers from n1 to n2, where n1 and n2 are dword variables.

Exercise 4

Modify exercise 1 so that the program prints the numbers 10 per line.

1 2 3 4 5 6 7 8 9 10
11 12 13 14...     20
21 22 23...          30
...
91 92 93 94...   100

Exercise 5

Review. Write a simple program that prints a line of 30 stars

******************************

Exercise 6

Using a loop, write a simple program that prints 30 lines of stars, such that the first line contains 30 stars, the next one 29 stars, then 28 stars, until the last line printed contains only 1 star.

******************************
*****************************
****************************
***************************
**************************
*************************
************************
***********************
**********************
*********************
.
.
.
***
**
*

Exercise 7

Same exercise, but this time the first line printed contains 1 star, the next 2 stars, and so on until the last one, which contains 30 stars.






Solution 1

; print all ints between 1 and 100, one per line.

		%include "asm_io.inc"

        ;; -------------------------
        ;; data segment
        ;; -------------------------
        section .data


        ;; -------------------------
        ;; code area
        ;; -------------------------
        section .text
        global  asm_main
asm_main:       

	mov	ecx, 100
	mov	eax, 1

for:	
	call	print_int
	call	print_nl
	inc	eax
	loop	for
	
        ret

Solution 2

;;; loop2.asm
;;; prints all the numbers between 1 and 100
;;; sums them up
;;; displays the sum at the end.

         %include "asm_io.inc"

        ;; -------------------------                                                                                                          
        ;; data segment                                                                                                                       
        ;; -------------------------                                                                                                          
        section .data


        ;; -------------------------                                                                                                          
        ;; code area                                                                                                                          
        ;; -------------------------                                                                                                          
        section .text
        global  asm_main
asm_main:

        mov     ecx, 100
        mov     eax, 1
        mov     ebx, 0

for:    add     ebx, eax
        call    print_int
        call    print_nl
        inc     eax
        loop    for

        call    print_nl
        mov     eax, ebx
        call    print_int
        call    print_nl

        ret

Solution 3

;;; loop3.asm
;;; prints all the numbers between n1 and n2, sums them up, and prints
;;; the sum


		%include "asm_io.inc"

        ;; -------------------------
        ;; data segment
        ;; -------------------------
        section .data
n1	dd	10
n2	dd	20

        ;; -------------------------
        ;; code area
        ;; -------------------------
        section .text
        global  asm_main
asm_main:       

	mov	ecx, dword[n2]
	sub	ecx, dword[n1]
	inc	ecx
	mov	eax, dword[n1]
	mov	ebx, 0
	
for:	add	ebx, eax
	call	print_int
	call	print_nl
	inc	eax
	loop	for

	call	print_nl
	mov	eax, ebx
	call	print_int
	
        ret

Solution 4

;;; loop4.asm
;;; same as loop1.asm, but prints the
;;; numbers 10 per line.


		%include "asm_io.inc"

        ;; -------------------------
        ;; data segment
        ;; -------------------------
        section .data
space	db	" ", 0

        ;; -------------------------
        ;; code area
        ;; -------------------------
        section .text
        global  asm_main
	
asm_main:
;;; n = 1
;;; for i in range( 1, 11 ): # loops 10 times
;;;     for j in range( 1, 11 ): # loops 10 times
;;; 	    print( n, end=" " )
;;; 	    n += 1
;;;     print()
;;; 


;;; n = 1
	mov	eax, 1

	mov	ecx, 10
	
for1:	mov	edx, ecx	; save ecx of loop1

	mov	ecx, 10
	
for2:	call	print_int	; print n
	mov	ebx, eax	; save n
	
	mov	eax, space	; print space
	call	print_string
	mov	eax, ebx	; restore n
	inc	eax		; n <- n+1
	
	loop	for2

	call	print_nl

	mov	ecx, edx
	loop	for1

	call	print_nl
        ret

Solution 6


;;; printStars.asm
;;; D. Thiebaut
;;;
;;; 
;;;
;;; To assemble, link, and run:
;;; 	nasm -f elf -F stabs printStars.asm
;;; 	ld -melf_i386 -o printStars printStars.o
;;; 	./printStars
;;;

		section	.data

stars 		db	0x0a, "******************************"
starsLen	equ	$-stars
	
addr		dd	stars
count		dd	starsLen
	
		section	.text
		global	_start
_start:	
		mov	ecx, dword[count]
	
for:		mov	dword[count], ecx			
		mov	eax, 4
		mov	ebx, 1
		mov	ecx, stars
		mov	edx, dword[count]
		int	0x80

		mov	ecx, dword[count]
		loop	for
	
;;; exit
		mov	ebx, 0
		mov	eax, 1
		int	0x80



...