加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

80x86 汇编语言编程:斐波那契数列--大数处理

发布时间:2020-12-14 02:05:59 所属栏目:大数据 来源:网络整理
导读:关于斐波那契数列,做而论道以前写过一个程序: http://hi.baidu.com/do_sermon/item/6acb5f305f6efd08ceb9fee5 以前的数字大小,限于常用的 16 位数的范围。 有个题目,要求计算斐波那契数列的前30项: http://zhidao.baidu.com/question/87258880472230713


关于斐波那契数列,做而论道以前写过一个程序:


http://hi.baidu.com/do_sermon/item/6acb5f305f6efd08ceb9fee5


以前的数字大小,限于常用的 16 位数的范围。



有个题目,要求计算斐波那契数列的前30项:


http://zhidao.baidu.com/question/872588804722307132.html


算到第 25 项,就超出 16 位二进制数了。


再往下计算,需要用到 32 位数的运算方法。


做而论道编写的程序如下:


ASSUME ? CS:CC,DS:QW

;---------------------------

QW ?SEGMENT


? ? MSG1 ? DB ?13,10,'Please ?input ?n = $'

? ? MSG9 ? DB ?13,'Press any key to continue ... $'

? ? CR_LF ?DB ?13,36


? ? X1 ?DW ? ?

? ? X2 ?DW ? ?

? ? X3 ?DB ? 0


? ? N1 ?DW ? 0,0

? ? N2 ?DW ? 1,0


? ? X ? DW ? ?,? ? ? ? ? ? ?;BIN数字

? ? Y ? DB ? 0,0 ? ;存放BCD码


QW ?ENDS

;---------------------------

CC ?SEGMENT


START:

? ? MOV ? AX,QW

? ? MOV ? DS,AX


? ? LEA ? DX,MSG1

? ? MOV ? AH,9

? ? INT ? 21H


? ? CALL ?INPUT

? ? MOV ? X1,CX

? ? MOV ? X2,CX


? ? CALL ?CR__LF


CAL:

? ? INC ? X3

? ? CMP ? X3,47 ? ? ?;第47项将溢出

? ? JZ ? ?EXIT


? ? MOV ? AX,N1

? ? MOV ? DX,N1 + 2


? ? ADD ? AX,N2

? ? ADC ? DX,N2 + 2


? ? MOV ? BX,N2

? ? MOV ? N1,BX

? ? MOV ? BX,N2 + 2

? ? MOV ? N1 + 2,BX


? ? MOV ? N2,AX

? ? MOV ? N2 + 2,DX


? ? MOV ? AX,X2

? ? SUB ? AX,X1

? ? INC ? AX

? ? MOV ? BL,10

? ? DIV ? BL

? ? MOV ? DX,AX

? ? ADD ? DL,'0'

? ? MOV ? AH,2

? ? INT ? 21H

? ? MOV ? DL,DH

? ? ADD ? DL,'0'

? ? INT ? 21H

? ? MOV ? DL,':'

? ? INT ? 21H

? ? MOV ? DL,' '

? ? INT ? 21H


? ? CALL ?OUTPUT

? ? CALL ?CR__LF


? ? DEC ? X1

? ? JNZ ? CAL

EXIT:

? ? LEA ? DX,MSG9

? ? MOV ? AH,9

? ? INT ? 21H

? ? MOV ? AH,7

? ? INT ? 21H

? ? MOV ? AX,4C00H

? ? INT ? 21H ? ? ? ;返回DOS

;---------------------------

CR__LF:

? ? LEA ? DX,CR_LF

? ? MOV ? AH,9

? ? INT ? 21H

RET

;---------------------------

INPUT:

? ? MOV ? BL,10

? ? MOV ? 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

? ? MOV ? AH,2

? ? INT ? 21H

? ? MOV ? AL,DL

? ? SUB ? AL,30H

? ? MOV ? AH,0

? ? XCHG ?AX,CX

? ? MUL ? BL

? ? ADD ? CX,AX

? ? CMP ? CH,0

? ? JNZ ? IN_END

? ? JMP ? IN_X

IN_END:

? ? RET

;---------------------------

BIN2BCD:

? ? MOV ? AX,N2

? ? MOV ? X + 0,AX

? ? MOV ? AX,N2 + 2

? ? MOV ? X + 2,AX


? ? LEA ? BX,Y + 4

? ? MOV ? CX,5

? ? MOV ? AL,0

_QL_:

? ? MOV ? [BX],AL

? ? DEC ? BX

? ? LOOP ?_QL_


? ? MOV ? CX,32 ? ;四个字节的二进制数

_L0_:

? ? PUSH ?CX


? ? LEA ? BX,X

? ? MOV ? CX,4

? ? CLC

_L1_:

? ? MOV ? AL,[BX]

? ? ADC ? AL,AL

? ? MOV ? [BX],AL

? ? INC ? BX

? ? LOOP ?_L1_


? ? LEA ? BX,5 ? ?;五个字节的十进制数

_L2_:

? ? MOV ? AL,AL

? ? DAA

? ? MOV ? [BX],AL

? ? DEC ? BX

? ? LOOP ?_L2_


? ? POP ? CX

? ? LOOP ?_L0_

RET

;---------------------------

DISP:

? ? LEA ? BX,Y

? ? MOV ? CX,5 ? ?;五个字节的十进制数

_L3_:

? ? MOV ? AL,[BX]

? ? MOV ? AH,0

? ? MOV ? DL,16

? ? DIV ? DL

? ? MOV ? DL,AL

? ? AND ? DL,0FH

? ? ADD ? DL,02H

? ? INT ? 21H

? ? MOV ? DL,[BX]

? ? AND ? DL,30H

? ? INT ? 21H

? ? INC ? BX

? ? LOOP ?_L3_

RET

;---------------------------

OUTPUT:

? ? CALL ?BIN2BCD

? ? CALL ?DISP?

? ? RET

;---------------------------

CC ?ENDS

? ? END ? START

;---------------------------



本程序执行后,输入、输出如下:


c:masm510>mm


Please ?input ?n = 50

01: 0000000001

02: 0000000002

03: 0000000003

04: 0000000005

05: 0000000008

06: 0000000013

07: 0000000021

08: 0000000034

09: 0000000055

10: 0000000089

11: 0000000144

12: 0000000233

13: 0000000377

14: 0000000610

15: 0000000987

16: 0000001597

17: 0000002584

18: 0000004181

19: 0000006765

20: 0000010946

21: 0000017711

22: 0000028657

23: 0000046368

24: 0000075025

25: 0000121393

26: 0000196418

27: 0000317811

28: 0000514229

29: 0000832040

30: 0001346269

31: 0002178309

32: 0003524578

33: 0005702887

34: 0009227465

35: 0014930352

36: 0024157817

37: 0039088169

38: 0063245986

39: 0102334155

40: 0165580141

41: 0267914296

42: 0433494437

43: 0701408733

44: 1134903170

45: 1836311903

46: 2971215073


Press any key to continue ...

c:masm510>


算到第 46 项,就到了 32 位数的极限了。


继续往下算,还可以使用 48 位数、64 位数...。


使用 48 位数计算、输出的程序,可见做而论道前几年写的博文。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读