【问题标题】:Value changes using mov from a register to an array使用 mov 从寄存器到数组的值更改
【发布时间】:2016-06-27 10:45:39
【问题描述】:

当我尝试将一个值从BX 寄存器移动到一个数组元素时,该值会完全改变。
例如,假设我的数组是 {0,4,4},SI 寄存器等于 1,并且 colorNum = 3 (colorNum 并且数组是都是字长)。

mov bx, [colorNum]
mov [arr + si], bx

接下来,我可以在调试器中看到数组现在是:{769,0,4}
我根本不知道出了什么问题,应该是这样:{0,3,4}

为了将正确的值移动到数组中,我应该改变什么?

【问题讨论】:

  • 如果每个元素都是 WORD,si 必须为 2 才能存储到第二个元素。你确定原来的数组不是{1, 4, 4}吗?这将解释{769,0,4}
  • 如果si 是正确的并且已经是2*index 怎么办?这是不可能的。

标签: arrays assembly x86


【解决方案1】:

表达式arr + si 等价于(char*)arr+1

假设word 的大小为2:使用mov [arr + si], bx,您将word 值写入数组第一个单元格的后半部分和数组第二个单元格的前半部分.

因此您需要将arr + si 替换为等效于(char*)arr+1*sizeof(word) 的表达式。

【讨论】:

  • arr + si*2 不是有效的 16 位寻址模式。由于问题有 assembly 标签,最好提供一些正确的汇编代码:)
  • @MargaretBloom:我同意,我最初只写了“你需要使用与(char*)arr+1*sizeof(word)等效的表达式”。我会回复的,谢谢你指出来......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 1970-01-01
  • 1970-01-01
  • 2015-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多