Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 如何修复nasm汇编中斐波那契序列的溢出?_Assembly_Nasm_Fibonacci - Fatal编程技术网

Assembly 如何修复nasm汇编中斐波那契序列的溢出?

Assembly 如何修复nasm汇编中斐波那契序列的溢出?,assembly,nasm,fibonacci,Assembly,Nasm,Fibonacci,我是一名装配爱好者,我的任务之一是根据用户输入做斐波那契序列。因此,如果我的用户输入是5,那么输出将如下 0 1. 1. 2. 3. 它被放置在一个数组中,然后索引增加,并进行一些算术运算以获得序列。用户输入限制为25,因此如果用户输入为25,则我的输出应如上所示,一直到值46368。起初,我使用al、bl和cl来做算术运算,但意识到8位寄存器太小,我改为16位 在某一点上,数字显示为负数,我确实理解它是一样的,因为符号位,数字是一个有符号的数字 如何使所有内容都未签名? 在某种程度上,我已经尝

我是一名装配爱好者,我的任务之一是根据用户输入做斐波那契序列。因此,如果我的用户输入是5,那么输出将如下 0 1. 1. 2. 3. 它被放置在一个数组中,然后索引增加,并进行一些算术运算以获得序列。用户输入限制为25,因此如果用户输入为25,则我的输出应如上所示,一直到值46368。起初,我使用al、bl和cl来做算术运算,但意识到8位寄存器太小,我改为16位

在某一点上,数字显示为负数,我确实理解它是一样的,因为符号位,数字是一个有符号的数字 如何使所有内容都未签名? 在某种程度上,我已经尝试过打印UDEC,但在某个时候,这个数字又回到了一个很小的数字,并且没有继续累积 当我编写另一个程序时,我实际上也发生了同样的事情,我使用了al,它是一个8位寄存器,所以我把它改成了一个16位寄存器,它工作了 我也试着把它改成32位寄存器,但还是不行! 据我所知(如果我错了请纠正我),ax的最大值可以达到65536? 斐波那契序列的第25个数字是46368,它仍然在16位寄存器的范围内。 我该如何解决这个溢出的问题

%include "io.inc"

section .bss
fibo    resb 26 * 4; reserve an array of 25 uninitialized bytes
userInput   resb 4 ; reserve 4 bytes for userInput

section .text
global _main
_main:
    mov ebp, esp ; entry point for correct debugging
    xor edx, edx ; initializing my secondary index to 0
    mov eax, 0 ; a = 0
    mov ebx, 1 ; b = 1
    mov ecx, 0 ; c = 0

    PRINT_STRING "Enter a number between 3 and 25 inclusively:" ;prompt user for integer input
    NEWLINE
    GET_DEC 4, userInput ; 

    mov edi, userInput ; 
    mov esi, fibo ; 
    call indexInc ; 
    mov edx, 0 ; 
    call printarray ; 

indexInc:
    mov [esi], eax ; moves the a = 0 in the first element of the array
    inc esi ; increases array index
    mov [esi], ebx ; moves the b = 1 in the second element of the array
    inc esi ; increases array index
    mov edx, 3 ; secondary pointer for comparison purposes

forloop:
    cmp edx, [userInput] ; 
    jg term ;
    add ecx, eax ; 
    add ecx, ebx ; 
    mov [esi], ecx ; 
    mov eax, ebx ; 
    mov ebx, ecx ; 
    xor ecx, ecx ; 
    inc esi ; increase array index
    inc edx ; increase secondary pointer
    jmp forloop ; 

printarray:
    cmp edx, [userInput] ; 
    je term ; 
    PRINT_DEC 1, [fibo + edx] ; 
    NEWLINE
    inc esi ; increase array index
    inc edx ; increase pointer
    jmp printarray ; 

term:
    ret ; terminate program

尝试使用
PRINT\u DEC 4、[fibo+edx]
PRINT\u UDEC 4、[fibo+edx]

从这一点来判断


请注意,装配线不必以
终止-这是注释的开头。
此外,您的程序流程和编码风格也很混乱:除非您正在打高尔夫球或利用一些技巧,否则不要在函数之间共享
ret

向前跳比向后跳更难理解-如果可能,更喜欢
do{}while()超过
而(){}

为标签指定有意义的名称,如果需要,采用命名约定,使函数标签突出。
你的评论很好

我发现,如果汇编代码在空间上按逻辑块分组,则更容易遵循汇编代码(一般代码),从而避免了文本墙效应。
你有两种不同的方式——最好是奇怪(最坏是怀疑)

我认为只需两条指令即可执行斐波那契步骤:

xchg eax, ebx
add ebx, eax

如果
eax
f(n-1)
ebx
f(n)
尝试使用
PRINT\u DEC 4、[fibo+edx]
PRINT\u UDEC 4、[fibo+edx]

从这一点来判断


请注意,装配线不必以
终止-这是注释的开头。
此外,您的程序流程和编码风格也很混乱:除非您正在打高尔夫球或利用一些技巧,否则不要在函数之间共享
ret

向前跳比向后跳更难理解-如果可能,更喜欢
do{}while()超过
而(){}

为标签指定有意义的名称,如果需要,采用命名约定,使函数标签突出。
你的评论很好

我发现,如果汇编代码在空间上按逻辑块分组,则更容易遵循汇编代码(一般代码),从而避免了文本墙效应。
你有两种不同的方式——最好是奇怪(最坏是怀疑)

我认为只需两条指令即可执行斐波那契步骤:

xchg eax, ebx
add ebx, eax

如果
eax
f(n-1)
并且
ebx
f(n)

不要挑剔,但您的代码使用的是32位寄存器,而不是您所说的16位寄存器在输出变为负值之前,您在输出上看到的最大值是多少?您需要显示输出。问题可能是PRINT_DEC或PRINT_UDEC打印出16位值,而不是32位值。查看是否有32位版本的打印。。。功能。对于未签名的32位寄存器,您应该能够升级到fib(47)。不要挑剔,但您的代码使用的是32位寄存器,而不是您所说的16位寄存器。;)在输出变为负值之前,您在输出上看到的最大值是多少?您需要显示输出。问题可能是PRINT_DEC或PRINT_UDEC打印出16位值,而不是32位值。查看是否有32位版本的打印。。。功能。对于无符号32位寄存器,应该可以升到fib(47)。