Bob*_*Bob 4 x86 assembly masm irvine32
我创建了以下程序来读取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.输入第一个数字后我收到错误.
我相信这是由于我的数组中的索引存在问题,但我不确定问题出在哪里.任何和所有的帮助非常感谢!
当您使用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