title Fibonacci [FIB.ASM]
.model small
.stack 100h
.data
msg1 db "Please enter the number of terms in the fibonacci sequence to display:",0DH,0AH,"$" ;message to user
msg2 db "Displaying Fibonacci sequence",0DH,0AH,"$" ; message to user
msg3 db ", ","$" ; formating - coma
msg4 db "Press any key to continue","$"
num1 dw 0 ;this is a numeric variable
num2 dw 0 ; this is a numeric variable
input dw 0 ; this is a numeric variable
fibn_1 DW 1 ; word numeric value n-1 value
fibn_2 DW 0 ; word numeric value n-2 value
fib DW 0 ; word numeric value
temp DW 0 ; word numeric value
saveCount DW 0 ;counter storage
.code
main proc
mov ax,@data ; set up data segment
mov ds,ax
; clear the screen
mov ah,9 ; send message with instructions for user
mov dx,offset msg1
int 21h
call keyin ;gets user input
SUB AL, 48 ;changes ASCII value into numeric value for further processing
mov num1 , AX ;saves user input to variable num1
call keyin ;gets user input
SUB AL, 48 ;changes ASCII value into numeric value for further processing
mov num2 , AX ;saves user input to variable num2, so now we have both digits
;multiplying num1 10 times
MOV CX, 10
repeat1: ; loop 10 times
MOV AX, NUM1 ;copies value of num1 to AX
ADD input, AX ;adds value from AX
DEC CX ;decrements the counter
JNZ repeat1 ;loops until counter = 0
MOV AX, num2 ;adding the value from num2 so if user entered 83, so it was num1=8 num2=3, then we multiplied 8x10=80, so we add 80+3 and we get 83
ADD input, AX
call newLine
mov ah,9 ; send informative message to user regarding displaying the sequence
mov dx,offset msg2
int 21h
call newLine
call displayFib
call newLine
mov ax,4C00h ; return to DOS
int 21h
main endp
newLine proc ;procedure displays new line
mov dx,0Dh ;line feed
mov ah,2
int 21h
mov dx,0Ah ;carriage return
mov ah,2
int 21h
ret
newLine endp
keyin proc
mov ah, 1 ; getting a key from the keyboard
int 21h
ret
keyin endp
displayFib proc
;display zero as a 0'th term
MOV DX, 30h ; move value 30 hexadecimal to DX, which represents 0
call display
MOV AX, input
CMP AX, 0 ;if the input is 0 in hexadecimal ASCII value then jump to finish
JE finish_it
mov ah,9 ; formating - coma
mov dx,offset msg3
int 21h
;display the 1st term
MOV DX, 31h ; move value 31 hexadecimal to DX, which represents 1
call display
CMP input, 1 ;if the input is 1 in hexadecimal ASCII value then jump to finish
JE finish_it
MOV CX, input ;intializing counter, knowing that first 2 terms were displayed already
SUB CX, 2
repeat:
mov ah,9 ; formating - coma
mov dx,offset msg3
int 21h
MOV AX, fibn_2 ; calculating the n'th term of a sequence n = (n-1) + (n-2)
ADD AX, fibn_1
MOV fib, AX
MOV DX, fib
MOV saveCount, CX ;saving the state of the counter as it will be modified in the displayNum
call displayNum
;display the n'th term (current term)
MOV CX, saveCount ;restoring state of the counter
MOV AX, fibn_1 ; n-1 in the next round of a loop will be n-2
MOV fibn_2, AX
MOV AX, fib ;n'th term in the next round will be n-1
MOV fibn_1, AX
DEC CX ;decrementing counter
JNZ repeat ; loop until counter = 0
finish_it:
ret
displayFib endp
displayNum proc ;display numbers including these with more than one digit
MOV AX, fib ;copying fib to temp
MOV temp, AX
MOV CX,0 ;initializing counter to 0
loop1:
;dividng fib by 10 and pushing reminder on the stock
INC CX ;incrementing counter
MOV ax, temp
MOV bx, 10
SUB dx, dx ;set dx to zero
DIV bx ;BX will contain integer division result and DX remainder
PUSH DX
MOV temp, AX ;temp will hold value of itself integer devided by 10
TEST AX,AX
JNZ loop1
loop2:
POP DX
ADD DX, 30h
call display
DEC CX
JNZ loop2 ;loop until all digits on stack are popped and counter =0
ret
displayNum endp
display proc ; display of a single character
mov ah, 6
int 21h
ret
display endp
end main
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSAgRmlib25hY2NpICBbRklCLkFTTV0KLm1vZGVsIHNtYWxsCi5zdGFjayAxMDBoCgouZGF0YQoKbXNnMSBkYiAiUGxlYXNlIGVudGVyIHRoZSBudW1iZXIgb2YgdGVybXMgaW4gdGhlIGZpYm9uYWNjaSBzZXF1ZW5jZSB0byBkaXNwbGF5OiIsMERILDBBSCwiJCIgO21lc3NhZ2UgdG8gdXNlcgptc2cyIGRiICJEaXNwbGF5aW5nIEZpYm9uYWNjaSBzZXF1ZW5jZSIsMERILDBBSCwiJCIgOyBtZXNzYWdlIHRvIHVzZXIKbXNnMyBkYiAiLCAiLCIkIiAgICA7IGZvcm1hdGluZyAtIGNvbWEKbXNnNCBkYiAiUHJlc3MgYW55IGtleSB0byBjb250aW51ZSIsIiQiCm51bTEgZHcgMCAgICAgICAgO3RoaXMgaXMgYSBudW1lcmljIHZhcmlhYmxlCm51bTIgZHcgIDAgICAgICA7IHRoaXMgaXMgYSBudW1lcmljIHZhcmlhYmxlCmlucHV0IGR3ICAwICAgICAgICAgOyB0aGlzIGlzIGEgbnVtZXJpYyB2YXJpYWJsZQpmaWJuXzEgRFcgMSAgICAgICA7IHdvcmQgbnVtZXJpYyB2YWx1ZSBuLTEgdmFsdWUKZmlibl8yIERXIDAgICAgICAgOyB3b3JkIG51bWVyaWMgdmFsdWUgbi0yIHZhbHVlCmZpYiBEVyAwICAgICAgICA7IHdvcmQgbnVtZXJpYyB2YWx1ZQp0ZW1wICAgIERXIDAgICAgOyB3b3JkIG51bWVyaWMgdmFsdWUKc2F2ZUNvdW50IERXIDAgIDtjb3VudGVyIHN0b3JhZ2UKCgouY29kZSAgICAKCm1haW4gcHJvYwogICAgbW92ICAgYXgsQGRhdGEgICAgICAgOyBzZXQgdXAgZGF0YSBzZWdtZW50CiAgICBtb3YgICBkcyxheAoKICAgICAgICAgICAgICAgICA7IGNsZWFyIHRoZSBzY3JlZW4KCiAgICBtb3YgICBhaCw5ICAgICAgICAgICAgICA7IHNlbmQgbWVzc2FnZSB3aXRoIGluc3RydWN0aW9ucyBmb3IgdXNlcgogICAgbW92ICAgZHgsb2Zmc2V0IG1zZzEKICAgIGludCAgIDIxaCAgICAgICAgICAgIAoKICAgIGNhbGwga2V5aW4gICAgICAgICAgO2dldHMgdXNlciBpbnB1dAogICAgU1VCIEFMLCA0OCAgICAgIDtjaGFuZ2VzIEFTQ0lJIHZhbHVlIGludG8gbnVtZXJpYyB2YWx1ZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nCiAgICBtb3YgbnVtMSAsIEFYICAgICAgIDtzYXZlcyB1c2VyIGlucHV0IHRvIHZhcmlhYmxlIG51bTEKICAgIGNhbGwga2V5aW4gICAgICAgICAgO2dldHMgdXNlciBpbnB1dAogICAgU1VCIEFMLCA0OCAgICAgIDtjaGFuZ2VzIEFTQ0lJIHZhbHVlIGludG8gbnVtZXJpYyB2YWx1ZSBmb3IgZnVydGhlciBwcm9jZXNzaW5nCiAgICBtb3YgbnVtMiAsIEFYICAgICAgIDtzYXZlcyB1c2VyIGlucHV0IHRvIHZhcmlhYmxlIG51bTIsIHNvIG5vdyB3ZSBoYXZlIGJvdGggZGlnaXRzCgogICAgO211bHRpcGx5aW5nIG51bTEgMTAgdGltZXMKCiAgICBNT1YgIENYLCAxMAogICAgcmVwZWF0MTogICAgICAgICAgICA7IGxvb3AgMTAgdGltZXMKICAgICAgICBNT1YgQVgsIE5VTTEgICAgO2NvcGllcyB2YWx1ZSBvZiBudW0xIHRvIEFYCiAgICAgICAgQUREIGlucHV0LCBBWCAgIDthZGRzIHZhbHVlIGZyb20gQVgKICAgICAgICBERUMgQ1ggICAgICA7ZGVjcmVtZW50cyB0aGUgY291bnRlcgogICAgICAgIEpOWiByZXBlYXQxIDtsb29wcyB1bnRpbCBjb3VudGVyID0gMAoKICAgIE1PViBBWCwgbnVtMiAgICAgICAgO2FkZGluZyB0aGUgdmFsdWUgZnJvbSBudW0yIHNvIGlmIHVzZXIgZW50ZXJlZCA4Mywgc28gaXQgd2FzIG51bTE9OCBudW0yPTMsIHRoZW4gd2UgbXVsdGlwbGllZCA4eDEwPTgwLCBzbyB3ZSBhZGQgODArMyBhbmQgd2UgZ2V0IDgzCiAgICBBREQgaW5wdXQsIEFYCgogICAgY2FsbCBuZXdMaW5lCiAgICBtb3YgICBhaCw5ICAgICAgICAgICAgICA7IHNlbmQgaW5mb3JtYXRpdmUgbWVzc2FnZSB0byB1c2VyIHJlZ2FyZGluZyBkaXNwbGF5aW5nIHRoZSBzZXF1ZW5jZQogICAgbW92ICAgZHgsb2Zmc2V0IG1zZzIKICAgIGludCAgIDIxaCAKICAgIGNhbGwgbmV3TGluZQoKICAgIGNhbGwgZGlzcGxheUZpYgoKICAgIGNhbGwgbmV3TGluZQogICAgbW92ICAgYXgsNEMwMGggICAgICAgOyByZXR1cm4gdG8gRE9TCiAgICAgICAgaW50ICAgMjFoCgptYWluIGVuZHAKCgpuZXdMaW5lIHByb2MgICAgICAgICAgICA7cHJvY2VkdXJlIGRpc3BsYXlzIG5ldyBsaW5lCiAgICBtb3YgZHgsMERoICAgICAgO2xpbmUgZmVlZAogICAgbW92IGFoLDIKICAgIGludCAyMWggIAogICAgbW92IGR4LDBBaCAgICAgIDtjYXJyaWFnZSByZXR1cm4KICAgIG1vdiBhaCwyCiAgICBpbnQgMjFoCiAgICByZXQKbmV3TGluZSBlbmRwCgoKCgprZXlpbiBwcm9jCiAgICBtb3YgYWgsIDEgOyBnZXR0aW5nIGEga2V5IGZyb20gdGhlIGtleWJvYXJkIAogICAgaW50IDIxaCAKICAgIHJldAprZXlpbiBlbmRwCgpkaXNwbGF5RmliIHByb2MKICAgIDtkaXNwbGF5IHplcm8gYXMgYSAwJ3RoIHRlcm0KICAgIE1PViBEWCwgMzBoICAgICAgICAgOyBtb3ZlIHZhbHVlIDMwIGhleGFkZWNpbWFsIHRvIERYLCB3aGljaCByZXByZXNlbnRzIDAKICAgIGNhbGwgZGlzcGxheQogICAgTU9WIEFYLCBpbnB1dCAgIAogICAgQ01QIEFYLCAwICAgICAgICA7aWYgdGhlIGlucHV0IGlzIDAgaW4gaGV4YWRlY2ltYWwgQVNDSUkgdmFsdWUgdGhlbiBqdW1wIHRvIGZpbmlzaAogICAgSkUgZmluaXNoX2l0CgogICAgbW92ICAgYWgsOSAgICAgICAgICAgICAgOyBmb3JtYXRpbmcgLSBjb21hCiAgICBtb3YgICBkeCxvZmZzZXQgbXNnMwogICAgaW50ICAgMjFoICAgICAgIAoKICAgIDtkaXNwbGF5IHRoZSAxc3QgdGVybQogICAgTU9WIERYLCAzMWggICAgICAgICA7IG1vdmUgdmFsdWUgMzEgaGV4YWRlY2ltYWwgdG8gRFgsIHdoaWNoIHJlcHJlc2VudHMgMQogICAgY2FsbCBkaXNwbGF5CiAgICBDTVAgaW5wdXQsIDEgICAgICAgIDtpZiB0aGUgaW5wdXQgaXMgMSBpbiBoZXhhZGVjaW1hbCBBU0NJSSB2YWx1ZSB0aGVuIGp1bXAgdG8gZmluaXNoCiAgICBKRSBmaW5pc2hfaXQKCiAgICBNT1YgQ1gsIGlucHV0ICAgICAgIDtpbnRpYWxpemluZyBjb3VudGVyLCBrbm93aW5nIHRoYXQgZmlyc3QgMiB0ZXJtcyB3ZXJlIGRpc3BsYXllZCBhbHJlYWR5CiAgICBTVUIgQ1gsIDIKCiAgICByZXBlYXQ6CiAgICAgICAgbW92ICAgYWgsOSAgICAgICAgICAgICAgOyBmb3JtYXRpbmcgLSBjb21hCiAgICAgICAgbW92ICAgZHgsb2Zmc2V0IG1zZzMKICAgICAgICBpbnQgICAyMWggICAgICAgCgogICAgICAgIE1PViBBWCwgZmlibl8yICAgICAgICA7IGNhbGN1bGF0aW5nIHRoZSBuJ3RoIHRlcm0gb2YgYSBzZXF1ZW5jZSAgICBuID0gKG4tMSkgKyAobi0yKSAKICAgICAgICBBREQgQVgsIGZpYm5fMQogICAgICAgIE1PViBmaWIsIEFYCiAgICAgICAgTU9WIERYLCBmaWIKICAgICAgICBNT1Ygc2F2ZUNvdW50LCBDWCAgICAgICA7c2F2aW5nIHRoZSBzdGF0ZSBvZiB0aGUgY291bnRlciBhcyBpdCB3aWxsIGJlIG1vZGlmaWVkIGluIHRoZSBkaXNwbGF5TnVtCiAgICAgICAgY2FsbCBkaXNwbGF5TnVtCiAgICAgICAgO2Rpc3BsYXkgdGhlIG4ndGggdGVybSAoY3VycmVudCB0ZXJtKQogICAgICAgIE1PViBDWCwgc2F2ZUNvdW50ICAgICAgIDtyZXN0b3Jpbmcgc3RhdGUgb2YgdGhlIGNvdW50ZXIKICAgICAgICBNT1YgQVgsIGZpYm5fMSAgICAgICAgOyBuLTEgaW4gdGhlIG5leHQgcm91bmQgb2YgYSBsb29wIHdpbGwgYmUgbi0yCiAgICAgICAgTU9WIGZpYm5fMiwgQVgKICAgICAgICBNT1YgQVgsIGZpYiAgICAgICAgIDtuJ3RoIHRlcm0gaW4gdGhlIG5leHQgcm91bmQgd2lsbCBiZSBuLTEKICAgICAgICBNT1YgZmlibl8xLCBBWAogICAgICAgIERFQyAgQ1ggICAgICAgICAgICAgO2RlY3JlbWVudGluZyBjb3VudGVyCiAgICAgICAgSk5aIHJlcGVhdCAgICAgICAgICA7IGxvb3AgdW50aWwgY291bnRlciA9IDAKCiAgICBmaW5pc2hfaXQ6CgogICAgcmV0CmRpc3BsYXlGaWIgZW5kcAoKCmRpc3BsYXlOdW0gcHJvYyAgICAgO2Rpc3BsYXkgbnVtYmVycyBpbmNsdWRpbmcgdGhlc2Ugd2l0aCBtb3JlIHRoYW4gb25lIGRpZ2l0CgogICAgTU9WIEFYLCBmaWIgO2NvcHlpbmcgZmliIHRvIHRlbXAKICAgIE1PViB0ZW1wLCBBWAogICAgTU9WIENYLDAgICAgICAgIDtpbml0aWFsaXppbmcgY291bnRlciB0byAwCiAgICBsb29wMToKICAgICAgICA7ZGl2aWRuZyBmaWIgYnkgMTAgYW5kIHB1c2hpbmcgcmVtaW5kZXIgb24gdGhlIHN0b2NrCiAgICAgICAgSU5DIENYICAgICAgICAgIDtpbmNyZW1lbnRpbmcgY291bnRlcgogICAgICAgIE1PViAgYXgsIHRlbXAKICAgICAgICBNT1YgYngsIDEwCiAgICAgICAgU1VCIGR4LCBkeCAgICAgICAgICAgICAgO3NldCBkeCB0byB6ZXJvCiAgICAgICAgRElWIGJ4ICAgICAgICAgIDtCWCB3aWxsIGNvbnRhaW4gaW50ZWdlciBkaXZpc2lvbiByZXN1bHQgYW5kIERYIHJlbWFpbmRlcgogICAgICAgIFBVU0ggRFgKICAgICAgICBNT1YgdGVtcCwgQVggICAgICAgIDt0ZW1wIHdpbGwgaG9sZCB2YWx1ZSBvZiBpdHNlbGYgaW50ZWdlciBkZXZpZGVkIGJ5IDEwCiAgICAgICAgVEVTVCBBWCxBWAogICAgICAgIEpOWiBsb29wMQogICAgICAgICAKICAgIGxvb3AyOgogICAgICAgIFBPUCBEWAogICAgICAgIEFERCBEWCwgMzBoCiAgICAgICAgY2FsbCBkaXNwbGF5CiAgICAgICAgREVDIENYIAogICAgICAgIEpOWiBsb29wMiAgICAgICA7bG9vcCB1bnRpbCBhbGwgZGlnaXRzIG9uIHN0YWNrIGFyZSBwb3BwZWQgYW5kIGNvdW50ZXIgPTAgCiAgICAgCiAgICByZXQgIAogICAgCiAKZGlzcGxheU51bSBlbmRwCgoKZGlzcGxheSBwcm9jICAgICAgICA7IGRpc3BsYXkgb2YgYSBzaW5nbGUgY2hhcmFjdGVyCiAgICBtb3YgYWgsIDYKICAgIGludCAyMWgKICAgIHJldApkaXNwbGF5IGVuZHAKCgplbmQgIG1haW4=