【问题标题】:Issue adding values in array x86问题在数组 x86 中添加值
【发布时间】:2016-11-15 17:35:24
【问题描述】:

我正在尝试获取一个数组,添加其中的所有值,然后显示它们。对我来说不幸的是,即使构建了以下代码,输出也不会返回我期望的值。

例如,有一次我运行它时,我得到了

-2112902102

还有一次我得到了

-1280521519

我假设这有某种逻辑,但它并不能完全帮助我。

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 之前弄清楚其余部分。

【问题讨论】:

  • 你没有调试器可以让你单步调试代码、检查寄存器等吗?
  • 是的,我愿意。但是,我现在在弄清楚它时遇到了一些小问题。
  • 问问自己这个问题——add 指令从[esi] 加载了多少数据以添加到ebp 中?提示:它不是一个字节...

标签: arrays assembly x86 irvine32


【解决方案1】:

正如您所暗示的,问题在于您添加的是双字而不是字节。简单的解决方案是在求和之前将字节符号扩展到临时寄存器中。那就是替换这个:

add ebp, [esi]

与:

movsx edx, byte ptr [esi]
add ebp, edx

当然,对于打印,您需要使用eax,因此将mov edx, ebp 更改为mov eax, ebp。或者你可以直接用它来做总结。

【讨论】:

  • 比我的解决方案好得多,效率更高,感谢您指出我的错误 (+1)。
  • 有一次我在考虑是否需要使用堆栈,尽管这给我带来了问题。感谢您向我展示我与最初的想法相差不远。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
相关资源
最近更新 更多