首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WriteDec在5次调用后停止工作,在循环中存储到数组?

WriteDec在5次调用后停止工作,在循环中存储到数组?
EN

Stack Overflow用户
提问于 2018-04-10 06:30:09
回答 1查看 869关注 0票数 0

对于一个类项目,我们被要求创建一个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

代码语言:javascript
复制
  ;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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-10 08:17:54

当您在为array DWORD 0,1保留的两个dword结束后编写时,您可能正在覆盖WriteDec使用的一些数据。

如何测试writedec是否覆盖数据?

你倒过来了。您的代码正在数组之外编写。链接器可能将其放在WriteDec 需要读取的某些数据之前,例如,控制台的文件句柄或其他东西。因此,在您踩下WriteDec常量之后,以后对它的调用将停止打印任何内容。

调试器输出确认WriteDec没有覆盖您存储的Fibonacci序列值,因此我们可以得出结论,WriteDec不是在写入该内存,而是读取它。

而且它不是一个指针,否则当用小整数覆盖它时,它就会崩溃。

试着做些像

代码语言:javascript
复制
array DWORD 0,1
  DWORD 10 DUP(?)       ;  or DUP(0)  because that's what you'll really get

若要为前两个值使用显式初始值创建更大的数组,则同一节中要有更多空间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49746846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档