gpt4 book ai didi

程序集:数组写入问题

转载 作者:行者123 更新时间:2023-12-04 04:45:01 26 4
gpt4 key购买 nike

我创建了以下程序来读取 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 时带参数 ( ..., wArray:PTR WORD, arraySize : WORD ) MASM 自动插入一个序言和一个尾声,并根据该序言计算参数的地址。

当您添加第二个序言时:

push ebp
mov ebp, esp
EBP将被更改,参数的计算基础将被破坏。特别 ECX获得可笑的高值。

删除您的序言和结语:
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

关于程序集:数组写入问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34192122/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com