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 "Please enter a suitable number in range [1-25]","$"
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 AH,0
MOV num1 , AX ;saves user input to variable num1
SUB AL,'0'
MOV BL,10
MUL BL
call keyin ;gets user input
SUB AL, 48 ;changes ASCII value into numeric value for further processing
MOV AH,0
MOV num2 , AX ;saves user input to variable num2, so now we have both digits
CHECKINPUT:
CMP AX,25
JAE WARNING
JMP STEP1
WARNING:
mov ah,09
mov dx,offset msg4
int 21h
JMP CHECKINPUT
STEP1:
;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
PUSH CX ;saving the state of the counter as it will be modified in the displayNum
call displayNum
;display the n'th term (current term)
POP CX ;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
dGl0bGUgIEZpYm9uYWNjaSAgW0ZJQi5BU01dCi5tb2RlbCBzbWFsbAouc3RhY2sgMTAwaAoKLmRhdGEKCm1zZzEgZGIgIlBsZWFzZSBlbnRlciB0aGUgbnVtYmVyIG9mIHRlcm1zIGluIHRoZSBmaWJvbmFjY2kgc2VxdWVuY2UgdG8gZGlzcGxheToiLDBESCwwQUgsIiQiIDttZXNzYWdlIHRvIHVzZXIKbXNnMiBkYiAiRGlzcGxheWluZyBGaWJvbmFjY2kgc2VxdWVuY2UiLDBESCwwQUgsIiQiIDsgbWVzc2FnZSB0byB1c2VyCm1zZzMgZGIgIiwgIiwiJCIgICAgOyBmb3JtYXRpbmcgLSBjb21hCm1zZzQgZGIgIlBsZWFzZSBlbnRlciBhIHN1aXRhYmxlIG51bWJlciBpbiByYW5nZSBbMS0yNV0iLCIkIgpudW0xIGR3IDAgICAgICAgIDt0aGlzIGlzIGEgbnVtZXJpYyB2YXJpYWJsZQpudW0yIGR3ICAwICAgICAgOyB0aGlzIGlzIGEgbnVtZXJpYyB2YXJpYWJsZQppbnB1dCBkdyAgMCAgICAgICAgIDsgdGhpcyBpcyBhIG51bWVyaWMgdmFyaWFibGUKZmlibl8xIERXIDEgICAgICAgOyB3b3JkIG51bWVyaWMgdmFsdWUgbi0xIHZhbHVlCmZpYm5fMiBEVyAwICAgICAgIDsgd29yZCBudW1lcmljIHZhbHVlIG4tMiB2YWx1ZQpmaWIgRFcgMCAgICAgICAgOyB3b3JkIG51bWVyaWMgdmFsdWUKdGVtcCAgICBEVyAwICAgIDsgd29yZCBudW1lcmljIHZhbHVlCnNhdmVDb3VudCBEVyAwICA7Y291bnRlciBzdG9yYWdlCgoKLmNvZGUgICAgCgoKbWFpbiBwcm9jCgogICAgbW92ICAgYXgsQGRhdGEgICAgICAgOyBzZXQgdXAgZGF0YSBzZWdtZW50CiAgICBtb3YgICBkcyxheAoKICAgICAgICAgICAgICAgOyBjbGVhciB0aGUgc2NyZWVuCgogICAgbW92ICAgYWgsOSAgICAgICAgICAgICAgOyBzZW5kIG1lc3NhZ2Ugd2l0aCBpbnN0cnVjdGlvbnMgZm9yIHVzZXIKICAgIG1vdiAgIGR4LG9mZnNldCBtc2cxCiAgICBpbnQgICAyMWggICAgICAgICAgICAKIAogICAgCiAgICBjYWxsIGtleWluICAgICAgICAgIDtnZXRzIHVzZXIgaW5wdXQKCiAgICBTVUIgQUwsIDQ4ICAgICAgO2NoYW5nZXMgQVNDSUkgdmFsdWUgaW50byBudW1lcmljIHZhbHVlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcKICAgIE1PViBBSCwwCiAgICBNT1YgbnVtMSAsIEFYICAgICAgIDtzYXZlcyB1c2VyIGlucHV0IHRvIHZhcmlhYmxlIG51bTEKICAgIFNVQiBBTCwnMCcKICAgIE1PViBCTCwxMAogICAgTVVMIEJMCiAgICAgICAgICAgIAogICAgY2FsbCBrZXlpbiAgICAgICAgO2dldHMgdXNlciBpbnB1dAogICAgCiAgICBTVUIgQUwsIDQ4ICAgICAgO2NoYW5nZXMgQVNDSUkgdmFsdWUgaW50byBudW1lcmljIHZhbHVlIGZvciBmdXJ0aGVyIHByb2Nlc3NpbmcKICAgIE1PViBBSCwwCiAgICBNT1YgbnVtMiAsIEFYICAgICAgIDtzYXZlcyB1c2VyIGlucHV0IHRvIHZhcmlhYmxlIG51bTIsIHNvIG5vdyB3ZSBoYXZlIGJvdGggZGlnaXRzCiAgICAgCiAgICAgICAgICAgICAgICAgIAogICAgQ0hFQ0tJTlBVVDoKICAgIAogICAgQ01QIEFYLDI1CiAgICBKQUUgV0FSTklORyAKICAgIEpNUCBTVEVQMQogICAgCiAgICBXQVJOSU5HOgogICAgCiAgICBtb3YgICBhaCwwOSAgICAgICAgICAgICAgCiAgICBtb3YgICBkeCxvZmZzZXQgbXNnNAogICAgaW50ICAgMjFoCiAgICBKTVAgQ0hFQ0tJTlBVVCAKICAgIAoKCiAgICBTVEVQMToKICAgIDttdWx0aXBseWluZyBudW0xIDEwIHRpbWVzCgogICAgTU9WICBDWCwxMAogICAgcmVwZWF0MTogICAgICAgICAgICA7IGxvb3AgMTAgdGltZXMKCiAgICAgICAgTU9WIEFYLCBOVU0xICAgIDtjb3BpZXMgdmFsdWUgb2YgbnVtMSB0byBBWAogICAgICAgIEFERCBpbnB1dCwgQVggICA7YWRkcyB2YWx1ZSBmcm9tIEFYCiAgICAgICAgREVDIENYICAgICAgO2RlY3JlbWVudHMgdGhlIGNvdW50ZXIKICAgICAgICBKTlogcmVwZWF0MSA7bG9vcHMgdW50aWwgY291bnRlciA9IDAKCiAgICBNT1YgQVgsIG51bTIgICAgICAgIDthZGRpbmcgdGhlIHZhbHVlIGZyb20gbnVtMiBzbyBpZiB1c2VyIGVudGVyZWQgODMsIHNvIGl0IHdhcyBudW0xPTggbnVtMj0zLCB0aGVuIHdlIG11bHRpcGxpZWQgOHgxMD04MCwgc28gd2UgYWRkIDgwKzMgYW5kIHdlIGdldCA4MwogICAgQUREIGlucHV0LCBBWAoKICAgIGNhbGwgbmV3TGluZQogICAgbW92ICAgYWgsOSAgICAgICAgICAgICAgOyBzZW5kIGluZm9ybWF0aXZlIG1lc3NhZ2UgdG8gdXNlciByZWdhcmRpbmcgZGlzcGxheWluZyB0aGUgc2VxdWVuY2UKICAgIG1vdiAgIGR4LG9mZnNldCBtc2cyCiAgICBpbnQgICAyMWggCiAgICBjYWxsIG5ld0xpbmUKCiAgICBjYWxsIGRpc3BsYXlGaWIKICAgIGNhbGwgbmV3TGluZSAKICAgIAogICAgbW92ICAgYXgsNEMwMGggICAgICAgOyByZXR1cm4gdG8gRE9TCiAgICBpbnQgICAyMWgKCm1haW4gZW5kcAoKCm5ld0xpbmUgcHJvYyAgICAgICAgICAgIDtwcm9jZWR1cmUgZGlzcGxheXMgbmV3IGxpbmUKCiAgICBtb3YgZHgsMERoICAgICAgO2xpbmUgZmVlZAogICAgbW92IGFoLDIKICAgIGludCAyMWggIAogICAgbW92IGR4LDBBaCAgICAgIDtjYXJyaWFnZSByZXR1cm4KICAgIG1vdiBhaCwyCiAgICBpbnQgMjFoCiAgICByZXQKCm5ld0xpbmUgZW5kcAoKCmtleWluIHByb2MKCiAgICBtb3YgYWgsIDEgOyBnZXR0aW5nIGEga2V5IGZyb20gdGhlIGtleWJvYXJkIAogICAgaW50IDIxaCAKICAgIHJldAoKa2V5aW4gZW5kcAoKZGlzcGxheUZpYiBwcm9jCgogICAgO2Rpc3BsYXkgemVybyBhcyBhIDAndGggdGVybQogICAgTU9WIERYLCAzMGggICAgICAgICA7IG1vdmUgdmFsdWUgMzAgaGV4YWRlY2ltYWwgdG8gRFgsIHdoaWNoIHJlcHJlc2VudHMgMAogICAgY2FsbCBkaXNwbGF5CiAgICBNT1YgQVgsIGlucHV0ICAgCiAgICBDTVAgQVgsIDAgICAgICAgIDtpZiB0aGUgaW5wdXQgaXMgMCBpbiBoZXhhZGVjaW1hbCBBU0NJSSB2YWx1ZSB0aGVuIGp1bXAgdG8gZmluaXNoCiAgICBKRSBmaW5pc2hfaXQKCiAgICBtb3YgICBhaCw5ICAgICAgICAgICAgICA7IGZvcm1hdGluZyAtIGNvbWEKICAgIG1vdiAgIGR4LG9mZnNldCBtc2czCiAgICBpbnQgICAyMWggICAgICAgCgogICAgO2Rpc3BsYXkgdGhlIDFzdCB0ZXJtCiAgICBNT1YgRFgsIDMxaCAgICAgICAgIDsgbW92ZSB2YWx1ZSAzMSBoZXhhZGVjaW1hbCB0byBEWCwgd2hpY2ggcmVwcmVzZW50cyAxCiAgICBjYWxsIGRpc3BsYXkKICAgIENNUCBpbnB1dCwgMSAgICAgICAgO2lmIHRoZSBpbnB1dCBpcyAxIGluIGhleGFkZWNpbWFsIEFTQ0lJIHZhbHVlIHRoZW4ganVtcCB0byBmaW5pc2gKICAgIEpFIGZpbmlzaF9pdAoKICAgIE1PViBDWCwgaW5wdXQgICAgICAgO2ludGlhbGl6aW5nIGNvdW50ZXIsIGtub3dpbmcgdGhhdCBmaXJzdCAyIHRlcm1zIHdlcmUgZGlzcGxheWVkIGFscmVhZHkKICAgIFNVQiBDWCwgMgoKICAgIHJlcGVhdDoKCiAgICAgICAgbW92ICAgYWgsOSAgICAgICAgICAgICAgOyBmb3JtYXRpbmcgLSBjb21hCiAgICAgICAgbW92ICAgZHgsb2Zmc2V0IG1zZzMKICAgICAgICBpbnQgICAyMWggICAgICAgCgogICAgICAgIE1PViBBWCwgZmlibl8yICAgICAgICA7IGNhbGN1bGF0aW5nIHRoZSBuJ3RoIHRlcm0gb2YgYSBzZXF1ZW5jZSAgICBuID0gKG4tMSkgKyAobi0yKSAKICAgICAgICBBREQgQVgsIGZpYm5fMQogICAgICAgIE1PViBmaWIsIEFYCiAgICAgICAgTU9WIERYLCBmaWIKICAgICAgICAKICAgICAgICBQVVNIIENYICAgICAgIDtzYXZpbmcgdGhlIHN0YXRlIG9mIHRoZSBjb3VudGVyIGFzIGl0IHdpbGwgYmUgbW9kaWZpZWQgaW4gdGhlIGRpc3BsYXlOdW0KICAgICAgICBjYWxsIGRpc3BsYXlOdW0KICAgICAgICA7ZGlzcGxheSB0aGUgbid0aCB0ZXJtIChjdXJyZW50IHRlcm0pCiAgICAgICAgCiAgICAgICAgUE9QIENYICAgICAgIDtyZXN0b3Jpbmcgc3RhdGUgb2YgdGhlIGNvdW50ZXIKICAgICAgICBNT1YgQVgsIGZpYm5fMSAgICAgICAgOyBuLTEgaW4gdGhlIG5leHQgcm91bmQgb2YgYSBsb29wIHdpbGwgYmUgbi0yCiAgICAgICAgTU9WIGZpYm5fMiwgQVgKICAgICAgICBNT1YgQVgsIGZpYiAgICAgICAgIDtuJ3RoIHRlcm0gaW4gdGhlIG5leHQgcm91bmQgd2lsbCBiZSBuLTEKICAgICAgICBNT1YgZmlibl8xLCBBWAogICAgICAgIERFQyAgQ1ggICAgICAgICAgICAgO2RlY3JlbWVudGluZyBjb3VudGVyCiAgICAgCiAgICAgICAgSk5aIHJlcGVhdCAgICAgICAgICA7IGxvb3AgdW50aWwgY291bnRlciA9IDAKCiAgICBmaW5pc2hfaXQ6CiAgICAKICAgIAogICAgcmV0CmRpc3BsYXlGaWIgZW5kcAoKCmRpc3BsYXlOdW0gcHJvYyAgICAgO2Rpc3BsYXkgbnVtYmVycyBpbmNsdWRpbmcgdGhlc2Ugd2l0aCBtb3JlIHRoYW4gb25lIGRpZ2l0CgogICAgTU9WIEFYLCBmaWIgO2NvcHlpbmcgZmliIHRvIHRlbXAKICAgIE1PViB0ZW1wLCBBWAogICAgTU9WIENYLDAgICAgICAgIDtpbml0aWFsaXppbmcgY291bnRlciB0byAwCgogICAgbG9vcDE6CiAgICAgICAgO2RpdmlkbmcgZmliIGJ5IDEwIGFuZCBwdXNoaW5nIHJlbWluZGVyIG9uIHRoZSBzdG9jawogICAgICAgIElOQyBDWCAgICAgICAgICA7aW5jcmVtZW50aW5nIGNvdW50ZXIKICAgICAgICBNT1YgIGF4LCB0ZW1wCiAgICAgICAgTU9WIGJ4LCAxMAogICAgICAgIFNVQiBkeCwgZHggICAgICAgICAgICAgIDtzZXQgZHggdG8gemVybwogICAgICAgIERJViBieCAgICAgICAgICA7Qlggd2lsbCBjb250YWluIGludGVnZXIgZGl2aXNpb24gcmVzdWx0IGFuZCBEWCByZW1haW5kZXIKICAgICAgICBQVVNIIERYCiAgICAgICAgTU9WIHRlbXAsIEFYICAgICAgICA7dGVtcCB3aWxsIGhvbGQgdmFsdWUgb2YgaXRzZWxmIGludGVnZXIgZGV2aWRlZCBieSAxMAogICAgICAgIFRFU1QgQVgsQVgKICAgICAgICBKTlogbG9vcDEKICAgICAgICAgCiAgICBsb29wMjoKCiAgICAgICAgUE9QIERYCiAgICAgICAgQUREIERYLCAzMGgKICAgICAgICBjYWxsIGRpc3BsYXkKICAgICAgICBERUMgQ1ggCiAgICAgICAgSk5aIGxvb3AyICAgICAgIDtsb29wIHVudGlsIGFsbCBkaWdpdHMgb24gc3RhY2sgYXJlIHBvcHBlZCBhbmQgY291bnRlciA9MAoKICAgIHJldApkaXNwbGF5TnVtIGVuZHAKCgpkaXNwbGF5IHByb2MgICAgICAgIDsgZGlzcGxheSBvZiBhIHNpbmdsZSBjaGFyYWN0ZXIKICAgCiAgICBtb3YgYWgsIDYKICAgIGludCAyMWgKICAgIHJldAoKZGlzcGxheSBlbmRwCgoKZW5kICBtYWlu