## News:

Message to All Guests
NB: Posting URL's See here: Posted URL Change

## fibonacci question

Started by slc234, October 09, 2012, 06:05:26 AM

#### slc234

Hi I have a program that determines the seven numbers of the fibonacci sequence and puts them in the eax register with a loop. My question is: why do I have to move 12 into ecx, couldn't I move 7 instead since it is the first seven values? Is there another way to do this without decrementing it and by using code in data too?
`INCLUDE Irvine32.inc .code main PROC mov ebp, 0 mov edx, 1 mov ebx, edx mov ecx, 12 L1: mov eax, edx mov ebp, eax mov edx, ebx add ebx, ebp ; call DumpRegs ; dec ecx loop L1 exit main ENDP END main`

#### RuiLoureiro

Quote from: slc234 on October 09, 2012, 06:05:26 AM
Hi I have a program that determines the seven numbers of the fibonacci sequence and puts them in the eax register with a loop. My question is: why do I have to move 12 into ecx, couldn't I move 7 instead since it is the first seven values? Is there another way to do this without decrementing it and by using code in data too?
`INCLUDE Irvine32.inc .code main PROC mov ebp, 0 mov edx, 1 mov ebx, edx mov ecx, 12 L1: mov eax, edx mov ebp, eax mov edx, ebx add ebx, ebp ; call DumpRegs ; dec ecx loop L1 exit main ENDP END main`

You should move 7; you dont need dec ecx, but you need
this:
mov   ecx, 7
L1:
push ecx
...
etc.
...
pop   ecx
loop L1

#### slc234

Is there a way to do it without the push and pop statement?

#### RuiLoureiro

Quote from: slc234 on October 09, 2012, 07:51:27 AM
Is there a way to do it without the push and pop statement?
No because some procs inside L1 till loop L1 destroys ECX
Yes if you dont use any proc inside that loop

#### slc234

It is a silly question, but how would I do it with no Proc inside the loop? I'm trying to do it the most basic way to understand it.

#### raymond

Not only can they destroy ECX, but also EDX and EAX. However, most external procedures are expected to preserve EBX, ESI and EDI. If you intend to call the DumpRegs procedure from within the loop without any push/pop, you could do it as follows. It is based on the standard Fibonacci sequence which starts with 1 and 1 as the F1 and F2 numbers.

ESI is initialized to the F0 Fibonacci number
EDI is initialized to the F1 Fibonacci number
EBX is used as the counter and initialized to the nth Fibonacci number you want to compute. 47 would be the maximum to use in EBX; the F48 Fibonacci number exceeds  32 bits.

`   mov esi,0   mov edi,1   mov ebx,7@@:   xchg esi,edi   call DumpRegs   add esi,edi   dec ebx   jnz @B   exit`

You could replace the DumpRegs procedure by another one which would display only the content of the ESI register.
Whenever you assume something, you risk being wrong half the time.
http://www.ray.masmcode.com

#### jj2007

Quote from: raymond on October 09, 2012, 01:21:49 PM
Not only can they destroy ECX, but also EDX and EAX. However, most external procedures are expected to preserve EBX, ESI and EDI. If you intend to call the DumpRegs procedure from within the loop without any push/pop,...

DumpRegs does not trash any registers, so you can safely use it inside a loop:

include \masm32\MasmBasic\IrvineMb\Irvine32Mb.inc     ; attached

Init
mov eax, 11111111h
mov ebx, 22222222h
mov ecx, 33333333h
mov edx, 44444444h
call DumpRegs      ; displays the regs
call DumpRegs      ; if DumpRegs changes them, they should now look different
Inkey "bye"
Exit
end start

Output:
EAX=11111111  EBX=22222222  ECX=33333333  EDX=44444444
ESI=00000000  EDI=00000000  EBP=0012FF94  ESP=0012FF8C
EIP=0040103D  EFL=00000246  CF=0  SF=0  ZF=1  OF=0  AF=0  PF=1

EAX=11111111  EBX=22222222  ECX=33333333  EDX=44444444
ESI=00000000  EDI=00000000  EBP=0012FF94  ESP=0012FF8C
EIP=00401042  EFL=00000246  CF=0  SF=0  ZF=1  OF=0  AF=0  PF=1

#### raymond

Thanks for the clarification about the DumpRegs procedure. However, using the suggested registers would not need to be modified if any other display procedure not preserving ALL registers was used.
Whenever you assume something, you risk being wrong half the time.
http://www.ray.masmcode.com