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