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,这里很多人是通过安装 ...
随机推荐
- Ethical Hacking - Web Penetration Testing(8)
SQL INJECTION WHAT IS SQL? Most websites use a database to store data. Most data stored in it(userna ...
- Guava集合--新集合类型
Guava引入了很多JDK没有的.但我们发现明显有用的新集合类型.这些新类型是为了和JDK集合框架共存,而没有往JDK集合抽象中硬塞其他概念.作为一般规则,Guava集合非常精准地遵循了JDK接口契约 ...
- 题解 洛谷 P5303 【[GXOI/GZOI2019]逼死强迫症】
可以先去考虑没有\(1 \times 1\)的砖块的情况,对于最后一个位置只有两种情况,一个是竖着用一块砖铺设\(2 \times 1\),另一个为横着用两块砖铺设\(2 \times 2\). 设没 ...
- org.apache.commons.net.ftp.FTPConnectionClosedException: Connection closed without indication
Ftp问题 最近遇到了ftp读取中文乱码的问题,代码中使用的是FtpClient.google一下找到了解决方案. FTP协议里面,规定文件名编码为iso-8859-1,FTP类中默认的编码也是这个. ...
- Python网络爬虫四大选择器用法原理总结
前几天小编连续写了四篇关于Python选择器的文章,分别用正则表达式.BeautifulSoup.Xpath.CSS选择器分别抓取京东网的商品信息.今天小编来给大家总结一下这四个选择器,让大家更加深刻 ...
- 001.Nginx简介
一 Nginx概述 1.1 Nginx简介 Nginx是一个高性能的HTTP和反向代理web服务器,Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在B ...
- DJANGO-天天生鲜项目从0到1-008-列表页
本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...
- windows 下部署 .netcore 到 iis
园子里已经有许多 ASP.NET Core 部署的相关文章,不同环境有不同的配置方法,建议同鞋们在动手之前也看看官方说明,做到心中有数.我在实践的时候用的是 win8.1 + .net core 3 ...
- scrapy分布式浅谈+京东示例
scrapy分布式浅谈+京东示例: 学习目标: 分布式概念与使用场景 浅谈去重 浅谈断点续爬 分布式爬虫编写流程 基于scrapy_redis的分布式爬虫(阳关院务与京东图书案例) 环境准备: 下载r ...
- php iamp 接收邮件,收取邮件,获取邮件列表
每次想写的时候吧,提笔忘字.等到再次使用,又得想半天,,,,,好尴尬. 这次一边做一边写. 心得,程序员从菜鸟往老鸟转变的重要一步,学英语,看文档,在此我万分感谢鸟哥,,,,没他php哪有官方的中文注 ...