Difference between revisions of "CSC231 Fibonacci with Loops"
(→Example 1) |
(→Example 2) |
||
Line 113: | Line 113: | ||
<br /> | <br /> | ||
<br /> | <br /> | ||
+ | ==Output== | ||
+ | |||
+ | [231a@grendel ~/handout]$ ./fibWithLoop2 | ||
+ | 1 | ||
+ | 1 | ||
+ | 2 | ||
+ | 3 | ||
+ | 5 | ||
+ | |||
<br /> | <br /> | ||
<br /> | <br /> |
Latest revision as of 09:07, 10 October 2012
--D. Thiebaut 09:01, 10 October 2012 (EDT)
Example 1
;;; fibWithLoop.asm
;;; D. T.
;;; a simple demo program computing a few Fibonacci terms
;;; using indirect addressing modes and loops.
;;; To compile and run
;;; nasm -f elf fibWithLoop.asm
;;; nasm -f elf asm_io.asm
;;; gcc -m32 -o fibWithLoop driver.c fibWithLoop.o asm_io.o
;;; ./fibWithLoop
%include "asm_io.inc"
;; -------------------------
;; data segment
;; -------------------------
section .data
Fib db 0,0,0,0,0,0
;; -------------------------
;; code area
;; -------------------------
section .text
global asm_main
asm_main:
mov ebx, Fib ; make ebx point to array
mov ecx, 5 ; # of terms to compute
mov eax, 1 ; first term as double word (for printing)
mov byte[ebx], al ; set 1st term
call print_int ; print it
call print_nl
mov byte[ebx+1], al ; set 2nd term
call print_int ; print it
call print_nl
sub ecx,2 ; adjust counter
add ebx,2 ; and pointer. ebx points to
; empty Fib
for: add al, byte[ebx-2] ; al<- fib(n-1)+fib(n-2)
mov byte[ebx], al ; store new term
call print_int ; print it
call print_nl
inc ebx ; point to new term
loop for ; loop back
;; return to C program
ret
Example 2
;;; fibWithLoop2.asm
;;; D. T.
;;; a simple demo program computing a few Fibonacci terms
;;; using indirect addressing modes and loops
;;; To compile and run
;;; nasm -f elf fibWithLoop2.asm
;;; nasm -f elf asm_io.asm
;;; gcc -m32 -o fibWithLoop2 driver.c fibWithLoop2.o asm_io.o
;;; ./fibWithLoop2
%include "asm_io.inc"
;; -------------------------
;; data segment
;; -------------------------
section .data
Fib db 0,0,0,0,0,0
;; -------------------------
;; code area
;; -------------------------
section .text
global asm_main
asm_main:
mov ebx, 0 ; make ebx point to array
mov ecx, 5 ; # of terms to compute
mov eax, 1 ; first term as double word (for printing)
mov byte [Fib+ebx], al ; set 1st term
call print_int ; print it
call print_nl
mov byte [Fib+ebx+1], al ; set 2nd term
call print_int ; print it
call print_nl
sub ecx,2 ; adjust counter
add ebx,2 ; and pointer. ebx points to
; empty Fib
for: add al, byte [Fib+ebx-2] ; al<- fib(n-1)+fib(n-2)
mov byte [Fib+ebx], al ; store new term
call print_int ; print it
call print_nl
inc ebx ; point to new term
loop for ; loop back
;; return to C program
ret
Output
[231a@grendel ~/handout]$ ./fibWithLoop2 1 1 2 3 5