X86汇编——计算斐波那契数列程序(详细注释和流程图说明)
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汇编——计算斐波那契数列程序(详细注释和流程图说明)的更多相关文章
- 使用并行的方法计算斐波那契数列 (Fibonacci)
更新:我的同事Terry告诉我有一种矩阵运算的方式计算斐波那契数列,更适于并行.他还提供了利用TBB的parallel_reduce模板计算斐波那契数列的代码(在TBB示例代码的基础上修改得来,比原始 ...
- Android NDK入门实例 计算斐波那契数列一生成jni头文件
最近要用到Android NDK,调用本地代码.就学了下Android NDK,顺便与大家分享.下面以一个具体的实例计算斐波那契数列,说明如何利用Android NDK,调用本地代码.以及比较本地代码 ...
- 以计算斐波那契数列为例说说动态规划算法(Dynamic Programming Algorithm Overlapping subproblems Optimal substructure Memoization Tabulation)
动态规划(Dynamic Programming)是求解决策过程(decision process)最优化的数学方法.它的名字和动态没有关系,是Richard Bellman为了唬人而取的. 动态规划 ...
- 用递归方法计算斐波那契数列(Recursion Fibonacci Sequence Python)
先科普一下什么叫斐波那契数列,以下内容摘自百度百科: 斐波那契数列(Fibonacci sequence),又称黄金分割数列.因意大利数学家列昂纳多·斐波那契(Leonardoda Fibonacci ...
- shell脚本计算斐波那契数列
计算斐波那契数列 [1,1,2,3,5,8,,,,,] #!/bin/bash n=$ num=( ) i= while [[ $i -lt $n ]] do let num[$i]=num[$i-] ...
- java 递归及其经典应用--求阶乘、打印文件信息、计算斐波那契数列
什么是递归 我先看下百度百科的解释: 一种计算过程,如果其中每一步都要用到前一步或前几步的结果,称为递归的.用递归过程定义的函数,称为递归函数,例如连加.连乘及阶乘等.凡是递归的函数,都是可计算的,即 ...
- 关于Haskell计算斐波那契数列的思考
背景 众所周知,Haskell语言是一门函数式编程语言.函数式编程语言的一大特点就是数值和对象都是不可变的,而这与经常需要对状态目前的值进行修改的动态规划算法似乎有些"格格不入", ...
- python计算斐波那契数列
斐波那契数列就是黄金分割数列 第一项加第二项等于第三项,以此类推 第二项加第三项等于第四项 代码如下 这一段代码实现fib(n)函数返回第n项,PrintFN(m,n,i)函数实现输出第i项斐波那契数 ...
- Android NDK入门实例 计算斐波那契数列二生成.so库文件
上一篇文章输生成了jni头文件,里面包含了本地C代码的信息,提供我们引用的C头文件.下面实现本地代码,再用ndk-build编译生成.so库文件.由于编译时要用到make和gcc,这里很多人是通过安装 ...
随机推荐
- 【week1错题集】
day9[2.f] # day9 题2.f ''' 有如下文件,t1.txt,里面的内容为: 葫芦娃,葫芦娃, 一根藤上七个瓜 风吹雨打,都不怕, 啦啦啦啦. 以r模式打开文件,从‘风吹雨打..... ...
- 题解 洛谷 P4569 【[BJWC2011]禁忌】
考虑用\(AC\)自动机来解决本题这样的多字符串匹配问题. 要最大化魔法分割后得到的禁忌串数目,最优情况肯定为在一个串中每个禁忌串的右端点进行分割.对应到\(AC\)自动机上,就是匹配到一个禁忌串后, ...
- Python学习周期 学习Python要多久?
学习python编程需要多长时间?首先我们需要明确一点,在互联网技术领域,技术始终在不断的迭代升级,只要进入IT行业就要时刻保持学习的状态,才能不被技术进步的车轮碾压.我们目前讨论的python学习周 ...
- 网络流(EK算法)
poj1273 #include <iostream> #include <cstdio> #include <cstring> #include <queu ...
- ajax快速入门
一.ajax简单入门 1.Ajax的实现步骤 // 1.创建ajax对象var xhr = new XMLHttpRequest();// 2.高数ajax请求地址及请求方式//第一个参数就是请求方式 ...
- 如何在CSDN博客开头处加上版权声明?
1.首先在CSDN账号头像处打开"管理博客"选项. 2.然后在管理博客界面左侧找到设置下面的"博客设置"选项. 3.将博客设置里的"版权声明" ...
- Redis在Linux下的安装
一.下载地址 ①redis中文网下载地址:http://www.redis.cn/ ②百度云网盘下载地址:https://pan.baidu.com/s/1UQcF9V3lwA0fxquM_JFMZw ...
- Java后端总结
Java后端开发学习路线 编程基础 Java语言 语言基础 基础语法 面向对象 接口 容器 异常 泛型 反射 注解 I/O 图形化(如Swing) JVM 类加载机制 字节码执行机制 jvm内存模型 ...
- Django开发之Datetime类型JSON序列化时报错
前提回顾 在进行django开发view视图时,如果数据库字段是 datetime类型,在JSON序列化返回时,会出现异常 异常现象 TypeError: Object of type datetim ...
- Python os.fdatasync() 方法
概述 os.fdatasync() 方法用于强制将文件写入磁盘,该文件由文件描述符fd指定,但是不强制更新文件的状态信息.高佣联盟 www.cgewang.com 如果你需要刷新缓冲区可以使用该方法. ...