X86汇编实现斐波那契数列

程序说明:

输入斐波那契数列的项数, 然后依次输出斐波那契数列, 输入的项数小于256且为数字, 计算的项数不能超过2^16次方, 输入失败是 不会回显数字

因为存结果是AX, 只有16位, 最大为2^16 = 65536,所以程序设置当输入过大时, 只会显示项数小于 65536前的项数

下面是程序的流程图

程序包括3个模块, 分别是主模块, INPUT模块(读取键盘中输入的合法数字), OUTPUT模块(输出数字)

主模块

INPUT模块

OUTPUT模块

代码及其详细注释


ASSUME CS:CODE,DS:DATA
DATA SEGMENT
MSG1 DB 13,10,'Please input the num of Fibonacci,no lager than 256 , N = $'
MSG2 DB 13,10,'Fibonacci Sequence is: $' ;提示信息 N DW 0
F1 DW 0
F2 DW 1 ;计算数列的两个加数
DATA ENDS
;
CODE SEGMENT
START:
MOV AX,DATA
MOV DS,AX ;导入数据
;
LEA DX,MSG1
MOV AH,9
INT 21H ;打印提示信息1 CALL INPUT ;调用INPUT模块, 得到项数 存到 CX中 CMP CX,1 ;如果CX < 1 输入不合法
JB EXIT ;直接退出 MOV N,CX ;令N = CX 即 N为数列项数 LEA DX,MSG2 ;打印输出信息 ‘Fibonacci Sequence is:’
MOV AH,9 ;调用的是9号方法 .09H号调用,字符串输出显示
INT 21H ;先处理第一个项
MOV DL,'1' ; 先把 1 放到输出区
MOV AH,2
INT 21H
MOV DL,' '
INT 21H ; 输出 1 和 空格
DEC N ; N --;
JZ EXIT ; 当 N = 0时,退出 LOOP:
MOV AX,F1 ; 把 AX = F1
ADD AX,F2 ; AX =+ F2
JC EXIT ; AX发生进位 即 AX不能表示数字
MOV BX,F2
MOV F1,BX ;不能 直接MOV F1,F2 不支持这样做
MOV F2,AX ; 把 F2 赋值给 F1 , AX (计算出来的一项) 赋值给 F2
CALL OUTPUT ; 调用输出模块 输出计算的项
MOV DL,' '
MOV AH,2
INT 21H ;输出空格
DEC N ; N--
JNZ LOOP ;跳转到循环LOOP JNZ是由标志位ZF 而ZF是算术运算可以改变的,
;这里可能使ZF发生改变的是上一个指令 DEC N , 当N != 0 条件成立
EXIT:
MOV AH,4CH
INT 21H ;退出程序
;
INPUT:
MOV BL,10 ; BL 为 10
MOV CX,0 ; CX 为 0 IN_X: ;输入数字 MOV AH,7
INT 21H ;读取数据 CMP AL,13 ; 读取的字符是 回车
JE IN_END ; 跳转到输入结束模块 CMP AL,'0' ; 输入不合法 就继续输入
JB IN_X
CMP AL,'9' ; 输入不合法 就继续输入
JA IN_X MOV DL,AL ;把合法数字 存入到DL MOV AH,2 ; 调用2号功能 输出刚才输入的字符
INT 21H
MOV AL,DL
SUB AL,30H ; 把assic码变成数字
MOV AH,0 ; AH 为 0
XCHG AX,CX ; 把cx变成刚输入的数字
MUL BL ; AX = AL * BL(10) 也就是乘以相应的权 百位数乘100 十位数乘10
ADD CX,AX ; CX += AX; cx表示的就是真正输入的斐波那契项数
;这里设置项数的最大值, 项数最大为256 如果输入大于256 就直接结束
CMP CH,0 ;判断CX的前8位是不是为0, 如果不为0, 说明大于256
JNZ IN_END ;大于256 直接结束输入
JMP IN_X ;否则继续输入 IN_END:
RET ;结束调用
;
OUTPUT:
MOV BX,10 ;BX 初始化为 10
MOV CX,0 ;CX 初始为 0
;会接着运行下面的代码
; 下面的代码用于把数字转换成字符串
;方法是每次把数除10 得到余数 压入栈中在,直到被除数为0, 然后依次输出栈顶字符 LOOP1:MOV DX,0 ; DX = 0
DIV BX ; AX为被除数 AX = AX / 10; 余数放在DX里 ,这就是最低位的数字
ADD DL,'0' ; 把DL 加上 '0' 此时 DL是能直接输出的字符数字
PUSH DX ; 把DX 压入栈
INC CX ; CX ++
CMP AX,0
JNZ LOOP1 ; 如果AX 不为 0, 就继续LOOP1
MOV AH,2
LOOP2:POP DX ;循环输出栈的字符
INT 21H
LOOP LOOP2
RET ;结束调用
;
CODE ENDS
END START

X86汇编——计算斐波那契数列程序(详细注释和流程图说明)的更多相关文章

  1. 使用并行的方法计算斐波那契数列 (Fibonacci)

    更新:我的同事Terry告诉我有一种矩阵运算的方式计算斐波那契数列,更适于并行.他还提供了利用TBB的parallel_reduce模板计算斐波那契数列的代码(在TBB示例代码的基础上修改得来,比原始 ...

  2. Android NDK入门实例 计算斐波那契数列一生成jni头文件

    最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...

  3. 以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)

    动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划 ...

  4. 用递归方法计算斐波那契数列(Recursion Fibonacci Sequence Python)

    先科普一下什么叫斐波那契数列,以下内容摘自百度百科: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因意大利数学家列昂纳多·斐波那契(Leonardoda Fibonacci ...

  5. shell脚本计算斐波那契数列

    计算斐波那契数列 [1,1,2,3,5,8,,,,,] #!/bin/bash n=$ num=( ) i= while [[ $i -lt $n ]] do let num[$i]=num[$i-] ...

  6. java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列

    什么是递归 我先看下百度百科的解释: 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的.用递归过程定义的函数,称为递归函数,例如连加.连乘及阶乘等.凡是递归的函数,都是可计算的,即 ...

  7. 关于Haskell计算斐波那契数列的思考

    背景 众所周知,Haskell语言是一门函数式编程语言.函数式编程语言的一大特点就是数值和对象都是不可变的,而这与经常需要对状态目前的值进行修改的动态规划算法似乎有些"格格不入", ...

  8. python计算斐波那契数列

    斐波那契数列就是黄金分割数列 第一项加第二项等于第三项,以此类推 第二项加第三项等于第四项 代码如下 这一段代码实现fib(n)函数返回第n项,PrintFN(m,n,i)函数实现输出第i项斐波那契数 ...

  9. Android NDK入门实例 计算斐波那契数列二生成.so库文件

    上一篇文章输生成了jni头文件,里面包含了本地C代码的信息,提供我们引用的C头文件.下面实现本地代码,再用ndk-build编译生成.so库文件.由于编译时要用到make和gcc,这里很多人是通过安装 ...

随机推荐

  1. P1433 吃奶酪(洛谷)状压dp解法

    嗯?这题竟然是个绿题. 这个题真的不(很)难,我们只是不会计算2点之间的距离,他还给出了公式,这个就有点…… 我们直接套公式去求出需要的值,然后普通的状压dp就可以了. 是的状压dp. 这个题的数据加 ...

  2. p71_文件传送协议FTP

    一.FTP服务器和用户端 FTP是基于客户/服务器(C/S) 的协议. 用户通过一一个客户机程序连接至在远程计算机上运行的服务器程序. 依照FTP协议提供服务,进行文件传送的计算机就是FTP服务器. ...

  3. Vue nextTick 学习历程

    nextTick 详解 这是官网的解释,比较简洁精炼,反正我是第一遍什么都没看懂 在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 经过我一步步测试 ...

  4. Git报错问题集锦

    git merge合并时遇上refusing to merge unrelated histories的解决方案 如果git merge合并的时候出现refusing to merge unrelat ...

  5. layui常用插件(一) 轮播图

    轮播图 <html lang="en"> <head> <meta charset="UTF-8"> <meta ht ...

  6. c++输出左右对齐设置

    #include<iostream> int main(){ using std::cout; cout.setf(std::ios::left); int w = cout.width( ...

  7. 详解 MySQL 面试核心知识点

    一.常见存储引擎 1.1 InnoDB InnoDB 是 MySQL 5.5 之后默认的存储引擎,它具有高可靠.高性能的特点,主要具备以下优势: DML 操作完全遵循 ACID 模型,支持事务,支持崩 ...

  8. Day15_用户中心接口说明

    学于黑马和传智播客联合做的教学项目 感谢 黑马官网 传智播客官网 微信搜索"艺术行者",关注并回复关键词"乐优商城"获取视频和教程资料! b站在线视频 用户中心 ...

  9. PHP 是什么?简介下

    PHP 是服务器端脚本语言. 您应当具备的基础知识 在继续学习之前,您需要对以下知识有基本的了解: HTML CSS PHP 是什么? PHP(全称:PHP:Hypertext Preprocesso ...

  10. PHP strspn() 函数

    实例 返回在字符串 "Hello world!" 中包含字符 "kHlleo" 的数目: <?php高佣联盟 www.cgewang.comecho st ...