使用assembly循环访问数组并求元素的和

vhmi4jdf  于 2022-11-30  发布在  其他
关注(0)|答案(1)|浏览(176)

我是个汇编新手,我尝试迭代数组,找到和,然后把和放入eax。这是我目前为止的代码。

.data
    myArray db 1, 2, 3


.code
main PROC

    mov eax, 3      
    mov ebx, 0              
    mov esi, OFFSET myArray     

top: add ebx, [esi]

    add ecx, 1              
    dec eax                 
    jnz top                 

done:
    mov eax, ebx
    INVOKE ExitProcess, 0

我很确定我使用了错误的偏移量。当我调试程序时,ebx仍然是0,即使我添加了[esi]到它。就像我说的,我很确定我使用了错误的偏移量,但是关于如何修复它的任何提示,以便在每次迭代中将[esi]添加到ebx。当我在mov eax,ebx有断点时注册:EAX = 00000000电子采购交易= 00090603电子采购交易= 009B1008电子采购交易= 009B1005电子采购服务= 009B4000电子采购数据交换= 009B1005电子采购实施计划= 009B1025电子采购计划= 0082FE18电子采购业务计划= 0082FE24电子采购计划= 00000246

zzzyeukh

zzzyeukh1#

对于MASM风格的汇编程序,使用OFFSET是可以的,但是

  • 循环忘记将指针前进到下一个数组元素!也许add ecx, 1应该是add esi, 1
  • add ebx, [esi]指令将整个双字添加到EBX。

由于 myArray字节组成,因此需要扩展值
这两个错误都解释了为什么转储最后显示EBX = 00090603(00030201 h +00030201 h +00030201 h = 00090603 h)。

xor   eax, eax            ; Sum
  mov   ecx, 3
  mov   esi, OFFSET myArray
More:
  movzx edx, byte [esi]
  inc   esi                 ; Move to next byte
  add   eax, edx            ; Sum += Item
  dec   ecx
  jnz   More

因为最终你还是想在EAX中得到结果,所以在循环中也要加到EAX而不是EBX中。

相关问题