我是一名业余组装用户,我的任务之一是根据用户输入进行斐波那契数列。因此,如果我的用户输入为5,则输出将像这样 0 1个 1个 2 3 它被放置在一个数组中,然后索引增加,并进行了一些算术运算以实现序列。用户输入限制为25,因此,如果用户输入为25,则我的输出应如上所示,一直到46368的值。首先,我使用al,bl和cl进行算术运算,但是意识到8位寄存器太小,我改为16位。
在某些时候,这个数字是负数,我知道这是因为有符号位,而这个数字是一个有符号数 我如何使所有内容都未签名? 在某种程度上,我已经尝试过执行PRINT_UDEC,但是在某个时间点,该数字返回到一个较小的数字,并且不会一直累加 当我正在编写另一个程序并使用al(这是8位寄存器)时,实际上发生了同样的事情,因此我只是将其更改为16位寄存器,并且它起作用了 我也尝试将其更改为32位寄存器,但仍然无法正常工作! 据我所知(纠正我,如果我错了),斧头的最大价值可以达到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
答案 0 :(得分:2)
尝试使用PRINT_DEC 4, [fibo + edx]
或PRINT_UDEC 4, [fibo + edx]
。
从this source来看。
请注意,装配线不必以;
结尾-这是注释的开始。
另外,您的程序流程和编码风格也很凌乱:除非您打高尔夫球或利用一些技巧,否则不要跨函数共享ret
。
向前跳 比向后跳 更难-可能的话,更喜欢do {} while ();
胜过while () {}
。
给标签赋予有意义的名称,并在需要时采用使功能标签脱颖而出的命名约定。
您的评论是有根据的。
我发现,如果将汇编代码在空间上分组在逻辑块中,那么遵循汇编代码(通常是代码)会更容易-避免了文字墙的影响。
您以两种不同的方式zeroing registers –最好是很奇怪(最可疑是可疑)。
我认为您只需执行两个指示即可执行斐波那契步骤:
xchg eax, ebx
add ebx, eax
如果eax
是f(n-1)
并且ebx
是f(n)