以下汇编程序只能输出前46项斐波那契数列,怎么把下面的汇编程序用 扩展寄存器 改写,然后能输出更多斐波那契数?求
ASSUME CS:CC, DS:QW
;---------------------------
QW SEGMENT
MSG1 DB 13, 10, 'Please input n = $'
MSG9 DB 13, 10, 'Press any key to continue ... $'
CR_LF DB 13, 10, 36
X1 DW ?
X2 DW ?
X3 DB 0
N1 DW 0, 0
N2 DW 1, 0
X DW ?, ? ;BIN数字
Y DB 0, 0, 0, 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, Y + 4
MOV CX, 5 ;五个字节的十进制数
_L2_:
MOV AL, [BX]
ADC 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, 30H
MOV AH, 02H
INT 21H
MOV DL, [BX]
AND DL, 0FH
ADD DL, 30H
INT 21H
INC BX
LOOP _L3_
RET
;---------------------------
OUTPUT:
CALL BIN2BCD
CALL DISP
RET
;---------------------------
CC ENDS
END START
;---------------------------
assume cs:codesg,ds:data
data segment
fiblist dw 1,1,18 dup(?)
n dw 20
data ends
codesg segment
start:
# 将数据段的地址的传递给ds
mov ax,data
mov ds,ax
# 将的fiblist的地址传给si,用来遍历
lea si,fiblist
# 根据传入的斐波那契的数来确定循环次数
mov cx,n
# 前两项不需要进行计算
sub cx,2
one: # 将后项给ax
mov ax,[si+2]
# 将前项给bx
mov bx,[si]
# 调用fib函数
call fib
# 将最终的结果保存在新的目标中
mov [si+4],ax
# 增加迭代量
add si,2
loop one
mov ah,4ch
int 21h
fib proc
add ax,bx
ret
fib endp
codesg ends
END START
数据值太大了,超出范围了,32位int型最大值是 2147483647,斐波那契数列第46位是1836311903,第47位2971215073,如果定义不了64位数据,那永远显示不了。
仅供参考,nasm编译 f.asm会报错,需要额外处理。(https://www.codenong.com/35102193)
C语言代码:-->gcc f.c --> objdump -d a.out -->f.asm
#include <stdio.h>
int a[1001][1001];
void Fibonacci(int n)
{
int i,j,sum=0;
a[1][0]=1;
a[2][0]=1;
for(i=3;i<=n;i++)
{
for(j=0;j<1001;j++)
{
sum+=a[i-1][j]+a[i-2][j];
a[i][j]=sum%10;
sum/=10;
}
}
for(i=1000;i>=0;i--)
{
if(a[n][i])
break;
}
printf("%d",a[n][i--]);
for(j=i;j>=0;j--)
{
printf("%d",a[n][j]);
}
}
int main ()
{
int i;
for(i=1;i<=100;i++)
{
printf("%d, " ,i);Fibonacci(i);printf("\n");
}
return(0);
}
```bash
[root@curating tcode]# ./a.out
1, 1
2, 1
3, 2
4, 3
5, 5
6, 8
7, 13
8, 21
9, 34
10, 55
11, 89
12, 144
13, 233
14, 377
15, 610
16, 987
17, 1597
18, 2584
19, 4181
20, 6765
21, 10946
22, 17711
23, 28657
24, 46368
25, 75025
26, 121393
27, 196418
28, 317811
29, 514229
30, 832040
31, 1346269
32, 2178309
33, 3524578
34, 5702887
35, 9227465
36, 14930352
37, 24157817
38, 39088169
39, 63245986
40, 102334155
41, 165580141
42, 267914296
43, 433494437
44, 701408733
45, 1134903170
46, 1836311903
47, 2971215073
48, 4807526976
49, 7778742049
50, 12586269025
51, 20365011074
52, 32951280099
53, 53316291173
54, 86267571272
55, 139583862445
56, 225851433717
57, 365435296162
58, 591286729879
59, 956722026041
60, 1548008755920
61, 2504730781961
62, 4052739537881
63, 6557470319842
64, 10610209857723
65, 17167680177565
66, 27777890035288
67, 44945570212853
68, 72723460248141
69, 117669030460994
70, 190392490709135
71, 308061521170129
72, 498454011879264
73, 806515533049393
74, 1304969544928657
75, 2111485077978050
76, 3416454622906707
77, 5527939700884757
78, 8944394323791464
79, 14472334024676221
80, 23416728348467685
81, 37889062373143906
82, 61305790721611591
83, 99194853094755497
84, 160500643816367088
85, 259695496911122585
86, 420196140727489673
87, 679891637638612258
88, 1100087778366101931
89, 1779979416004714189
90, 2880067194370816120
91, 4660046610375530309
92, 7540113804746346429
93, 12200160415121876738
94, 19740274219868223167
95, 31940434634990099905
96, 51680708854858323072
97, 83621143489848422977
98, 135301852344706746049
99, 218922995834555169026
100, 354224848179261915075
[root@curating tcode]# objdump -d a.out
a.out: file format elf64-x86-64
Disassembly of section .init:
00000000004004a0 <.init>:
4004a0: f3 0f 1e fa endbr64
4004a4: 48 83 ec 08 sub $0x8,%rsp
4004a8: 48 8b 05 41 0b 20 00 mov 0x200b41(%rip),%rax # 600ff0 <printf@plt+0x200b10>
4004af: 48 85 c0 test %rax,%rax
4004b2: 74 02 je 4004b6 <putchar@plt-0x1a>
4004b4: ff d0 callq *%rax
4004b6: 48 83 c4 08 add $0x8,%rsp
4004ba: c3 retq
Disassembly of section .plt:
00000000004004c0 <putchar@plt-0x10>:
4004c0: ff 35 42 0b 20 00 pushq 0x200b42(%rip) # 601008 <printf@plt+0x200b28>
4004c6: ff 25 44 0b 20 00 jmpq *0x200b44(%rip) # 601010 <printf@plt+0x200b30>
4004cc: 0f 1f 40 00 nopl 0x0(%rax)
00000000004004d0 <putchar@plt>:
4004d0: ff 25 42 0b 20 00 jmpq *0x200b42(%rip) # 601018 <printf@plt+0x200b38>
4004d6: 68 00 00 00 00 pushq $0x0
4004db: e9 e0 ff ff ff jmpq 4004c0 <putchar@plt-0x10>
00000000004004e0 <printf@plt>:
4004e0: ff 25 3a 0b 20 00 jmpq *0x200b3a(%rip) # 601020 <printf@plt+0x200b40>
4004e6: 68 01 00 00 00 pushq $0x1
4004eb: e9 d0 ff ff ff jmpq 4004c0 <putchar@plt-0x10>
Disassembly of section .text:
00000000004004f0 <.text>:
4004f0: 53 push %rbx
4004f1: bb 01 00 00 00 mov $0x1,%ebx
4004f6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
4004fd: 00 00 00
400500: 89 de mov %ebx,%esi
400502: bf 1b 08 40 00 mov $0x40081b,%edi
400507: 31 c0 xor %eax,%eax
400509: e8 d2 ff ff ff callq 4004e0 <printf@plt>
40050e: 89 df mov %ebx,%edi
400510: 83 c3 01 add $0x1,%ebx
400513: e8 08 01 00 00 callq 400620 <printf@plt+0x140>
400518: bf 0a 00 00 00 mov $0xa,%edi
40051d: e8 ae ff ff ff callq 4004d0 <putchar@plt>
400522: 83 fb 65 cmp $0x65,%ebx
400525: 75 d9 jne 400500 <printf@plt+0x20>
400527: 31 c0 xor %eax,%eax
400529: 5b pop %rbx
40052a: c3 retq
40052b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
400530: f3 0f 1e fa endbr64
400534: 31 ed xor %ebp,%ebp
400536: 49 89 d1 mov %rdx,%r9
400539: 5e pop %rsi
40053a: 48 89 e2 mov %rsp,%rdx
40053d: 48 83 e4 f0 and $0xfffffffffffffff0,%rsp
400541: 50 push %rax
400542: 54 push %rsp
400543: 49 c7 c0 f0 07 40 00 mov $0x4007f0,%r8
40054a: 48 c7 c1 80 07 40 00 mov $0x400780,%rcx
400551: 48 c7 c7 f0 04 40 00 mov $0x4004f0,%rdi
400558: ff 15 8a 0a 20 00 callq *0x200a8a(%rip) # 600fe8 <printf@plt+0x200b08>
40055e: f4 hlt
40055f: 90 nop
400560: f3 0f 1e fa endbr64
400564: c3 retq
400565: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
40056c: 00 00 00
40056f: 90 nop
400570: 48 8d 3d b9 0a 20 00 lea 0x200ab9(%rip),%rdi # 601030 <printf@plt+0x200b50>
400577: 48 8d 05 b2 0a 20 00 lea 0x200ab2(%rip),%rax # 601030 <printf@plt+0x200b50>
40057e: 48 39 f8 cmp %rdi,%rax
400581: 74 15 je 400598 <printf@plt+0xb8>
400583: 48 8b 05 56 0a 20 00 mov 0x200a56(%rip),%rax # 600fe0 <printf@plt+0x200b00>
40058a: 48 85 c0 test %rax,%rax
40058d: 74 09 je 400598 <printf@plt+0xb8>
40058f: ff e0 jmpq *%rax
400591: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
400598: c3 retq
400599: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
4005a0: 48 8d 3d 89 0a 20 00 lea 0x200a89(%rip),%rdi # 601030 <printf@plt+0x200b50>
4005a7: 48 8d 35 82 0a 20 00 lea 0x200a82(%rip),%rsi # 601030 <printf@plt+0x200b50>
4005ae: 48 29 fe sub %rdi,%rsi
4005b1: 48 c1 fe 03 sar $0x3,%rsi
4005b5: 48 89 f0 mov %rsi,%rax
4005b8: 48 c1 e8 3f shr $0x3f,%rax
4005bc: 48 01 c6 add %rax,%rsi
4005bf: 48 d1 fe sar %rsi
4005c2: 74 14 je 4005d8 <printf@plt+0xf8>
4005c4: 48 8b 05 2d 0a 20 00 mov 0x200a2d(%rip),%rax # 600ff8 <printf@plt+0x200b18>
4005cb: 48 85 c0 test %rax,%rax
4005ce: 74 08 je 4005d8 <printf@plt+0xf8>
4005d0: ff e0 jmpq *%rax
4005d2: 66 0f 1f 44 00 00 nopw 0x0(%rax,%rax,1)
4005d8: c3 retq
4005d9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
4005e0: f3 0f 1e fa endbr64
4005e4: 80 3d 55 0a 20 00 00 cmpb $0x0,0x200a55(%rip) # 601040 <printf@plt+0x200b60>
4005eb: 75 13 jne 400600 <printf@plt+0x120>
4005ed: 55 push %rbp
4005ee: 48 89 e5 mov %rsp,%rbp
4005f1: e8 7a ff ff ff callq 400570 <printf@plt+0x90>
4005f6: c6 05 43 0a 20 00 01 movb $0x1,0x200a43(%rip) # 601040 <printf@plt+0x200b60>
4005fd: 5d pop %rbp
4005fe: c3 retq
4005ff: 90 nop
400600: c3 retq
400601: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
400606: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
40060d: 00 00 00
400610: f3 0f 1e fa endbr64
400614: eb 8a jmp 4005a0 <printf@plt+0xc0>
400616: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
40061d: 00 00 00
400620: 55 push %rbp
400621: 89 fd mov %edi,%ebp
400623: 53 push %rbx
400624: 48 83 ec 08 sub $0x8,%rsp
400628: c7 05 d2 19 20 00 01 movl $0x1,0x2019d2(%rip) # 602004 <printf@plt+0x201b24>
40062f: 00 00 00
400632: c7 05 6c 29 20 00 01 movl $0x1,0x20296c(%rip) # 602fa8 <printf@plt+0x202ac8>
400639: 00 00 00
40063c: 83 ff 02 cmp $0x2,%edi
40063f: 0f 8e ad 00 00 00 jle 4006f2 <printf@plt+0x212>
400645: 8d 5f fd lea -0x3(%rdi),%ebx
400648: 41 b8 f0 4e 60 00 mov $0x604ef0,%r8d
40064e: b8 01 00 00 00 mov $0x1,%eax
400653: 31 d2 xor %edx,%edx
400655: 41 bb a4 0f 00 00 mov $0xfa4,%r11d
40065b: 48 69 db 5c f0 ff ff imul $0xfffffffffffff05c,%rbx,%rbx
400662: 41 ba 48 1f 00 00 mov $0x1f48,%r10d
400668: 49 c7 c1 14 d1 ff ff mov $0xffffffffffffd114,%r9
40066f: b9 01 00 00 00 mov $0x1,%ecx
400674: bf 67 66 66 66 mov $0x66666667,%edi
400679: 48 81 eb ec 2e 00 00 sub $0x2eec,%rbx
400680: 49 8d b0 5c f0 ff ff lea -0xfa4(%r8),%rsi
400687: eb 13 jmp 40069c <printf@plt+0x1bc>
400689: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
400690: 4a 8d 04 0e lea (%rsi,%r9,1),%rax
400694: 42 8b 0c 10 mov (%rax,%r10,1),%ecx
400698: 42 8b 04 18 mov (%rax,%r11,1),%eax
40069c: 01 c1 add %eax,%ecx
40069e: 48 83 c6 04 add $0x4,%rsi
4006a2: 01 d1 add %edx,%ecx
4006a4: 89 c8 mov %ecx,%eax
4006a6: f7 ef imul %edi
4006a8: 89 c8 mov %ecx,%eax
4006aa: c1 f8 1f sar $0x1f,%eax
4006ad: c1 fa 02 sar $0x2,%edx
4006b0: 29 c2 sub %eax,%edx
4006b2: 8d 04 92 lea (%rdx,%rdx,4),%eax
4006b5: 01 c0 add %eax,%eax
4006b7: 29 c1 sub %eax,%ecx
4006b9: 89 4e fc mov %ecx,-0x4(%rsi)
4006bc: 4c 39 c6 cmp %r8,%rsi
4006bf: 75 cf jne 400690 <printf@plt+0x1b0>
4006c1: 49 81 c0 a4 0f 00 00 add $0xfa4,%r8
4006c8: 49 81 c2 a4 0f 00 00 add $0xfa4,%r10
4006cf: 49 81 c3 a4 0f 00 00 add $0xfa4,%r11
4006d6: 49 39 d9 cmp %rbx,%r9
4006d9: 74 17 je 4006f2 <printf@plt+0x212>
4006db: 41 8b 88 b8 e0 ff ff mov -0x1f48(%r8),%ecx
4006e2: 41 8b 80 14 d1 ff ff mov -0x2eec(%r8),%eax
4006e9: 49 81 e9 a4 0f 00 00 sub $0xfa4,%r9
4006f0: eb 8e jmp 400680 <printf@plt+0x1a0>
4006f2: 48 63 d5 movslq %ebp,%rdx
4006f5: b8 e7 03 00 00 mov $0x3e7,%eax
4006fa: 48 69 ea a4 0f 00 00 imul $0xfa4,%rdx,%rbp
400701: eb 0f jmp 400712 <printf@plt+0x232>
400703: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
400708: 48 83 e8 01 sub $0x1,%rax
40070c: 48 83 f8 fe cmp $0xfffffffffffffffe,%rax
400710: 74 40 je 400752 <printf@plt+0x272>
400712: 8b b4 85 64 10 60 00 mov 0x601064(%rbp,%rax,4),%esi
400719: 48 63 d8 movslq %eax,%rbx
40071c: 85 f6 test %esi,%esi
40071e: 74 e8 je 400708 <printf@plt+0x228>
400720: 31 c0 xor %eax,%eax
400722: bf 18 08 40 00 mov $0x400818,%edi
400727: e8 b4 fd ff ff callq 4004e0 <printf@plt>
40072c: 85 db test %ebx,%ebx
40072e: 78 1b js 40074b <printf@plt+0x26b>
400730: 8b b4 9d 60 10 60 00 mov 0x601060(%rbp,%rbx,4),%esi
400737: bf 18 08 40 00 mov $0x400818,%edi
40073c: 31 c0 xor %eax,%eax
40073e: 48 83 eb 01 sub $0x1,%rbx
400742: e8 99 fd ff ff callq 4004e0 <printf@plt>
400747: 85 db test %ebx,%ebx
400749: 79 e5 jns 400730 <printf@plt+0x250>
40074b: 48 83 c4 08 add $0x8,%rsp
40074f: 5b pop %rbx
400750: 5d pop %rbp
400751: c3 retq
400752: 48 69 d2 a4 0f 00 00 imul $0xfa4,%rdx,%rdx
400759: bf 18 08 40 00 mov $0x400818,%edi
40075e: 31 c0 xor %eax,%eax
400760: 8b b2 5c 10 60 00 mov 0x60105c(%rdx),%esi
400766: 48 83 c4 08 add $0x8,%rsp
40076a: 5b pop %rbx
40076b: 5d pop %rbp
40076c: e9 6f fd ff ff jmpq 4004e0 <printf@plt>
400771: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
400778: 00 00 00
40077b: 0f 1f 44 00 00 nopl 0x0(%rax,%rax,1)
400780: f3 0f 1e fa endbr64
400784: 41 57 push %r15
400786: 49 89 d7 mov %rdx,%r15
400789: 41 56 push %r14
40078b: 49 89 f6 mov %rsi,%r14
40078e: 41 55 push %r13
400790: 41 89 fd mov %edi,%r13d
400793: 41 54 push %r12
400795: 4c 8d 25 64 06 20 00 lea 0x200664(%rip),%r12 # 600e00 <printf@plt+0x200920>
40079c: 55 push %rbp
40079d: 48 8d 2d 64 06 20 00 lea 0x200664(%rip),%rbp # 600e08 <printf@plt+0x200928>
4007a4: 53 push %rbx
4007a5: 4c 29 e5 sub %r12,%rbp
4007a8: 48 83 ec 08 sub $0x8,%rsp
4007ac: e8 ef fc ff ff callq 4004a0 <putchar@plt-0x30>
4007b1: 48 c1 fd 03 sar $0x3,%rbp
4007b5: 74 1f je 4007d6 <printf@plt+0x2f6>
4007b7: 31 db xor %ebx,%ebx
4007b9: 0f 1f 80 00 00 00 00 nopl 0x0(%rax)
4007c0: 4c 89 fa mov %r15,%rdx
4007c3: 4c 89 f6 mov %r14,%rsi
4007c6: 44 89 ef mov %r13d,%edi
4007c9: 41 ff 14 dc callq *(%r12,%rbx,8)
4007cd: 48 83 c3 01 add $0x1,%rbx
4007d1: 48 39 dd cmp %rbx,%rbp
4007d4: 75 ea jne 4007c0 <printf@plt+0x2e0>
4007d6: 48 83 c4 08 add $0x8,%rsp
4007da: 5b pop %rbx
4007db: 5d pop %rbp
4007dc: 41 5c pop %r12
4007de: 41 5d pop %r13
4007e0: 41 5e pop %r14
4007e2: 41 5f pop %r15
4007e4: c3 retq
4007e5: 90 nop
4007e6: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
4007ed: 00 00 00
4007f0: f3 0f 1e fa endbr64
4007f4: c3 retq
Disassembly of section .fini:
00000000004007f8 <.fini>:
4007f8: f3 0f 1e fa endbr64
4007fc: 48 83 ec 08 sub $0x8,%rsp
400800: 48 83 c4 08 add $0x8,%rsp
400804: c3 retq