当前位置:  开发笔记 > 编程语言 > 正文

汇编:数组编写问题

如何解决《汇编:数组编写问题》经验,为你挑选了1个好方法。

我创建了以下程序来读取5个数字,然后dumpreg查看输入的数字...

        INCLUDE Irvine32.inc

    .data
    count = 5
    scores WORD count DUP(? )
    prompt BYTE "Please type an integer score: ", 0

    .code
    GetScores PROTO, wArray:PTR WORD, arraySize : WORD

    main proc


    INVOKE GetScores,OFFSET scores, count

    mov esi, OFFSET scores
    mov ecx, count
    mov ebx, 2
    call DumpMem
    mov eax, 50000
    call Delay

    exit
    main endp

    GetScores PROC, wArray:PTR WORD, arraySize : WORD
    push ebp
    mov ebp, esp
    pushad

    mov esi, wArray
    movzx ecx, arraySize
    cmp ecx, 0; ECX < 0 ?
    jle L2; yes: skip over loop
    L1 :
call ReadInt
mov[esi], eax
add esi, TYPE WORD
loop L1

L2 : popad
    pop ebp
    ret 8
    GetScores ENDP

    END main

这是我第一次使用堆栈参数,Exception thrown at 0x0040365A in Project.exe: 0xC0000005: Access violation writing location 0x0040361C.输入第一个数字后我收到错误.

我相信这是由于我的数组中的索引存在问题,但我不确定问题出在哪里.任何和所有的帮助非常感谢!



1> rkhb..:

当您使用PROCwith参数(..., wArray:PTR WORD, arraySize : WORD)时,MASM会自动插入prolog和epilog,并根据该prolog计算参数的地址.

当你添加第二个序言:

push ebp
mov ebp, esp

EBP将被更改,参数的计算基础将被销毁.特别是ECX获得了荒谬的高价值.

删除你的prolog和epilog:

GetScores PROC STDCALL, wArray:PTR WORD, arraySize : WORD
;    push ebp               ; superfluous and harmful prolog
;    mov ebp, esp
    pushad

    mov esi, wArray
    movzx ecx, arraySize
    cmp ecx, 0              ; ECX < 0 ?
    jle L2                  ; yes: skip over loop

    L1 :
    call ReadInt
    mov[esi], eax
    add esi, TYPE WORD
    loop L1

    L2 :
    popad
;    pop ebp                ; superfluous epilog
    ret                     ; becomes `ret 8` due to "STDCALL" in the PROC header
GetScores ENDP

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有