Arrays 在数组x86中添加值时出现问题
我尝试获取一个数组,添加其中的所有值,然后显示它们。不幸的是,即使生成了以下代码,输出也没有返回我期望的值 例如,有一次我运行它时 -211290202 还有一次我 -1280521519 我想这是有逻辑的,但这对我没有帮助Arrays 在数组x86中添加值时出现问题,arrays,assembly,x86,irvine32,Arrays,Assembly,X86,Irvine32,我尝试获取一个数组,添加其中的所有值,然后显示它们。不幸的是,即使生成了以下代码,输出也没有返回我期望的值 例如,有一次我运行它时 -211290202 还有一次我 -1280521519 我想这是有逻辑的,但这对我没有帮助 INCLUDE Irvine32.inc .386 .stack 4096 ExitProcess proto,dwExitCode:dword .data array SBYTE 26, -81, -104, -57 total_sum SWORD ? .code
INCLUDE Irvine32.inc
.386
.stack 4096
ExitProcess proto,dwExitCode:dword
.data
array SBYTE 26, -81, -104, -57
total_sum SWORD ?
.code
main proc
mov esi, OFFSET array
mov ecx, LENGTHOF array
mov total_sum, 0
mov ebp,0
L1:
add ebp, [esi]
inc esi
loop L1
mov edx, ebp
call WriteInt
invoke ExitProcess,0
main endp
end main
是的,我知道total_sum在这一点上没有任何作用,但我首先想在实现total_sum之前解决其余问题。正如您所暗示的,问题是您添加了DWORD而不是字节。简单的解决方案是在求和之前将字节扩展到临时寄存器中。这就是:
add ebp, [esi]
与:
当然,对于打印,您需要使用
eax
,因此将mov-edx,ebp
更改为mov-eax,ebp
。或者你可以直接用它来做总结。你没有一个调试器可以让你单步执行代码、检查寄存器等吗?是的,我有。然而,我现在在弄清楚它时遇到了一些小问题。问问你自己,会从[esi]
添加多少数据到ebp
?提示:它不是一个字节…比我的解决方案好得多,效率更高,感谢您指出我的错误(+1)。有一次我在考虑是否需要使用堆栈,尽管这会给我带来问题。谢谢你告诉我,我离我最初的想法没有那么远。
movsx edx, byte ptr [esi]
add ebp, edx