对于一个类项目,我们被要求创建一个Fibonacci序列程序。我正在使用Visual 2017运行我的程序(32位)。当我运行下面的程序时,一切都进行得很好,直到我尝试打印出序列中的第6个数字,5,(0,1,1,2,3,5)。没有超过第五个号码的输出到控制台。我正在使用来自WriteDec库的Irvine32过程来完成到控制台的写小数。
我被骗了,因为当我进入调试器模式时,eax寄存器保存正确的值,但是WriteDec不会打印出来。用于存储斐波纳契数字的数组的地址在计算序列的第八个项时具有以下值:0x00406000 00 00 00 00 01 00 00 00 01 00 00 00 02 00 00 00 03 00 00 00 05 00 00 00 08 00 00 00 0d 00 00 00
输出类似于:0 1 123
;Fibionacci Sequence
; This program outputs a fibonacci sequence and sum
Include Irvine32.inc
.data
array DWORD 0,1
.code
main proc
mov ecx, 6 ; would be the 8th term in the sequence
mov esi, 4
mov eax, 0
call WriteDec
call crlf
mov eax, 1
call WriteDec
call crlf
L1:
mov edx, array[esi]
mov edi, array[esi-4]
add edx,edi
mov array[esi+4],edx
mov eax, edx
call WriteDec ; Writes an unsigned 32-bit decimal number to standard output in decimal format with no leading zeros.
add esi,4
loop L1
invoke ExitProcess,0
main endp
end main发布于 2018-04-10 08:17:54
当您在为array DWORD 0,1保留的两个dword结束后编写时,您可能正在覆盖WriteDec使用的一些数据。
如何测试writedec是否覆盖数据?
你倒过来了。您的代码正在数组之外编写。链接器可能将其放在WriteDec 需要读取的某些数据之前,例如,控制台的文件句柄或其他东西。因此,在您踩下WriteDec常量之后,以后对它的调用将停止打印任何内容。
调试器输出确认WriteDec没有覆盖您存储的Fibonacci序列值,因此我们可以得出结论,WriteDec不是在写入该内存,而是读取它。
而且它不是一个指针,否则当用小整数覆盖它时,它就会崩溃。
试着做些像
array DWORD 0,1
DWORD 10 DUP(?) ; or DUP(0) because that's what you'll really get若要为前两个值使用显式初始值创建更大的数组,则同一节中要有更多空间。
https://stackoverflow.com/questions/49746846
复制相似问题