Difference between revisions of "CSC231 Fibonacci with Loops"
(Created page with "--~~~~ ---- =Example 1= <br /> <source lang="asm"> ;;; fibWithLoop.asm ;;; D. T. ;;; a simple demo program computing a few Fibonacci terms ;;; using indirect addressing modes and...") |
(→Example 1) |
||
Line 56: | Line 56: | ||
ret | ret | ||
</source> | </source> | ||
− | <br />] | + | <br /> |
+ | =Example 2= | ||
+ | <br /> | ||
+ | <source lang="asm"> | ||
+ | ;;; 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 | ||
+ | </source> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | <br /> | ||
+ | [[Category:CSC231]] |
Revision as of 08:06, 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